赞
踩
大三马上就进入尾声了,这次的小学期也算是不负所望,比较有意思,学到了许多东西。
接下来就展开说说,首先是对arm开发板的认识,再到和VM虚拟机Linux的交互操作,最后是钢琴小项目的完成过程。
A:A8(GEC210)单核,A53(GEC6818)八核
R:面向实时性的一些产品
M:M3,M4
1.GEC6818开发平台,核心板采用10层板工艺设计,确保稳定可靠。
2.该平台搭载三星Cortex-A53系列高性能八核处理器S5P6818,最高主频高达1.4GHz。
3.开发板留有丰富的外设,支持千兆以太网、板载LVDS接口、MIPI接口、USB接口等。
4.可应用于嵌入式Linux和Android等操作系统的驱动、应用开发。
5.搭载7.0英寸LCD屏支持32位真彩色,触摸屏使用电容屏触点多达1,536,000个以上
设备 | 备注 |
GEC6818 | 开发平台 |
母对母串口线 | 与电脑通信 |
电源线 | 提供电源 |
安卓USB | 烧写系统 |
网线 | 开发板联网 |
USB转串口线 | 与电脑通信 |
secureCRT | 终端仿真程序 |
CH340 | USB转串口驱动 |
万万没想到这个过程也会出问题,由于今年换了新电脑,出厂就是win11的系统,对老师给的虚拟机不兼容,这个时候就会出现电脑一直重启的过程。最后下载了最新的 版本得以解决(但又由于序列号的问题最后选择了试用30天,这个倒是无伤大雅)
2、(1)安装usb转串口的驱动
(2)安装secureCRT超级终端软件
每一个不同的平台可执行程序的格式都不尽相同,我们需要在搭载Linux的ARM平台执行程序,故需要使用arm-linux交叉编译工具
普通编译:gcc 源程序 -o 目标文件 gcc:编译工具
交叉编译:arm-linux-gcc 源程序 -o 目标文件 -o:生成可执行文件
1、使用C语言编写项目源代码
2、使用交叉编译工具编译项目源码
3、将编译生成的可执行程序下载到ARM开发板
4、在ARM开发板执行项目程序
5、验证项目程序的准确性
【注】传送文件到开发板的两种方法:
方法一:
[root@GEC6818 /]#mkdir 文件名
[root@GEC6818 /]#cd 文件名/
[root@GEC6818 /文件名]#ls
[root@GEC6818 /文件名]#rx 传输文件名 (传输---发送Xmode)
CCCCCC
开始 xmodem 传输。 按 Ctrl+C 取消。
100% 5 KB 5 KB/s 00:00:01 0 Errors
方法二:(最常用)
[root@GEC6818 /文件名]#rx 传输文件名 (用鼠标直接拖进来)
CCCC
开始 xmodem 传输。 按 Ctrl+C 取消。
100% 5 KB 5 KB/s 00:00:01 0 Errors
代码如下:
- #include <stdio.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #include <unistd.h>
-
- int main()
- {
- //定义一个lcd的buf
- int buf[800*480] = {2};
- int black = 000000;
- int red = FF0000;
- int yellow = FFFF00;
-
- //写LCD
- int x;//x表示横轴
- int y;//y表示纵轴
-
- for(y=0;y<160;y++)
- {
- for(x=0;x<800;x++)
- {
- buf[y*800+x] = black;
- }
- }
- for (y = 160; y < 320; y++)
- {
- for (x = 0; x < 800; x++)
- {
- buf[y * 800 + x] = red;
- }
- }
- for (y = 320; y < 480; y++)
- {
- for (x = 0; x < 800; x++)
- {
- buf[y * 800 + x] = yellow;
- }
- }
- //写LCD
- write(fd,buf,800*480*4);
-
- //关闭文件
- close(fd);
-
- return 0;//正常退出
- }

输出结果如下图:
- #include <stdio.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #include <unistd.h>
- #include <sys/mman.h>
-
- int main()
- {
- int fd;
- fd = open("/dev/fb0",O_RDWR);
- if(fd<0)
- {
- printf("open icd fail");
- return -1;
- }
-
- //lcd映射(效率高)
- int *addr;
- addr = mmap(NULL,
- 800*480*4, //长度
- PROT_READ|PROT_WRITE, //权限
- MAP_SHARED, //标志量
- fd, //文件描述符
- 0 //偏移量
- );
-
- int red=0x00ff0000;
- int green=0x0000ff00;
- int blue=0x000000ff;
- int black=0x00000000;
- int white=0x00ffffff;
- int gold=0x00FFD700;
- int fen = 0x00ff80c0;
-
-
-
- int color[]={green,red,blue,fen,black,gold};
- int c1=1,c2=0;
- int x,y;
- int a=400,b=240,r=50;
- int m=3,n=6; //移动速度
- int a1 = 600,b1 = 300,r1 = 80;//一大一小两球
- int m1=3,n1=6;
-
-
- while(1)
- {
- for(y=0;y<480;y++)
- {
- for(x=0;x<800;x++)
- {
- //背景色
- *(addr+y*800+x)=white;
-
- //圆1
- if((x-a)*(x-a)+(y-b)*(y-b)<=r*r)
- *(addr+y*800+x)=color[c1];
- //圆2
- if((x-a1)*(x-a1)+(y-b1)*(y-b1)<=r1*r1)
- *(addr+y*800+x)=color[c2];
-
- }
- }
- //颜色循环
- if(c1>5)c1=0;
- if(c2>5)c2=0;
- //圆1反弹
- a+=m,b+=n;
- if(a>800-r || a<r)
- {
- m=0-m;
- c1++;
- }
- if(b>480-r || b<r)
- {
- n=0-n;
- c1++;
- }
-
- //圆2反弹
- a1+=m1,b1+=n1;
- if(a1>800-r1 || a1<r1)
- {
- m1=0-m1;
- c2++;
- }
- if(b1>480-r1 || b1<r1)
- {
- n1=0-n1;
- c2++;
- }
-
- if((a1-a)*(a1-a)+(b1-b)*(b1-b)<=(r1+r)*(r1+r))
- {
- //两球相碰反弹
- m=0-m;n=0-n;
- m1=0-m1;n1=0-n1;
- c1++;
- c2++;
-
- }
-
- }
-
- close(fd);
- return 0;
-
- }

输出要求及效果图如下:
BMP简述:全称Bitmap是Windows操作系统中的标准图像文件格式,可以分成两类:设备相关位图(DDB)和设备无关位图(DIB),使用非常广。它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP文件所占用的空间很大。BMP文件的图像深度可选lbit、4bit、8bit及24bit。BMP文件存储数据时,图像的扫描方式是按从左到右、从下到上的顺序。
采用BMP格式图片的优点是我们可以很方便的得到图片像素数据,而使用JPG/JPEG格式图片则需要先解压图像数据后才可得到图像的像素数据。
- #include <stdio.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #include <unistd.h>
- #include <sys/mman.h>
-
- int show_bmp(int *addr,char *bmp_path)
- {
- //打开一张bmp图
- int fd_bmp;
- fd_bmp = open(bmp_path,O_RDWR);
- if(fd_bmp < 0)
- {
- printf("open bmp fail\n");
- return -1;//异常退出
- }
-
- //去除掉bmp图片的头54个字节
- lseek(fd_bmp,54,SEEK_SET);
-
- char buf_bmp[800*480*3];
- //读取bmp图
- read(fd_bmp,buf_bmp,800*480*3);
-
-
- //写LCD
- int x;//x表示横轴
- int y;//y表示纵轴
-
- for(y=0;y<480;y++)
- {
- for(x=0;x<800;x++)
- {
- *(addr+(479-y)*800+x) = buf_bmp[(y*800+x)*3] |(buf_bmp[(y*800+x)*3+1]<<8) |(buf_bmp[(y*800+x)*3+2]<<16);
-
- }
- }
-
- close(fd_bmp);
-
- return 0;
- }
-
- int main()
- {
- //打开LCD
- int fd_lcd;
- fd_lcd = open("/dev/fb0",O_RDWR);
- if(fd_lcd < 0)
- {
- printf("open lcd fail\n");
- return -1;//异常退出
- }
-
- //lcd的映射
- int *addr;
- addr = mmap(NULL,800*480*4, PROT_READ|PROT_WRITE,MAP_SHARED,fd_lcd,0);
- if(addr == NULL)
- {
- printf("mmap fail\n");
- return -1;
- }
-
- show_bmp(addr,"1.bmp");//第一张
-
- show_bmp(addr,"2.bmp");//第二张
-
- show_bmp(addr,"3.bmp");//第三张
-
- //lcd的映射的释放
- munmap(addr,800*480*4);
-
- //关闭文件
- close(fd_lcd);
-
-
- return 0;//正常退出
- }

输出效果图如下:
项目要求:可以正常弹奏,可以做出物理按键的key_on和key_off的区别,好的UI设计。
这是最后一个项目,需要用到jpg图片,所以需要对于基础知识安装jpg库有一定要求(具体安装步骤如有疑问可在评论区留言);mp3文件的拖入以及UI设计,参考网上的代码进行整体架构。
(小插曲)由于LIinux虚拟机里都安装成功了,ls下也都齐全,我就默认开发板也有jpg库,忘记最后一步在开发板拖入libjpeg.so.9导致一直不知道问题出在哪里。
代码如下:(黑键有一些小问题,因为白键有key_on和key_off的两种显示,对应的jpg图片和像素点都是算好的,而黑键在两个白键中间,虽然也可以显示可以弹奏,但就像没有设置优先级一样,没办法将黑键永远置顶以至于一按周围的白键,黑键就会消失,再按一次可以显示。试了很多种方法都不行,算是一个小小的遗憾吧,答辩的时候只能将此作为一个按键的不同表现形式。)
- #include <stdio.h>
- #include "lcdjpg.h"
- #include <stdio.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #include <unistd.h>
- #include <linux/input.h>
- #include <stdlib.h>
-
- int fd;
- int get_xy(int *x,int *y)
- {
- struct input_event ts;
- while(1)
- {
- //读触摸屏
- read(fd,&ts,sizeof(struct input_event));
- if(ts.type==EV_ABS&&ts.code==ABS_X)
- {
- *x= ts.value*800/1024;
- //printf("x=%d ",ts.value*800/1024);//x轴的坐标(黑色触摸屏)1024*600
- //printf("x=%d ",ts.value);//x轴的坐标(蓝色触摸屏)800*480
- }
- if(ts.type==EV_ABS&&ts.code==ABS_Y)
- {
- *y=ts.value*480/600;
- //printf("y=%d\n",ts.value*480/600);//y轴的坐标(黑色触摸屏)
- //printf("y=%d\n",ts.value);//y轴的坐标(蓝色触摸屏)
- }
-
- if(ts.type==EV_KEY&&ts.code==BTN_TOUCH&&ts.value == 1)//按下 0表示松手
- {
- //printf("按下去 x=%d y=%d\n",x,y);
- break;
- }
- }
- }
-
- int main()
- {
- //打开触摸屏
- //int fd;
- fd = open("/dev/input/event0",O_RDWR);
- if(fd < 0)
- {
- printf("open ts fail\n");
- return -1;
-
- }
- lcd_draw_jpg(0,0,"./background.jpg",NULL,0,0);
- lcd_draw_jpg(233,350,"./logo.jpg",NULL,0,0);
- lcd_draw_jpg(0,0,"./bar.jpg",NULL,0,0);
- lcd_draw_jpg(60,48,"./key_off.jpg",NULL,0,0);
- lcd_draw_jpg(111,48,"./black1.jpg",NULL,0,0);
- lcd_draw_jpg(128,48,"./key_off.jpg",NULL,0,0);
-
- lcd_draw_jpg(179,48,"./black1.jpg",NULL,0,0);
- lcd_draw_jpg(196,48,"./key_off.jpg",NULL,0,0);
- lcd_draw_jpg(264,48,"./key_off.jpg",NULL,0,0);
- lcd_draw_jpg(315,48,"./black1.jpg",NULL,0,0);
- lcd_draw_jpg(332,48,"./key_off.jpg",NULL,0,0);
-
- lcd_draw_jpg(383,48,"./black1.jpg",NULL,0,0);
- lcd_draw_jpg(400,48,"./key_off.jpg",NULL,0,0);
-
- lcd_draw_jpg(468,48,"./key_off.jpg",NULL,0,0);
- lcd_draw_jpg(519,48,"./black1.jpg",NULL,0,0);
- lcd_draw_jpg(536,48,"./key_off.jpg",NULL,0,0);
-
- lcd_draw_jpg(587,48,"./black1.jpg",NULL,0,0);
- lcd_draw_jpg(604,48,"./key_off.jpg",NULL,0,0);
-
- lcd_draw_jpg(655,48,"./black1.jpg",NULL,0,0);
- lcd_draw_jpg(672,48,"./key_off.jpg",NULL,0,0);
-
-
- int x=0,y=0;
- while(1)
- {
- get_xy(&x,&y);
- printf("x=%d y=%d\n",x,y);
- //白键定位区域
- if(x>60&&x<128&&y>48&&y<328)
- {
- system("killall -SIGKILL madplay");
-
- system("madplay d3.mp3&");
- if(x>60&&x<128)
- lcd_draw_jpg(60,48,"./key_on.jpg",NULL,0,0);
- sleep(0.8);
- lcd_draw_jpg(60,48,"./key_off.jpg",NULL,0,0);
- }
-
- if(x>128&&x<196&&y>48&&y<328)
- {
- system("killall -SIGKILL madplay");
-
- system("madplay d4.mp3&");
- if(x>128&&x<196)
- lcd_draw_jpg(128,48,"./key_on.jpg",NULL,0,0);
- sleep(0.8);
- lcd_draw_jpg(128,48,"./key_off.jpg",NULL,0,0);
- }
-
- if(x>196&&x<264&&y>48&&y<328)
- {
- system("killall -SIGKILL madplay");
-
- system("madplay d5.mp3&");
- if(x>196&&x<264)
- lcd_draw_jpg(196,48,"./key_on.jpg",NULL,0,0);
- sleep(0.8);
- lcd_draw_jpg(196,48,"./key_off.jpg",NULL,0,0);
- }
-
- if(x>264&&x<332&&y>48&&y<328)
- {
- system("killall -SIGKILL madplay");
-
- system("madplay d6.mp3&");
- if(x>264&&x<332&&x>315&&x<344)
- lcd_draw_jpg(264,48,"./key_on.jpg",NULL,0,0);
- sleep(0.8);
- lcd_draw_jpg(264,48,"./key_off.jpg",NULL,0,0);
- }
-
- if(x>332&&x<400&&y>48&&y<328)
- {
- system("killall -SIGKILL madplay");
-
- system("madplay d7.mp3&");
- if(x>332&&x<400)
- lcd_draw_jpg(332,48,"./key_on.jpg",NULL,0,0);
- sleep(0.8);
- lcd_draw_jpg(332,48,"./key_off.jpg",NULL,0,0);
- }
-
- if(x>400&&x<468&&y>48&&y<328)
- {
- system("killall -SIGKILL madplay");
-
- system("madplay d8.mp3&");
- if(x>400&&x<460)
- lcd_draw_jpg(400,48,"./key_on.jpg",NULL,0,0);
- sleep(0.8);
- lcd_draw_jpg(400,48,"./key_off.jpg",NULL,0,0);
- }
-
- if(x>468&&x<536&&y>48&&y<328)
- {
- system("killall -SIGKILL madplay");
-
- system("madplay d9.mp3&");
- if(x>468&&x<536)
- lcd_draw_jpg(468,48,"./key_on.jpg",NULL,0,0);
- sleep(0.8);
- lcd_draw_jpg(468,48,"./key_off.jpg",NULL,0,0);
- }
-
- if(x>536&&x<604&&y>48&&y<328)
- {
- system("killall -SIGKILL madplay");
-
- system("madplay d10.mp3&");
- if(x>536&&x<604)
- lcd_draw_jpg(536,48,"./key_on.jpg",NULL,0,0);
- sleep(0.8);
- lcd_draw_jpg(536,48,"./key_off.jpg",NULL,0,0);
- }
-
- if(x>604&&x<672&&y>48&&y<328)
- {
- system("killall -SIGKILL madplay");
-
- system("madplay d11.mp3&");
- if(x>604&&x<672)
- lcd_draw_jpg(604,48,"./key_on.jpg",NULL,0,0);
- sleep(0.8);
- lcd_draw_jpg(604,48,"./key_off.jpg",NULL,0,0);
- }
-
- if(x>672&&x<740&&y>48&&y<328)
- {
- system("killall -SIGKILL madplay");
-
- system("madplay d12.mp3&");
- if(x>672&&x<740)
- lcd_draw_jpg(672,48,"./key_on.jpg",NULL,0,0);
- sleep(0.8);
- lcd_draw_jpg(672,48,"./key_off.jpg",NULL,0,0);
- }
-
- //黑键1
- if(x>111&&x<145&&y>48&&y<258)
- {
- system("killall -SIGKILL madplay");
-
- system("madplay d1.mp3&");
- if(x>111&&x<145)
- lcd_draw_jpg(111,48,"./black.jpg",NULL,0,0);
-
- lcd_draw_jpg(111,48,"./black1.jpg",NULL,0,0);
- }
- //黑键2
- if(x>179&&x<213&&y>48&&y<258)
- {
- system("killall -SIGKILL madplay");
-
- system("madplay d2.mp3&");
- if(x>179&&x<213)
- lcd_draw_jpg(179,48,"./black.jpg",NULL,0,0);
-
- lcd_draw_jpg(179,48,"./black1.jpg",NULL,0,0);
- }
- //黑键3
- if(x>315&&x<349&&y>48&&y<258)
- {
- system("killall -SIGKILL madplay");
-
- system("madplay d1.mp3&");
- if(x>315&&x<349)
- lcd_draw_jpg(315,48,"./black.jpg",NULL,0,0);
-
- lcd_draw_jpg(315,48,"./black1.jpg",NULL,0,0);
- }
- //黑键4
- if(x>383&&x<417&&y>48&&y<258)
- {
- system("killall -SIGKILL madplay");
-
- system("madplay d2.mp3&");
- if(x>383&&x<417)
- lcd_draw_jpg(383,48,"./black.jpg",NULL,0,0);
-
- lcd_draw_jpg(383,48,"./black1.jpg",NULL,0,0);
- }
- //黑键5
- if(x>519&&x<553&&y>48&&y<258)
- {
- system("killall -SIGKILL madplay");
-
- system("madplay d1.mp3&");
- if(x>519&&x<553)
- lcd_draw_jpg(519,48,"./black.jpg",NULL,0,0);
-
- lcd_draw_jpg(519,48,"./black1.jpg",NULL,0,0);
- }
- //黑键6
- if(x>587&&x<621&&y>48&&y<258)
- {
- system("killall -SIGKILL madplay");
-
- system("madplay d2.mp3&");
- if(x>587&&x<621)
- lcd_draw_jpg(587,48,"./black.jpg",NULL,0,0);
-
- lcd_draw_jpg(587,48,"./black1.jpg",NULL,0,0);
- }
- //黑键7
- if(x>655&&x<689&&y>48&&y<258)
- {
- system("killall -SIGKILL madplay");
-
- system("madplay d1.mp3&");
- if(x>655&&x<689)
- lcd_draw_jpg(655,48,"./black.jpg",NULL,0,0);
-
- lcd_draw_jpg(655,48,"./black1.jpg",NULL,0,0);
- }
-
-
- }
-
-
- //关闭触摸屏
- close(fd);
- return 0;
- }
-
-
- /*
- 编译的方法: arm-linux-gcc *.c -o main -I./libjpeg -L./libjpeg -ljpeg
- */

UI设计如下:
目录
(1)以德国国旗的样式颜色为例(无不良引导和个人逾矩及不尊重他国行为)
效果展示如下:
这就是这次的所有分享了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。