STM32 NVIC


NVIC


五、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 =无影响
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触发。



转载地址:https://blog.csdn.net/w471176877/article/details/7957174

### STM32 NVIC 配置及使用方法 #### 1. NVIC 的基本概念 NVIC 是嵌套向量中断控制器(Nested Vectored Interrupt Controller),它是 Cortex-M3/M4 内核的一部分,负责管理 STM32 微控制器中的中断请求。通过 NVIC,可以实现中断的优先级分配以及中断响应顺序的控制[^4]。 #### 2. 中断优先级分组 STM32 支持多级别的中断优先级设置,具体分为抢占优先级(Preemption Priority)和子优先级(Subpriority)。可以通过函数 `NVIC_PriorityGroupConfig()` 来配置优先级分组模式。该函数接受一个枚举类型的参数 `NVIC_PriorityGroup_X`,其中 X 表示不同的优先级分组方式[^3]。 以下是常见的优先级分组选项: - **NVIC_PriorityGroup_0**: 所有位都用于子优先级。 - **NVIC_PriorityGroup_1**: 1 位用于抢占优先级,3 位用于子优先级。 - **NVIC_PriorityGroup_2**: 2 位用于抢占优先级,2 位用于子优先级。 - **NVIC_PriorityGroup_3**: 3 位用于抢占优先级,1 位用于子优先级。 - **NVIC_PriorityGroup_4**: 所有位都用于抢占优先级。 例如,如果选择了 `NVIC_PriorityGroup_2`,则中断优先级由两位表示抢占优先级,两位表示子优先级。 #### 3. 设置中断优先级 在配置好优先级分组之后,需要为具体的中断源设置其优先级。这可以通过 HAL 库或者标准库中的宏来完成。以下是一个典型的代码示例: ```c // 假设我们选择的是 NVIC_PriorityGroup_2 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 为 USART1 中断设置优先级 NVIC_InitTypeDef NVIC_InitStruct; NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn; // 指定中断通道 NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1; // 抢占优先级 NVIC_InitStruct.NVIC_IRQChannelSubPriority = 2; // 子优先级 NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; // 启用中断 NVIC_Init(&NVIC_InitStruct); ``` 上述代码中,USART1 的中断被赋予了抢占优先级为 1 和子优先级为 2 的组合。 #### 4. 编码优先级值 对于更底层的操作,可以直接调用 `NVIC_EncodePriority` 函数编码优先级值并写入到对应的 IPR 寄存器中。IPR 寄存器存储了每个中断的优先级信息。例如: ```c uint32_t priorityValue = NVIC_EncodePriority(2, 1, 2); // 使用优先级分组 2,抢占优先级为 1,子优先级为 2 NVIC_SetPriority(USART1_IRQn, priorityValue); // 将计算好的优先级值应用到指定中断 ``` 这里需要注意,`NVIC_EncodePriority` 的第一个参数应与当前的优先级分组一致[^1]。 #### 5. 外部中断配置 除了内部外设产生的中断之外,还可以配置外部中断线。通常会涉及 EXTI 控制器的初始化以及关联的 GPIO 线路配置。完成后同样需要启用相应的中断并通过 NVIC 进行优先级设定[^2]。 --- ### 总结 通过对 NVIC 的合理配置,能够有效地管理和调度多个中断事件的发生次序及其重要程度。无论是简单的单片机项目还是复杂的实时操作系统环境,掌握 NVIC 的工作原理都是至关重要的技能之一。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值