这个其实是大学毕业设计的时候做的,看到这个活动的时候有点晚了,虽然很早就能把帖子发出来的,不过毕设的时候仅实现几个简单的功能,像接打电话、收发短信、时间日期温度气压显示及设置。准备再添加几个功能,完善一下一些BUG后再发帖的,不过还要工作,没多少时间,截止时间也到了于是只有先放出之前毕设的版本了,如果后面完善了再放出后续的版本了。毕设的版本没有用OS,后来完善的版本目前已经加入了FreeRTOS(有了OS多任务处理起来还是要方便很多),修复了原有程序的部分BUG,添加了文件浏览器功能,目前在添加音乐播放功能。好了下面进入正题:
硬件概览:
硬件部分主要包括MCU、GSM模块、触摸屏、SD卡、数据Flash、DS1302时钟模块、BMP085温度气压传感器等。MCU用来作为核心控制单元,保证系统的正常运行,触屏用来显示界面与获取输入操作,SD卡用来存储需要加载的字体文件和界面相关资源文件,数据Flash用来存储字库,DS1302用来为MCU提供实时时钟日历信息,BMP085用来采集温度、大气压。为了节约成本和时间,整块主板直接采用旺宝STM32火牛开发板,该板板载资源丰富,基本包含了上述模块(不包括GSM模块、DS1302模块和BMP085模块),省去了硬件详细设计与制作环节,简化了开发流程。GSM模块采用TC35模块。整体硬件实物连接图如下:
运行时图片:
软件总体设计:
软件整体框架方面,系统并没有用到实时操作系统,而是采用定时器中断进行时间片轮询方式进行任务处理。系统的GUI界面采用Microchip的图形库设计。该图形库总体代码量较少,采用消息处理机制比较容易理解,移植起来比较方便。
基于STM32的标准外设驱动采用CooCox的CoX外设库编写,该外设库灵活易用,相比于直接寄存器操作,简化了开发流程,从而能把更多时间放在系统应用程序上。
软件开发平台起初是采用CooCox的CoIDE集成开发环境,该IDE具有类似Eclipse开发界面,在代码编辑上比较方便。后来由于该IDE对调试支持的不是很好,换到IAR开发平台。(至于为什么选择用CooCox是因为做毕设的时候在英蓓特的CooCox组实习,模块驱动也是自己基于这个库写的)。
整个系统在复位后先对各个外设初始化,并配置、开启系统节拍定时器中断,这些初始化过程都会在屏幕上显示相应初始化信息以查看模块初始化是否成功。然后初始化GUI,进入主循环,主循环中仅负责事件解析(包括触屏事件和TC35消息)与界面的绘制。定时器中断中根据中断计数判断,每隔一定时间进行一次触屏触摸事件扫描、TC35模块消息扫描及系统时间更新。由于中断服务程序执行时间不能太长,否则会造成定时不准确甚至中断服务程序以外的程序没有时间执行,因此那些比较耗时的程序段就放在主循环中执行,比如上述的界面绘制函数。
软件模块部分,汉字的显示、拼音的输入参考的openedv论坛正点原子的汉字库及拼音查表方法,SD卡文件系统使用fatfs。字库起先存储在SD卡或U盘,字库更新程序将字库更新到SPI Flash后供系统显示用。
不知道需不需要详细介绍一下各个模块和工作原理,不过相信大家看数据手册和下面放出的源码应该会大致了解,下面就直接上效果图了。注:以下系统界面截图采用自己编写的LCD一键截图程序,从LCD读取每个点颜色值,保存到bmp文件。