(TI MCU分享)努力爬上师傅们的肩膀

2019-07-30 19:25发布

序:仅以此文,献给那些正准备使用或刚开始使用430的朋友们,并纪念我此前为使用430而花费的努力!


      Long long time ago,话说大约两千天前,我认识了MSP430。不过遗憾的是,说实话,自己真正开始在项目中独立使用它,包括硬件设计和程序设计,那还是去年的事了。此前也使用过七八种8位单片机,也看过一些430单片机的资料,所以开发起来倒不是很难。不过,在实际应用过程中,因为没有系统研习该单片机,也不可能记住那么多看过的资料,因此还是会遇到一些五花八门的问题。在此,我把平时记录的点滴“曝光”出来,希望对初学的朋友们有所帮助,尤其是急于要上手的朋友们,避免再次耗费我已经耗费的时间,同时也支持一下TI社区的活动。水平有限,难免有误,欢迎指正。


1. 如果想快速从其它平台单片机移植到430,用C语言最快,但若要深入掌握430单片机,建议有时间还是了解一下430的汇编。当然,这有点废话,这是通用的经验。不过,我想说的是,便于移植的前提是你原先平台的程序不是严重地、大篇幅地依赖硬件功能模块(比如ADC、比较器、电压检测、通讯接口、DMA等),而且程序结构要尽可能模块化,把通用的东西做成C文件或函数去调用。这一点需要多学习别人好的示例代码,多动手写代码,多积累有用的代码。虽不喜欢拍马屁,但这里还是想隆重赞一下TI网站,他的应用文档非常丰富,几乎每款单片机都有很详细的示例代码,涉及各种功能模块的基本用法,很值得访问、下载及拷贝。以我个人的感觉,TI官网的示例代码很容易读懂,一般会点C语言的都能读懂,相比其他厂家的示例代码,有些厂家用了大量高深的东西,比如结构体、指针什么的,对于习惯了汇编或者不经常使用高级语言的朋友来说,实在有些不习惯。(插播题外话:当然,这是需要代价的,TI的推广力度这么大,支持这么好,我觉得他的芯片的价格当然要相对贵些。)除了TI网站,国内对推广430贡献最大的应该是利尔达了,所以访问利尔达网站的论坛也可以得到很多有价值的参考信息,可惜,如今利尔达的论坛似乎不怎么用心维护了,广告满天飞,疏于管理,我正正常常的账号却不知何故无法发帖了,让我有说粗话的冲动:(。再有,现在也有其他电子门户网站也很活跃,比如21ic,也是使用过程中不可多得的良师益友。


2. 设计电路时,430也没什么特别的地方,加上电源就能工作,甚至不用复位电路和外部晶振。调试及编程接口需要特别注意不要弄错,利尔达的LSD-FET430UIF的使用说明书上的描述过于简单,那图还是从TI文档上照搬来的,还需要查看其它文档才能搞清手上的JTAG插头的引脚定义,文档跟周立功比有些差距^_^。这里附上我此前找到的一份英文文档上的对JTAG接口的描述,依照这个图来设计PCB就不会有疑问了。另外,建议第24脚的VccVcc Ext分别串入一个跳线电阻,便于选择仿真器向外供电或用户目标板自己供电。

1.JPG

3. JTAG接口的线尽量不要太长或者转接太多道,容易影响通讯,如果改接其他接插件(即不用双排14针的插座),应尽量保证牢靠接触。此外,实验证明,外围的复位电路(电阻、电容、二极管)接上一般不影响JTAG使用,几根数据线(TDOTDITCK等)接上限流电阻和贴片发光二极管到电源(复用口),也不影响下载调试,LED反倒能指示下载时IO口状态。当然,不到万不得已,建议不要这么复用,免得给自己找麻烦。


4. 注意MSP430上电后默认的系统时钟是DCODCO默认的频率值需参考器件规格书及用户手册,一般为1MHz左右。


5. IAR初次安装后,项目的选项里,调试器默认是软件模拟仿真,需要连接430UIF时,需在选项里头选择FET Debugger,并且要指定调试协议,比如4-wire JTAG,否则会报错(没有代码空间和数据空间)。其他的选项也注意应该按正常的建立项目的步骤进行,比如选择芯片型号等。我当初就犯过这个低级的错误,debug都正常,板子就是没反应,搞得一头雾水,OTZ


6. 刚买回来起用的430UIFIAR中使用时,可能会提示固件Firmware版本不匹配,可以确认进行自动升级。


7. 中断向量在官方的C例程中不可望文生义,比如MSP430F4152I2C的中断向量的标识是USCIAB0TX_VECTOR,不论收还是发都是,而非这个USCIAB0TX_VECTOR是发送、USCIAB0RX_VECTOR是接收。具体的中断向量需要参考相应单片机的规格书,而非用户手册(User’sGuide)。


8. 硬件的I2C模块的接收中断标志UCB0RXIFG产生于接收缓冲区UCB0RXBUF接收到一个完整的字节后,该缓冲区数据被程序读取后,硬件将自动重置接收中断标志位UCB0RXIFG;发送中断标志UCB0TXIFG产生于此前发送缓冲区UCB0TXBUF的数据被送入移位寄存器后,即该缓冲区空了的时候,但并不意味着数据已经都发送到接收端,响应中断时只是告诉你可以继续往发送缓冲区写数据了。


9. MSP430以低功耗为特 {MOD},而我们设计的系统是否低功耗关键还是取决于整体的设计,包括硬件和软件。如果你的系统的静态功耗只能做到百微安级别,我觉得这种情况下使用430就不用迷恋它的低功耗了,其他便宜的单片机的功耗相对于系统整体功耗来说也可以认为是超低功耗的。比如,使用ADC10时,仅仅将ENC0并不能把功耗降到最低,可能还有将近200μA的功耗,比较彻底的方法是ADC10CTL0整个清零;再比如,使用IO口控制外部的PNP三极管的基极以控制某些外设的电源(发射极接单片机电源,集电极接负载),在休眠状态下输出高电平以关断三极管,这种情况下IO口向外输出的电流很小,不影响低功耗。


10. ADC10的寄存器ADC10CTL0中除了第03bit,其他bit的修改必须在ENC=0时才可改。这在用户手册中有明确说明,只是因为是英文的,看完就忽略了。


11. 进入休眠状态后,响应中断并进入中断服务程序,处理完毕并不会自动退出休眠状态,如果想退出休眠状态,需要在退出中断前使用退出休眠状态的指令。这一点可能与其他有些单片机不一样。


12. 有的单片机集成了硬件的I2CSPI。以我自己使用EEPROMMFRC522的体验,如果外设协议比较简单,系统实时性要求不高,用模拟的I2CSPI口方式,编程调试还更方便。因为使用这些硬件模块时,还需要做相应的寄存器初始化配置,甚至需要使用中断来控制某些位数据(比如I2C中的起始位和停止位),实际操作起来还不如用模拟的方便,移植性也不如模拟的高,初学430者调试时找问题比较费劲。而且,模拟的方式已经有比较成熟的代码,一般拿来就能用。因此,对I2C而言,如果代码空间足够,可以考虑用模拟方式,对SPI而言,如果只接一个简单的外设,单片机自带的硬件接口没啥优势,而用模拟的方式所需要的代码量很少,也很可靠。当然,这个问题需要根据具体应用进行分析、评估及取舍。


13. 关于电源电压检测。单片机的电源引脚上的电压监测可以通过SVS实现,其他电压除了ADC通道可以采集,还可以使用模拟比较器实现电源欠压监控。将外部输入作为模拟比较器的比较信号,一端接ADC集成的内部参考电压,这是固定的,另一端连接经分压电路分压后的电源电压。当分压后的电源电压低于内部参考电压时,比较器输出结果置位中断标志,引发中断,从而实现欠压保护功能。


14. 带有字段液晶驱动模块的单片机的R03(以MSP430F4xx系列单片机为例)最好通过一个电阻后再接地,便于调节显示对比度。

15. 最后,多看,多想,多动手,特别要多看看此次活动参加分享的文章,那都是花钱都不好买的经验:)站在这些师傅的肩膀上,你会轻松一些。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。