嵌入式设计应用
TI的MSP430系列是一款功耗低、市面流行的SOC结构的CPU,适合做智能仪表。IAR对其支持得很好,下面就以IAR调试为例来说说MSP430调试过程中一些问题。
(1)并口驱动能力不足,在电脑的BIOS界面下设置成ECP或者ECP+EPP模式;(2)JTAG线太长,一般超过20CM不推荐,而且这个线最好不要交叉缠绕,会影响实时在线调试;
(3)负载太大,一般功耗相对比较大,电流超过20MA以上的板子,建议用外接电源,光靠并口的电源,MCU的电压被拉低到不能写FLASH。
(1)芯片的复位电路引起的,在写FLASH的时候,会造成系统电压的一些波动,可能导致芯片复位,而为什么都是写到这个地址才错,那是IAR的问题,改用BSL再烧一边,就可以克服了。
(2)芯片有可能死机了,断电,拔掉JTAG,稍后再试,一般没有问题
(3)如果都不是上述的方法能解决的,可以给芯片上电,电压=3。6V,重新写一次,一般就OK了。为什么,写不进FLASH主要是F1XX系列的写FLASH电压不能低于2.7V,一般2.5V以下就不工作了,因此用3.6V电压,什么样的片子都能写回来。
相信有不少朋友已经用上了F1611,这个RAM相对大的MSP430,可能会遇到RAM中定义的变量/数组在超过一个极限的时候,MSP程序不能正常运行的现象。一般初步判断,可以用I/O输出电平来确定程序进程,这样可以非常方便的知道该问题是由于WDT造成的,因为F1611等较大的RAM的初始化时间大于WDT默认的32MS时间,导致MSP复位。
(1)对数组用__noinit_定义,上电,编译器不产生特殊的附加函数去初始化RAM。(2)修改IAR中Cstartup.S43文件中__program_start子程序,增加一个关闭WDT的操作或者设置WDT时间长度超过32MS。
(3)在Project--Options--Linker--Config中选择Overridedefault
programe,并将Entrylib设置成__program_start
上述是已知解决1611RAM初始化时间超WDT默认而复位的解决方法,如果用汇编,则没有这个问题。
SVS在F42X里可是个不错的模块,外部设计可以节约一个VD,成本和空间。在使用
时,如果SVS的电压设置在3.3V,结果一次JTAG写入后,板子便没有再起来工作,很多人认为写废了这个MSP。此时,可以判断MCU是否还能工作的方法:接上电源和电流表,如果发现电流有周期性跳跃,确定MCU正在被SVS复位。
解决方法:重新加电压,超过3.3V,修改设置,重写FLASH
MSP430单片机的程序有时候容易出现跑飞的情况,导致运行不正常。常见原因总结如下:
没有设置停止看门狗,也没有及时喂狗
没有定义中断函数,但又开启了对应的中断,发生中断时,找不到中断函数入口
供电电压不稳,或IO管脚输入过大电压,导致内部数据受到干扰
内存溢出,比如使用sprintf之类的函数很容易出现这种问题
1.中断或主函数中有死循环,现象是程序停在某处。
2.堆栈溢出。现象是程序跑飞。
A.看中断有没有用 _EINT(),引起中断嵌套。
B.Project--Options--General Options---Stack/Heap 将Stack size设置大一些。
3.中断耗时太长,刚出中断又进去了。这时的现象是程序一直在中断中执行,回不到主函数。
4.检查CPU的电源是不是稳定,msp430在要保证程序正常运行,需保证Vcc大于1.8V。当电压低至0.8V时,程序仍有可能执行。这时的现象是PC指针乱飞,有复位,死机,停在中断,时钟频率发生变化等现象。
5.程序编译没问题,下载程序后上电不断复位,该问题是由于WDT造成的(RAM的初始化时间大于WDT默认的32MS时间,因此MSP复位)根本原因是初始化的时间过长,超过了看门狗的时间,初始化完成以后才能进入main函数,这时关狗已经来不及了。
A 对你的数组用 __no init_定义,上电编译器不产生特殊的附加函数去初始化RAM.
B 在Project--Options--Linker--Config中选择 Override default programe,并将Entry lib 设置成 __program_start这时要修改Cstartup.S43(记得把它加入复制到工程而不是修改系统的),在第一条指令前加入关狗的指令,在main函数里再开(如果需要的话)。
如果用汇编,则没有这个问题
全部0条评论
快来发表一下你的评论吧 !