基于S3C2451的一个裸机电子相册


       学习S3C2451也有一段时间了,对于ARM9裸机开发也有了一点了解,这次做了一个基于ARM9裸机开发的电子相册,其中也遇到了一些问题,最终都通过各种方法解决了,在此做一个记录。

  这次电子相册开发使用的是广州友善之臂的Mini2451开发板,内置三星公司的S3C2451芯片。

ARM9端功能介绍:

  下载bin文件后首先进入主界面,这时通过key1和key2来控制进入相册模式还是时钟模式,5秒未操作将进入屏保模式。按key1进入相册模式后,界面会提示选择自动播放还是按键播放,key1&key2同时按下置低电平进入自动播放(实际上还需要设置轮换时间,否则轮换时间非常长),key1 & key3 同时按下进入手动播放,然后通过key1播放下一张,key2播放上一张。通过这四个按键实现相册的基本功能,除此之外,还可以设置定时闹钟,设置字幕及四个LED灯按照一定规律闪烁做流水灯效果,流水灯通过时钟中断实现,闹钟功能有两个思路,一个是通过ALARM寄存器获取时间,存放在数组,与RTC时间进行比较,或者直接定义一个新的结构体,对其进行赋值操作,然后进行判断。

过程中遇到的难点

       1.这里遇到的主要问题是怎么实现上一张和下一张的切换,将图片通过取模软件取模后,生成了10个数组,然后定义一个指针数组,将这10个图片数组的指针存放进来,通过遍历实现了自动切换相册功能。在实现上一张和下一张的时候,想了一会,最后我定义了一个全局变量sp,上一张播放解释sp++,然后sp%10,最后图片显示,这样就完成了上一张图片的切换,下一张就是sp--。

       2.时间的设置。时钟配置的寄存器需要填入的是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

       那么这里只需要对每次传入的数据进行一次判断,在10-19之间给他加0x6,20-29之间加0x6*2,以此类推,用/运算符获取乘数进行乘除就可以。

       3.串口接收缓存溢出,每次上位机发送了9-10次数据之后就突然发现上位机这个时候没有作用了,无论按什么都没反应,这个问题检查思考了很久,最终发现串口接收缓存溢出了,没有将缓存清空。由于是使用串口中断来接受数据,所以我最终的解决办法是:

    将串口接受位和发送位的数据进行清零。SUB_INIT_RXD0和SUB_INIT_TXD0.





你可能感兴趣的:(项目,ARM学习)