中断向量嵌套控制器是用来管理所有中断和事件的,包括中断的使能和除能,中断的优先级。这个是属于内核的东西,所以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 =无影响
1 =使能中断。
读:
0 =中断是禁止的
1=中断已经被使能 如果要使能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中断设置使能位。
写:
0 =无影响
1 =除能中断。
读:
0 =中断是禁止的
1=中断已经被使能 以下寄存器均为8个,仅以***R[0]为例 中断挂起设置寄存器NVIC_ISPR[8]
[31:0]SETPEND中断挂起设置位。
写:
0 =无影响
1 =改变中断状态为挂起。
读:
0 =中断没有挂起
1 =中断正在等待处理。 解除中断挂起寄存器NVIC_ICPR[8]
[31:0] CLRPEND中断清除挂起位。
写:
0 =无影响
1 =删除中断的挂起状态。
读:
0 =没有挂起的中断
1 =中断正在等待处理。 中断激活位寄存器NVIC_IABR[8]
[31:0]中断活跃的标志:
0 =中断不活跃
1 =中断活跃。 如果相应的中断的状态是作为一个活跃的或活跃和正被挂起的,读该位将会读出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
读:VECTKEY
RW注册键:
读为0xFA05
写入时,要写0x05FA到 VECTKEY,否则写入将被忽略。 [10:8]中断优先级
每一个ARM的M4中断优先级设计为可编程的8位,具体到stm32f4就只留给用户4位共16级的可编程优先级,其中低4位已被占用。也就是说stm32f4的优先级分组情况如下表所示: [10:8] | 分割点 | 抢占优先级位 | 响应优先级位 | 抢占优先级数 | 响应优先级数 | 0b011 | xxxx | [7:4] | none | 16 | 1 | 0b100 | xxx.y | [7:5] | [4] | 8 | 2 | 0b101 | xx.yy | [7:6] | [5:4] | 4 | 4 | 0b110 | x.yyy | [7] | [6:4] | 2 | 8 | 0b111 | yyyy | none | [7:4] | 1 | 16 |
最后一个NVIC的寄存器 软件触发中断寄存器NVIC_STIR
当SCB_CCR的USERSETMPEND位为1时,无特权的用户程序才能写此寄存器。 [31:9]保留。
[8:0] INTID ID号中断触发,
范围0-239。例如,0x03的指定中断IRQ3触发。
|