五、NVIC
中断向量嵌套控制器是用来管理所有中断和事件的,包括中断的使能和除能,中断的优先级。这个是属于内核的东西,所以ST的参考手册上对它的描述较少,但他又是十分重要的东西,要了解它就要看ARM的《Cortex?-M4 Devices Generic User Guide》。
相关寄存器译自《Cortex?-M4 Devices Generic UserGuide》,若有错误,请以原文为准。
中断使能寄存器NVIC_ISER[8] 中断使能寄存器共有8个,ISER[0]设置0~31号中断的使能,ISER[1]设置32~63号中断的使能,如此类推。以下以ISER[0]为例:
[31:0] SETENA中断设置使能位。 如果要使能0号中断,就向该寄存器的0位写1,如果要使能38号中断,就向NVIC_ISER[1]的6位写1,如此类推,至于哪个中断对应哪个中断号,请参见参考手册《RM0090 Reference manual》中的第9章Table 30. Vector table的Position一列。
中断除能寄存器NVIC_ICER[8] 中断除能寄存器共有8个,ICER[0]设置0~31号中断除能,ICER[1]设置32~63号中断的使能,如此类推。以下以ICER[0]为例:
[31:0] SETENA中断设置使能位。 以下寄存器均为8个,仅以***R[0]为例
中断挂起设置寄存器NVIC_ISPR[8]
[31:0]SETPEND中断挂起设置位。
解除中断挂起寄存器NVIC_ICPR[8]
[31:0] CLRPEND中断清除挂起位。
中断激活位寄存器NVIC_IABR[8]
[31:0]中断活跃的标志: 如果相应的中断的状态是作为一个活跃的或活跃和正被挂起的,读该位将会读出1。
中断优先级寄存器NVIC_IPR[60]
中断优先级寄存器为60个32位寄存器,st的结构体中用了240个8位的字节数组NVIC->IP[240]来映射,每一个对应一个中断的优先级。 ARM的中断优先级分两种,抢占优先级和响应优先级。 具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以嵌套低抢占式优先级的中断。 当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。 中断优先级分组就是把优先级寄存器分割,分开哪几位是响应优先级,哪几位是抢占优先级。至于怎样设置分组,就要看一个不属于NVIC的寄存器了。
应用中断和复位控制寄存器SCB_AIRCR
在这里我们需要看的是[31:16]位和[10:8]位,[31:16]位是识别码,用以保护此寄存器不会被意外修改,[10:8]位就是中断优先级分组的设置位。 [31:16] 写:VECTKEYSTAT
[10:8]中断优先级
每一个ARM的M4中断优先级设计为可编程的8位,具体到stm32f4就只留给用户4位共16级的可编程优先级,其中低4位已被占用。也就是说stm32f4的优先级分组情况如下表所示:
最后一个NVIC的寄存器 软件触发中断寄存器NVIC_STIR
当SCB_CCR的USERSETMPEND位为1时,无特权的用户程序才能写此寄存器。 [31:9]保留。
|
|