引用: 原帖由 wstt 于 2013-1-10 10:28 发表
MSP430的中断标志位,有的可以自动清除,有的需要软件清除。
硬件平台:MSP430F149 (因为MCU内部资源比较丰富,作为学习板是最合适的,现在似乎学习板最流行的也是这个型号)
软件平台:IAR 5.3 (启动代码中很多地方呗编译器做了限制和保护,想说爱你不容易啊)
调试器:MSP430FET430UIF
简单的分析一下启动代码:(做了截图,但是不知道怎上传,而且最近上传速度忒慢,就不传了算了)
中断向量表存放在0xFFFF处到0xFFE0,共32个字节,每相邻2个字节为一个中断向量,0xFFFE-0xFFFF处存储的是复位向量。这个16位的数据,0xFFFE存放的是低8位数据,0xFFFF存放的是高8位地址,也就是小端模式。这里应该存放的是程序的首地址,我跟踪到的是0x1102(不知道0x1100是什么地址,看到过几次,不记得了,麻烦知道的指点一下)。
CPU上电复位后,PC指向0xFFFE,CPU从中断向量表中取得程序首地址的地址后,马上跳转到0x1102处。在0x1102处,存放的是MOV,#0x0A00,SP 也就是初始化栈寄存器,因为后面马上就会用到了,不尽快初始化会出问题的。之后可能有关闭看门狗或者是没有这个操作,这个要看用户是怎么弄的吧。
F149的RAM是2K的,从0x0200到0xA00,因为MSP430是满递减堆栈的,所以初始化堆栈寄存器给出的是0xA00,不是0x200。
然后接下来,如果程序中使用了静态变量(包括全局的和局部的),那么有静态变量的初始化,将静态变量在RAM中创建或初始化。地址从0x200开始,所以在跟踪一些静态变量时会发现它们的地址基本都在0x200以后。也就是RW的搬运和ZI断的创建,linux下表述方式为data段和bss段。具体的我也没有分析过。
然后才call #main,调用用户的main函数,进入用户程序的流程。
所以综上,启动代码一般要做的4件事的流程是:
1.初始化栈寄存器SP
2.初始化某些硬件外设,例如看门狗。(可选,依具体硬件和需求决定)
3.初始化RW段 (可选,看用户中是否有初始化值的静态变量)
4.创建ZI段 (可选,看用户中是否有未初始化值的静态变量,默认初始化为0)
5.调用用户main函数,进入用户程序流程。
有问题的地方欢迎指出和纠正。