大三马上就进入尾声了,这次的小学期也算是不负所望,比较有意思,学到了许多东西。

接下来就展开说说,首先是对arm开发板的认识,再到和VM虚拟机Linux的交互操作,最后是钢琴小项目的完成过程。

一、arm开发板简述

A:A8(GEC210)单核,A53(GEC6818)八核

R:面向实时性的一些产品

M:M3,M4

函数详解
http://【金山文档】 函数详解 https://kdocs.cn/l/cqWbx504NxuN

1.GEC6818开发平台,核心板采用10层板工艺设计,确保稳定可靠。

2.该平台搭载三星Cortex-A53系列高性能八核处理器S5P6818,最高主频高达1.4GHz

3.开发板留有丰富的外设,支持千兆以太网、板载LVDS接口、MIPI接口、USB接口等。

4.可应用于嵌入式LinuxAndroid等操作系统的驱动、应用开发。

5.搭载7.0英寸LCD屏支持32位真彩色,触摸屏使用电容屏触点多达1,536,000个以上

设备清单

设备 备注
GEC6818 开发平台
母对母串口线 与电脑通信
电源线 提供电源
安卓USB 烧写系统
网线 开发板联网
USB转串口线 与电脑通信
secureCRT 终端仿真程序
CH340 USB转串口驱动

二、具体步骤

1、安装VMware和Ubuntu

万万没想到这个过程也会出问题,由于今年换了新电脑,出厂就是win11的系统,对老师给的虚拟机不兼容,这个时候就会出现电脑一直重启的过程。最后下载了最新的 版本得以解决(但又由于序列号的问题最后选择了试用30天,这个倒是无伤大雅)

2、(1)安装usb转串口的驱动
      (2)安装secureCRT超级终端软件

2、交叉编译:

每一个不同的平台可执行程序的格式都不尽相同,我们需要在搭载Linux的ARM平台执行程序,故需要使用arm-linux交叉编译工具

普通编译:gcc 源程序 -o 目标文件  gcc:编译工具

交叉编译:arm-linux-gcc 源程序 -o  目标文件  -o:生成可执行文件

3、项目开发流程:

1、使用C语言编写项目源代码

2、使用交叉编译工具编译项目源码

3、将编译生成的可执行程序下载到ARM开发板

4、在ARM开发板执行项目程序

5、验证项目程序的准确性

三、项目作业总结:

(1)以德国国旗的样式颜色为例(无不良引导和个人逾矩及不尊重他国行为)

【注】传送文件到开发板的两种方法:

方法一:
[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的bufint buf[800*480] = {2};int black = 000000;int red = FF0000;int yellow = FFFF00;//写LCDint 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;}}//写LCDwrite(fd,buf,800*480*4);//关闭文件close(fd);return 0;//正常退出
}

输出结果如下图:

(2)球球大作战,动态的小球碰撞,此处以两个小球为例:

#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;//圆1if((x-a)*(x-a)+(y-b)*(y-b)<=r*r)*(addr+y*800+x)=color[c1];//圆2if((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;}

输出要求及效果图如下:

 

(3)BMP图片的轮播输出(此处以三张照片为例)

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);//写LCDint 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()
{//打开LCDint 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;//正常退出
}

输出效果图如下:

(4)小钢琴制作

项目要求:可以正常弹奏,可以做出物理按键的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);}//黑键1if(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);}//黑键2if(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);}//黑键3if(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);}//黑键4if(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);}//黑键5if(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);}//黑键6if(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);}//黑键7if(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设计如下:

目录

一、arm开发板简述

设备清单

二、具体步骤

1、安装VMware和Ubuntu

2、交叉编译:

3、项目开发流程:

三、项目作业总结:

(1)以德国国旗的样式颜色为例(无不良引导和个人逾矩及不尊重他国行为)

(2)球球大作战,动态的小球碰撞,此处以两个小球为例:

(3)BMP图片的轮播输出(此处以三张照片为例)

(4)小钢琴制作


效果展示如下:

这就是这次的所有分享了。

基于ARM开发板的嵌入式项目设计(C完整代码)相关推荐

  1. 基于ARM开发板搭建物联网服务器

    基于ARM开发板搭建物联网服务器 一.项目需求 1.1设备需求 1.2知识需求 1.3项目介绍 二.开发环境搭建 2.1阿里云服务器配置 2.2虚拟机交叉编译环境搭建 2.3下载相关应用压缩文件 三. ...

  2. 基于ARM开发板GEC6818的电子相册项目

    项目技术简介 本项目主要是基于ARM开发板GEC6818,使用Linux平台进行代码的编写和交叉编译. 项目主要通过freambuffer帧缓存驱动来进行图片以及对应字库的显示. 项目功能 实现滑动解 ...

  3. 基于ARM开发板的简单串口服务器

    串口服务器是为RS-232/485/422串口到TCP/IP网络之间完成数据转换的通讯接口转换器.提供RS-232/485/422终端串口与TCP/IP网络的数据双向透明传输,提供串口转网络功能,RS ...

  4. 飞翔的小鸟游戏基于arm开发板制作

    在arm开发板上主要基于C语言 虚拟机的使用 .而在操作一个系统必须的 三大步骤 1.open 函数  打开文件         #include <sys/types.h>       ...

  5. 基于 ARM 开发板的 UnixBench 测试

    在之前的文章中,有介绍过使用 UnixBench 给 Linux 服务器进行性能的基准测试,但是使用那篇文章中的 UnixBench 脚本安装的 UnixBench 工具并不支持 ARM 平台. 最近 ...

  6. 基于ARM开发板的智能家居控制系统设计

    本文章设计流程可以作为视频讲解的补充 视频链接:智能家居控制系统 一.硬件介绍: 1.ARM A53开发板 2.显示触摸屏(800 X 480) 3.蓝牙模块(HC-08,串口通信) 4.电话模块(G ...

  7. 基于ARM开发板或linux工控机的远程操作的小结

    需求: (1).黑龙江现场A处有一个一直在执行任务的工控机(或ARM板),该板子处在一个局域网192.xxx.2.1网段,局域网可以联网: (2).本地为深圳的C处,网络处在2.1网段:需求就是C处远 ...

  8. 基于arm开发板在ubuntu18.04系统上编译vlc播放器

    前言 VLC 是一款自由.开源的跨平台多媒体播放器及框架,可播放大多数多媒体文件,以及 DVD.音频 CD.VCD 及各类流媒体协议.接下来将通过vlc源码进行编译 环境 arm64开发硬件 ubun ...

  9. 在ARM开发板的嵌入式linux系统上运行的QT程序,必须得要在linux里用QT编吗

    https://blog.csdn.net/weixin_36060730/article/details/78359300

  10. 在ARM开发板上实现LCD+USB键盘

    一.LCD驱动 这个地方先留着 二.USB键盘驱动 在linux内核里边提供了usbkbd.c可以直接借助这个模块,编译生成驱动模块加载进内核,其实对于驱动程序,这里还不是重点,最后想要实现的是直接在 ...

最新文章

  1. ELK 5.x日志分析 (二) Elasticserach 5.2 安装
  2. 数据结构与算法:11 Leetcode同步练习(四)
  3. @javax.inject.Inject,新的注入依赖规范
  4. C++的运算符重载(转)
  5. python获取钉钉日志数据_python3实现zabbix告警推送钉钉的示例
  6. java实现rabbitMQ延时队列详解以及spring-rabbit整合教程
  7. IIS搭建网站遇到的问题
  8. 【英语学习】【WOTD】animadversion 释义/词源/示例
  9. java nio 思维导图
  10. android计算器括号,计算器(一)——加减和括号
  11. pythonhistogram教程_Plot Histogram in Python
  12. IRF(智能弹性架构)
  13. Svn修改自己已经提交的备注
  14. git send-email 时unknown AUTH解决方法
  15. jQuery二维码生成
  16. 怎样在手机中将PPT转换成PDF
  17. 赛博朋克宣言1993_赛博朋克2077和未来武器
  18. javascript 关于年龄计算
  19. 【行为管理篇】01. 恢复出厂及登录 ❀ 深信服上网行为管理
  20. java打印等腰三角形

热门文章

  1. 电脑重置,win10怎么重置此电脑 重置电脑的方法和后果
  2. vue 脚手架启动html,vue脚手架项目创建步骤详解
  3. 查看电脑安装的Office是32位还是64位的
  4. 【其他】VirtualBox压缩磁盘占用空间
  5. excel2019批量删除空白行的方法
  6. css3学习之文字展示多余的用三个点显示
  7. H3C s5820v2 堆叠2台机器配置说明
  8. linux消息分发机制,RabbitMQ消息分发轮询和Message Acknowledgment
  9. 深度Team Building
  10. 求助:ACM剑气算法