基于S3C2451裸机开发的电子相册
来源:互联网 发布:南风知我意叶小意txt 编辑:程序博客网 时间:2024/05/29 13:48
学习S3C2451也有一段时间了,对于ARM9裸机开发也有了一点了解,这次做了一个基于ARM9裸机开发的电子相册,其中也遇到了一些问题,最终都通过各种方法解决了,现也将之记录,给后人一个借鉴。
这次电子相册开发使用的是广州友善之臂的Mini2451开发板,内置三星公司的S3C2451芯片,对于该芯片的用法在前几篇博文中已介绍过了,有兴趣的朋友可以翻阅前几篇博客,本人将所有的函数封装都已经发布了。
介绍一下此次电子相册的功能和使用到的芯片功能:
ARM9端:
四个按键,key1键返回主界面,key2键开启自动切换功能,key3键切换上一张图片,key4键切换下一张图片。这四个按键是相册的基本功能,除此之外,主界面可以显示时钟(通过上位机校准时间),主界面10秒钟未操作将进入屏保模式,两个LED灯每隔1秒闪烁,这三个功能都是通过RTC时钟实现的,使用了TICK中断。
这里遇到的主要问题是怎么实现上一张和下一张的切换,将图片通过取模软件取模后,生成了10个数组,然后定义一个指针数组,将这10个图片数组的指针存放进来,通过遍历实现了自动切换相册功能。在实现上一张和下一张的时候,想了一会,最后我定义了一个全局变量sp,上一张播放解释sp++,然后sp%10,最后图片显示,这样就完成了上一张图片的切换,下一张就是sp--。
PC端:
PC端有一个上位机,可以通过串口控制下位机开启相册、关闭相册、上一张和下一张切换图片、同步校准时钟、自动切换轮换时间的设置、字幕开启关闭等。详细功能请看下图:
PC端上位机的编写和介绍将会在后文中详细介绍,上位机可以使用QT或者C#编写,这里只是对上位机的运用,只需要知道上位机每个按键给串口发送的指令即可:
这些指令可以通过虚拟串口查看出来,指令中是自己定义的收发协议包,通过开启相册指令讲解一下协议:
开启相册 FE03F10101EF 首先是包头FE和包尾EF,03是数据的长度,F1 01 01则是开启相册的指令。
说一下这个上位机控制下位机遇到的困难:
1、首先是对数据的接收控制,这方面以前没怎么遇到,后来找了一个模板实现了数据的接收:
int start = 0;{recv_data = UART_RecvData(UART0);if(start != 0 && recv_data != 0xEF)//如果已收到包头并且当前收到的不是包尾{buf[start-1]=recv_data;//缓存数据start++;}else if(start!=0&&recv_data==0xEF)//如果收到包尾{start=0;if(buf[1] == 0x3 && buf[3] == 0xf1 && buf[5] == 0x1 && buf[7] == 0x1){......}......}else if(recv_data==0xFE&&start==0)//如果收到的是包头start++;UFCON0 |= 0x1;//使能FIFOUFCON0 |= 0x2;//Rx FIFO 复位UFCON0 &= ~0x2;//Rx FIFO 正常IRQ_ClearSRCPND(INT_UART0);IRQ_ClearSUBSRCPND(SUBINT_RXD0);}这样就实现了数据的接收,可以对数据进行解析判断。
2、串口接收缓存溢出,每次上位机发送了9-10次数据之后就突然发现上位机这个时候没有作用了,无论按什么都没反应,这个问题检查思考了很久,最终发现串口接收缓存溢出了,没有将缓存清空。我最终的解决办法是:
#define UFCON0(*(volatile unsigned long*)0x50000008)UFCON0 |= 0x1;//使能FIFOUFCON0 |= 0x2;//Rx FIFO 复位UFCON0 &= ~0x2;//Rx FIFO 正常这里的关键就是UFCON这个寄存器,这个寄存器可以对接收数据的缓存清空,具体信息:
3、第三个遇到的困难就是时间的校准,时钟配置的寄存器需要填入的是BCD数据,例如:17年 填入的是0X17,但是上位机给我发送的数据是0X11,前者是BCD,后者是十六进制,所以我在接收到时钟校准数据的时候,需要对数据进行一个转换。这两个数据其实是有规律的:
十进制 十六进制 BCD结果
0 0x0 0x0
9 0x9 0x9
10 0xa +0x6 0x10
19 0x13 +0x6 0x19
20 0x14 +0x6 + 0x6 0x20
29 0x1D +0x6 + 0x6 0x29
30 0x1E +0x6 + 0x6 + 0x6 0x30
39 0x27 +0x6 + 0x6 + 0x6 0x39
40 0x28 +0x6 + 0x6 + 0x6 + 0x6 0x40
49 0x31 +0x6 + 0x6 + 0x6 + 0x6 0x49
50 0x32 +0x6 + 0x6 + 0x6 + 0x6 + 0x6 0x50
59 0x3B +0x6 + 0x6 + 0x6+ 0x6 + 0x6 0x51
根据这个规律就可以把两者转换了,即实现了时钟的校准:
U8 hextobcd(U8 buf){if(buf > 0 && buf < 10){return buf;}else if(buf >= 10 && buf < 20){return buf+0x6;}else if(buf >= 20 && buf < 30){return buf+0x6+0x6;}else if(buf >= 30 && buf < 40){return buf+0x6+0x6+0x6;}else if(buf >= 40 && buf < 50){return buf+0x6+0x6+0x6+0x6;}else if(buf >= 50){return buf+0x6+0x6+0x6+0x6+0x6;}return 0;}
这些就是此次项目的大概思路和遇到的问题,做完这个项目对ARM9有了更深一步的了解,同时也对数据包协议的解析有了一定的了解,接下来上传一些项目的图片,同时也会将源码、上位机、虚拟串口安装软件上传。
项目展示:
演示视频:http://pan.baidu.com/s/1miaCSYW
图片展示:
多功能电子相册(上位机):http://pan.baidu.com/s/1dEPvP2T
虚拟串口:http://pan.baidu.com/s/1i5h49et
ARM裸机电子相册源码:http://pan.baidu.com/s/1dFhCKXr
- 基于S3C2451裸机开发的电子相册
- ARM裸机开发之基于S3C2451的电子相册开发
- 基于S3C2451的一个裸机电子相册
- 基于S3C2451的嵌入式电子相册
- 基于mini2451开发板的裸机开发-电子相册
- 基于S5PV210开发板裸机实现电子相册
- 基于FRAMBUFFER 的电子相册
- 基于mini2440按键控制电子相册(裸机代码)
- 基于mini2440触摸屏版电子相册(裸机代码)
- S3c2451开发板的启动过程详解
- S3c2451开发板的启动过程详解
- S3c2451开发板的启动过程详解
- 友善之臂S3C2451开发板如何用MiniTools下载裸机程序
- 基于QT的电子相册设计与实现
- 基于TQ2440的电子相册项目实现
- 基于ARM--s3c2451的函数封装---GPIO口的封装
- 基于ARM--s3c2451的函数封装---UART封装
- Android开发之简单的电子相册实现
- js里面获取时间时间戳
- ofbiz实体引擎(四) ModelReader的作用
- Android巧妙运用java 多态的特性,一个布局适配不同的数据结构
- ofbiz实体引擎(五) ModelGroupReader
- git 代码仓库拷贝问题
- 基于S3C2451裸机开发的电子相册
- osx制作u盘安装盘
- linux 之chpasswd
- Java系列之JDBC和ODBC之间的区别与联系
- 安装NVIDIA显卡驱动以及CUDA
- 性能优化1-概述
- ofbiz实体引擎(六) GenericHelper的初始化创建
- 自定义view
- 简单的整数划分问题