使用TI的MSP430芯片已经有几年了,最近做产品用到了一款MSP430G2231,很愿意和大家分享一下。
先说一下这个MSP430G2231,面对巨大的中低端MCU市场的诱惑,TI终于不再沉默,推出了G2xx系列超值MCU,其实它和Fxx系列mcu完全兼容,只是放宽了一些非关键参数,从而降低成本,可以与PIC、freescale等厂家进行竞争。
我的产品是一款家用小探测器,使用普通电池供电,要求能正常工作1年以上。所以在单片机选型的时候就自然而然想到了MSP430,它在低功耗方面的优势实在太明显!
待规格确定后,原理图设计完,就该编写程序了。
程序要实现的功能主要有两部分,其一是探测;其二是通信。使用汇编编写。
写程序前当然要先设计流程图了,有了流程图就有了思路,调试改错以及将来维护都很方便。没有流程图的汇编程序是比较恐怖的,有一次我要改两年前的汇编程序,脑子都想成一堆浆糊了,就是想不起来当时为什么那么编写!悔呀!
在编写程序过程中,遇到了一些有意思的事情:
1、JMP指令只能在-511到+512字范围内跳转,如果想跳得更远些,就需要多个JMP指令接力了,呵呵,听说过烽火台点狼烟接力,看过田径跑步接力,现在程序跳转也玩接力了!
2、通信时使用比较复杂的协议,需要判断输入引脚的电平,由于种种原因不能使用中断,所以选择了查询的方式,虽然设计时理论上查询可以足够快,但实际上会由于通信线的干扰而导致脉冲变窄,有漏掉脉冲的情况。后来不再查询引脚的电平,改为查询引脚中断标志,这样便解决了问题。
3、16位单片机和8位单片机在写汇编程序时体会非常明显。因为对于16位单片机,必须时时刻刻想着我用的这个变量是16位的还是8位的,尤其是赋值、运算的地方,都是滋养bug的好地方。找bug是一件很辛苦的事情,为了少愁白几根黑发,能用C还是尽量用C吧。
4、定义了个变量: Temp DS16 1;
然后对它操作,如清零: clr.w Temp; 有人喜欢写 clr.w &Temp;
这两种写法都对,我知道它们对应的是两种不同的寻址方式,只是感觉很奇怪,为什么要这么设计?
另外对寄存器的操作是不能用&的,是不是又是一个滋养bug的好地方?
5、进入LPM3低功耗模式,功耗真的很低,不到1个uA,太强了!
总之,MSP430单片机功能是非常强大的,我用到了它的片上Flash作EEPROM,非常方便;用它的Timer_A在连续工作模式下做定时器,非常方便。还用到了内部经过校准的1M振荡器,省了外接晶振。
一起分享,乐趣多多。