初级会员

- 积分
- 79
- 金钱
- 79
- 注册时间
- 2014-5-4
- 在线时间
- 0 小时
|
发表于 2014-5-21 10:21:26
|
显示全部楼层
楼猪不明白的地方应该是在向量表的重映射,我简单说一下我的理解:
首先三种启动方式:
1、SRAM启动,中断向量表定位于SRAM区,起始地址为0x20000000,复位后PC指针位于0x20000000处;
2、FLASH启动,也称用户闪存启动,中断向量表定位于FLASH区,起始地址为0x08000000,复位后PC指针位于0x08000000处;
3、系统存储器启动,也称bootloader启动,中断向量表定位于bootloader区,起始地址可设置,复位后PC指针位于起始地址处;
默认情况下,0x0000_0000处存放着中断向量表,即0x0000_0000处存放MSP,0x0000_0004存放中断复位向量,0x0000_0008处存放不可屏蔽中断(NMI),0x0000_000C处存放硬件错误中断,然后接着每4个字节存放一个中断(后面的多是用户的外设中断,且默认越往后优先级越低)。
NVIC中有个寄存器可以设置向量表的重映射和偏移地址,可以通过宏灵活设置,代码如下:
#ifdef VECT_TAB_RAM
NVIC_SetVectorTable(NVIC_VectTab_RAM,0x0); //SRAM启动
#else
NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0); //FLASH启动
#endif
如果设置了向量表存放在FLASH或者SRAM中,那么楼猪无需关心0x0000_0000处到底放着什么东东,根据CORTEX-M3的特性,他上电后根据boot引脚来决定PC位置,比如boot设置为flash启动,则启动后PC跳到0x08000000。此时CPU会先取2个地址,第一个是栈顶地址,第二个是复位异常地址,这样就跳到reset_handler。至于系统什么时候通过什么方式把中断向量表搬到0x08000000,权威指南第11章有专门讲动态设置中断向量表偏移的代码,楼猪学有余力的情况下可以了解一下。 |
|