一,NVIC机制
以上截屏出自cortexm3权威指南第八章131页。
整个程序可以分为以下几部分。
1,配置AIRCR寄存器
2,转移中断向量表
其中包括copy NMI和fault的向量
上图说明NMI和fault的中断号分别是2和3。而且上图中2至15号中断是已定的,不可更改。之后的中断号码分别要对应一个优先级,一个函数入口地址(这个好像因为stm32的.s文件导致不能更改,之后会谈到)。原本内存是从0x00000000这个地址开始存放中断向量表(第一个32位数据是0号中断存放中断服务函数地址,第二个是1号中断存放中断服务函数地址。。。以此类推)。然后要把它全部复制到0x08000000地址开头的内存(0x08000000这个数字是stm32启动文件执行之后将向量表转移的地方,至于为什么转移,可能是因为代码段是从0x08000000开始的)。总之,中断向量表就是按照0号 1号中断 2号中断 3号中断。。。这样的顺序将各自的中断服务函数存放。优先级也是按照类似的方式存放。
3,存放优先级
以0xe000e400开始,按照字节存放优先级。
4,使能相应中断。
二,stm32实验
LDR R0, =0xE000ED0C
LDR R1, =0x05FA0500
STR R1, [R0]
; LDR R0, =0x000000b0
; LDR R1, =alun3
; STR R1, [R0]
LDR R0, =0xE000E100
LDR R1, =0x10000000
STR R1, [R0]
BX LR
屏蔽的部分原本是为了将中断向量表中的TIM2_IRQHandler的地址换成我自己编写的中断服务函数,结果不知道什么原因在0x00000000和0x08000000开始的连续的内存单元里面无法写入,执行完STR R1,[R0]
之后内存没有变化,程序进入HardFault_Handler这个函数中(这是中断号为3的中断,由截图可以看出)。如果把其去掉,能正常运行(工能和用stm32库函数写的一样,感觉中断向量表被stm32的启动文件固定过,无妨更改其中的数据)。