最近两周一直在做一个项目,就是用C8051F020最为MCU,实现对广告灯箱的控制。在济南的花园路上就有这样的灯箱,不过没有语音功能。这个项目还要求有语音功能,语音文件都存储在CF卡中。这个项目已经完成得差不多了,回头总结一下,该项目的软件工作量有下面几个方面:
1、C8051F020的学习和掌握
从大三学过一点简单的8051,就再没有看过。C8051F020是一款增强型51芯片,功能比较强大。因为有去年学习AT91RM9200的经验,相对于AT91RM9200,它的难度还算低一点。重点是理解中断系统,内存管理部分,其他大都比较容易了。
2、Keil C的学习和掌握
这个工作量不大。只需要学习Keil C那些地方与标准C是不同的;为什么有这些不同;因为这些不同,我在使用的时候必须注意些什么......同样,因为在Linux下使用GCC、GDB等等,对各个分离的过程有了很清晰的认识,所以,这个就显得简单多了。我想,如果一直使用Keil,那么很难对各个过程有个清晰的认识,即使出现问题,也不知道是那个环节出现了问题,应该如何去解决。
3、SMBus/I2C、SPI总线的驱动
SMBus/I2C仍然用作读写e2prom,存储配置信息。在这里,重点掌握了有限状态机的原理。C8051F020的硬件实现SMBus有28个状态,现在用它来做master,就不需要那么多了。根据需求进行相应的简化。
SPI总线应该是最简单的总线协议了。利用它来读写实时时钟芯片RTC4553,实现在数码管上实时显示时间,同时实现定时功能。在开发的时候,这个却一度徘徊不前。原因还是对工作原理和Datasheet了解不够,NSS引脚用法错误导致。
4、CF卡的读取和FAT16文件系统的实现
CF卡的读取首先基于对C8051F020的内存管理机制有了清晰的认识,具体的读写倒不是很困难。对FAT16文件系统的实现,也没有完全实现,只是能满足需求即可。CF卡用来存储配置信息和语音文件,该语音文件支持raw格式的PCM 12bits unsigned char编码格式,直接将数据送至DAC0即可。
5、串口驱动和红外远程控制部分
这部分的工作量主要在解析报文。
6、系统流程控制
工作量在逻辑处理。
这个项目使自己更加清晰的认识到,软硬件是如何协同工作;驱动为什么是提供机制,而不提供策略;如何实现模块化编程;如何实现模块间通信。这些反过来对于ARM的学习有了一个很好的促进作用,眼光比以前开阔多了。只看书,或者只是根据别人的思路走,是难以学好ARM的。一个人能够很好地学习别人的长处为己所用,这个人就是聪明的。上面都是些感悟点滴。
这个项目的最大价值在于让我经验提升,特别是调试经验和思考问题的角度。可以说,刚开始的时候,走一步就一处问题。遇到过长线效应、速率不匹配、量化噪声等问题,这些都是通过示波器查看波形解决的。所以,在以后的问题处理中,思维就开阔了,调试手段也丰富了。这些是在课本上无法学到的。只是死做,不去思考,也是不能得到的。
感觉51还是相对简单的,毕竟是8位单片机,用途也就一些低端领域。32位的MCU每个功能块都复杂的多,大多用于高端领域。最为重要的是,高端的MCU因为要完成的工作量比较大,所以大多数带操作系统,那么就需要对操作系统有深入的了解。写这个的原因是纠正我以前的一个错误的观点,正确的应该是:万物都有相通之处。就是说,掌握51,会对ARM的学习有很好的促进;反过来,ARM的学习,也会对51的掌握有莫大的帮助。做项目,不应该仅仅局限于这个项目,要把眼光放远,思维活跃一些,在知识体系的任何可能与之相关的方面,可能都要受益于你当前的所得。