1、msp430在执行主程序之前默认会对将程序中定义的相关变量初始化为0,但当需要在程序中定义大型数组时,最好在数组前加__no__init,告诉编译器这个数组不需要进行初始化,否则可能因为初始化时间超过WDT而导致不断复位。我曾经在写过一个程序,需要定义两个1024长度 int型全局数组,也就是说总共占用4KB字节RAM,当时用的是msp430f2618,其RAM为8KB,按道理不应该出问题。不过当我把程序下到单片机里是,程序一直运行在main函数之前的一段引导区代码,无法进入到主程序中。在加了__no__init预编译说明后,问题得到解决。
2、在调试程序过程中,如果发现某内存单元的数据无故被改变的时候,很可能是指针溢出引起的问题。在写单片机程序的时候我们可能会遇到三种类型的指针:(1)自己定义的指针(2)数组下标(3)某些起指针作用的SFR。我把指针比作是“既聪明又淘气的孩子”,聪明是因为,很多算法可以很容易用指针实现,淘气是因为一旦程序中指针出问题,非常难以察觉。我曾经写一个程序要用到DMA,在执行到某句代码时,发现有个完全不想管的变量被无故改变,当时想到可能是哪个指针溢出导致的,不过观察了程序中所有的指针变量和数组下标,都发现没问题。后来才发现是DMA的source address指针出问题了,此指针应该是递增,我设置成了递减,导致溢出。
3、430总中断的控制位是状态寄存器内的GIE位(该位在SR寄存器内),该位在复位状态下,所有的可屏蔽中断都不会发生响应。可屏蔽中断又分为单中断源和多中断源的。单中断源的一般响应了中断服务程序中断标志位就自动清零,而多中断源的则要求查询某个寄存器后中断标志位才会清零。由于大多数人接触的第一款单片机通常是51,51单片机CPU在响应低优先级的中断程序过程中若有更高优先级的中断发生,单片机就会去执行高优先级,这个过程已经产生了中断嵌套。而430单片机则不同,如果在响应低优先级中断服务程序的时候,即使来了更高优先级的中断服务请求,430也会置之不理,直至低优先级中断服务程序执行完毕,才会去响应高优先级中断。这是因为430在响应中断程序的时候,总中断GIE是复位状态的,如果要产生类似51的中断嵌套,只能在中断函数内再次置位GIE位
4、430的中断向量是FFE0H—FFFFH,一共32个字节也就是FLASH的最后一段,430的FLASH有大有小,但是最后地址肯定是FFFFH(大FLASH超过64K的除外)所以它们的起始地址是不一样的,而一般IAR默认编译都是把程序放在FLASH开始的位置(不包括信息段)。
有个值得弄清楚的问题是:什么是中断向量?中断向量实际就是保存中断函数入口地址的存储单元空间。就像FFFEH+FFFFH这2个字节是复位中断向量,那么它存储的就是主函数在FLASH内的起始地址,假如主函数保存在以0x1100为起始地址的FLASH块内 ,那么你会发现FFFFH 内保存的是0x11, FFFE内保存的是0x00.其他什么TimerA,ADC12,所有的都一样。只是你每次写的程序长短不一,中断函数放的位置不一样。IAR编译器都会给你定好,然后在你用JTAG烧写程序的时候,把这个地址,烧写到相应的中断向量。因为中断函数所处地址可以由用户自定义,也可以让IAR自动编译,所以这个地址除了源代码开发人员知道,其他人是不知道的,BSL就是应用这32个字节的中断向量内的内容的特殊性设置的密码。但是有几个东西在430是不变的,就是触发中断的条件满足后,它到哪个地方去寻址中断服务函数的入口地址,是TI 在做430时就固化好,定死的。比方说上电复位的时候,它知道去FFFE,FFFF单元找地址,而不去FFE0,FFE2找地址,这个映射关系是430固化不变的。可有的时候你就是需要改变“中断向量”,这怎么办?430FLASH程序自升级里有时就会碰到这个问题,方法是在430原来默认的中断向量表内做一个跳转操作,同样以上电复位为例:
ORG 0x2345
PowerReset: mov.w &0xFCFE,PC
…………………………
…………………………
ORG 0xFFFE
DW PowerReset
这样的话0xFCFE就相当是0xFFFE的映射了 |