msp430程序丢失问题分析及解决方法

嵌入式设计应用

128人已加入

描述

  TI的MSP430系列是一款功耗低、市面流行的SOC结构的CPU,适合做智能仪表。IAR对其支持得很好,下面就以IAR调试为例来说说MSP430调试过程中一些问题。

  1、接上仿真器,发现不能下载,IAR提示找不到目标。

  (1)并口驱动能力不足,在电脑的BIOS界面下设置成ECP或者ECP+EPP模式;(2)JTAG线太长,一般超过20CM不推荐,而且这个线最好不要交叉缠绕,会影响实时在线调试;

  (3)负载太大,一般功耗相对比较大,电流超过20MA以上的板子,建议用外接电源,光靠并口的电源,MCU的电压被拉低到不能写FLASH。

  2、程序下载到一半,突然告警并报错,说某某地址写不进去。

  (1)芯片的复位电路引起的,在写FLASH的时候,会造成系统电压的一些波动,可能导致芯片复位,而为什么都是写到这个地址才错,那是IAR的问题,改用BSL再烧一边,就可以克服了。

  (2)芯片有可能死机了,断电,拔掉JTAG,稍后再试,一般没有问题

  (3)如果都不是上述的方法能解决的,可以给芯片上电,电压=3。6V,重新写一次,一般就OK了。为什么,写不进FLASH主要是F1XX系列的写FLASH电压不能低于2.7V,一般2.5V以下就不工作了,因此用3.6V电压,什么样的片子都能写回来。

  

  3、F1611大数组定义,不能正常运行的问题

  相信有不少朋友已经用上了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默认而复位的解决方法,如果用汇编,则没有这个问题。

  4、SVS导致MSP“坏死”问题

  SVS在F42X里可是个不错的模块,外部设计可以节约一个VD,成本和空间。在使用

  时,如果SVS的电压设置在3.3V,结果一次JTAG写入后,板子便没有再起来工作,很多人认为写废了这个MSP。此时,可以判断MCU是否还能工作的方法:接上电源和电流表,如果发现电流有周期性跳跃,确定MCU正在被SVS复位。

  解决方法:重新加电压,超过3.3V,修改设置,重写FLASH

  MSP430单片机的程序有时候容易出现跑飞的情况,导致运行不正常。常见原因总结如下:

  没有设置停止看门狗,也没有及时喂狗

  没有定义中断函数,但又开启了对应的中断,发生中断时,找不到中断函数入口

  供电电压不稳,或IO管脚输入过大电压,导致内部数据受到干扰

  内存溢出,比如使用sprintf之类的函数很容易出现这种问题

  

  msp430程序跑飞之解决方法

  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函数里再开(如果需要的话)。

  如果用汇编,则没有这个问题

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分