【转】关于MSP430

来源:互联网 发布:北京数控编程 编辑:程序博客网 时间:2024/03/29 21:06

from  http://hi.baidu.com/wxqms/blog/item/607eb4c371904340b319a89b.html

 

 

关于MSP430
2011年03月22日 星期二 下午 01:07

转载于:天之泽的日志 - 网易博客:http://sxqstudy.blog.163.com/blog/static/3456251200810123583435/

低功耗3模式下要小心使用中断,否则容易出现难以解决的问题。如果有几个中断频繁交替,那么极有可能个别中断会被较高优先级的中断打断。而如果被打断的是通讯中断,那么通讯可能因此而中断,或者无法进行通讯,这时就要考虑在通讯中断到来后关闭某些可能导致通讯失败的频繁中断源,在通讯完成后再开启。

另外,两个以上中断如果有其中一个或多个过于频繁,容易造成中断冲突,从而是WDT不能及时清除,造成系统复位。

WDTCTL=WDTPW+WDTCNTCL;//清狗语句如果使用过于频繁,比如刚执行过此语句后紧接着又是一条,那么有可能导致系统复位,这个需要注意!

中断中不能访问耗时过长的AD转换。非定时中断中要完成的任务要在中断中完成,不要非等到唤醒之后。否则在非休眠模式下如果有其他中断到来,将会出现程序功能异常。非唤醒状态下,不能在中断处理程序中进行FLASH存储器的清除操作,否则会导致程序因看门狗而复位。

以上两个问题实质就是单片机过长等待硬件,致使看门狗发生溢出复位。

非定时中断不考虑程序是否短小,能不唤醒而在中断服务程序中处理完成的尽量在中断中完成。

超低功耗单片机如果不加外围复位芯片有可能导致复位锁死,合理选用复位电路并尽量减小掉电时间可以减轻此类现象。

 

 

IAR中变量名称不能定义成CAP,如果一个变量名导致一些莫名其妙的错误,看看它是不是和寄存器变量重名了。

 

在线编程,测试时,如果下载线连接在板子上,而又有开关计算机动作时,会导致单片机程序紊乱而死机。另外使用片内可编程FLASH时,如果用户数据段与程序段有重叠,也会造成程序异常死机,或者根本无法启动。

 

多次更改程序后IAR编译可能出现混乱,如果此时陷入莫名其妙的错误,而又找不到程序错误,不妨关闭一下IAR,删除调试文件后再编译。

 

在用编程仿真线对芯片进行程序下载时,如果出现致命错误提示:安全熔丝位断开,那么可能的原因为:CPU引脚焊接有问题,某处连锡,或者焊接时间过长,高温破换熔丝位。这时可以重新对CPU上锡,或者更换CPU。但是由于430的引脚设计很不好,一旦大范围连锡很难弄下来,所以建议进行机器焊装。

 

在使用指针变量(指向内部FLASH地址)时,尽量不要直接对此变量进行数据运算。如比较时,可以只比较变量数据本身,但不要加上其他加减或乘除运算,否则,可能会出现罕见的问题,比如我遇见的,用USB供电时,拔出电源后再上电,器件内与此变量相关的条件判断语句无法正常工作等。

 

 

ADC12中如果ADC12CTL0选择采样定时器SHT0_0或者SHT0_1,会造成采集的电压低于实际电压,SHT0_2为正常。

在获取内部温度传感器通道数据时,ADC12的ADC12CTL0中的SHT0应该设置为SHT0_4,或以上,否则数据会偏大许多,而且不稳定。

430的ADC12内部电压基准源没有想象中的那么“准”,比如有些CPU的是2.47V,而有些可能达到2.55,这样的差别在要求不高的地方还好,如果是精密仪器,则必须考虑!这时只有使用外部基准源,比如LM285等代替其内部2.5V模数转换参考电压源。否则这个ADC12就只能当作ADC10用了,呵呵~

在IAR中,类似0.66*10*32767/x;之类的语句会产生巨大的代码量,改成216262/x;就可以了~

430的内部温度传感器只能使用内部基准源。如果电压采集用了外部基准源,那么在采集时必须使用两套程序,因为使用内部基准源的话要使用一个延迟等待基准源启动。如果一个程序中同时使用内外基准通道,那么可以在关ADC12内核时不关闭内部基准电压发生器。这样就可以方便对两路不通参考基准源的通道进行采集。

在IAR中,if(P3IN&0x10==0x10)//这种语句是错误的,但是编译器并不给出提示,只是在程序到这里时不进入if语句中执行,而且不能在这里设断电,比较隐蔽。但是如果将此句改成if((P3IN&0x10)==0x10)//即可按设想运行了!所以可见养成在条件语句中多加括号的习惯是多么的好~

430的引脚PxIN寄存器在DIR为输入时表征脚的输入电平,当DIR为输出时PxIN和PxOUT内容是一样的。这一点和51系列的单片机是有较大区别的。

在IAR中,为保证程序的可靠/稳定,类似于whlie的等待或延迟语句除在条件中添加超时等待退出条件外,还要在循环内部添加清狗指令,以免看门狗在等待时异常复位。

MSP430的USART引脚可以与3.3V电平的USB转串口/TTL的通讯线直接连接,但是为了兼容5V电平的信号,一般需要在引脚上串联一个电阻,比如1K,这样的“偷工减料”后确实可以使大部分情况下的通讯得以安全得正常运行,但是总会有一些特殊情况,而正是这些特殊情况导致产品整体质量下降。比如客户返修的通讯不良的产品,许多是由于CPU引脚长期工作于负荷状态下而导致的引脚不良。所以,RX/TX必须加上电平转换电路,而为了保证通讯质量,三极管也要选用频率比较高的9018等。

无论在IAR或者ICC中,数学运算的表达式都无法实现自动类型转换,比如 unisgned int Y=a*x/100+50;(x,a都是整型),那么这里的表达式将统一按整型处理,也就是说x/100得到的结果是整型,而不是小数。所以这样的情况下运算精度将受到很大影响。解决办法:Y=a*(float)x/100+50;

另外,对于 long Y=a+x*10000;这样的表达式,整型算式x*10000在运算时,x不是先被转换成long 型,所以这样写会导致寄存器溢出,从而使运算错误!解决办法:Y=a+(long)x*10000;

如果使用了内部FLASH作为数据存储,那么当一段本不应该出错的程序却导致系统异常复位时,需要查看当前用户数据区是否和程序代码区的地址有重叠!

在仿真中,如果出现CPU is off(Low Power Mode) and interrupt are disabled! Cannot excute Step/Go此类情况,那么程序在运行时也会出现类似CPU无法被唤醒的情况。这大多是由于系统程序被意外篡改造成的,这里应该注意两个问题:首先,应该检查是不是把程序存储区意外改写了,也就是数据区和代码区是否有重叠。另外,要养成在低功耗主循环中使用_EINT();的习惯。

ADC12内部2.5V参考源可是个耗电大户,比如437CPU在没有使用内部参考源的时候功耗为0.04mA,使用内部2.5V参考源之后电流猛增到0.5mA,实在是难以承受~所以如果可以,尽量使用外部基准源,而把内部的关掉!

今天把一个F135的程序移植到了F437上,在采集外部电压时,我的外部参考电压VEREF+得出的结果与实际值总是有巨大差异。调试了一天才有一点眉目,当把ADC12CTL0=ADC12ON+SHT0_12;//2.5V外参+开ADC内核+采样保持定时2改为12后结果才接近实际值。但是还是有些偏差,不知道该怎么改动~(最近没事又看看这个问题,发现这不是我程序的问题,而是437CPU的问题,一般的437其内部ADC都会比实际电压值偏高,偏离程度从100个AD数到200不等,也就是电压偏差可能能超过0.1V到0.2V。我看了一下TI网站上的函数库,437和135的程序也是一样的,这就得出一个初步的结论437CPU有品质问题!抛开这一点不说,我们可以由此得出一个结论:一般单片机的ADC如果测量一些要求较低的模拟信号还可以使用,如果用于高精度的仪器仪表,必须使用分立的ADC芯片!)

另外,对于437的CPU在硬件设计时应该注意:外参必须能够提供0.2mA以上的驱动电流,否则TI无法保证ADC采集数据的准确性。另外,在参考源的引脚上也要加上一个10uF的滤波电容以及0.1uF的去耦电容。但是加上这两个东西之后,参考源上电稳定的时间势必会加长,所以必须在采集时有足够的等待时间。比如内部参考源启动等待时间是14mS,那么外部参考源的启动时间也要10mS以上。但是,尽管如此MSP437内部ADC12的准确性还是要留意,因为内部参考源得出的数据也是不准确的,我想大概是其内部2.5V偏低的结果。

对于430的ADC12比较好的操作方式应该是:1.ADC_Setup(unsigned int delays);//为ADC内部或外部参考源提供启动延迟,也即开参考源 2.Get_ADX(unsigned int chs,unsigned int ref,unsigned int n);//选择基准源与采集通道并进行n次AD转换 3.ADC_Close();//关闭参考源关闭ADC内核    在这个过程中,进行多次AD采集时无须重复开关参考源,采集响应速度将得以提高。

原创粉丝点击