STM32 NVIC驱动开发:中断控制器与优先级管理的权威指南
发布时间: 2024-07-05 12:19:12 阅读量: 6 订阅数: 8 ![](https://csdnimg.cn/release/wenkucmsfe/public/img/col_vip.0fdee7e1.png)
![](https://csdnimg.cn/release/wenkucmsfe/public/img/col_vip.0fdee7e1.png)
![STM32 NVIC驱动开发:中断控制器与优先级管理的权威指南](https://a.perfma.net/img/4513481)
# 1. STM32 NVIC概述**
**1.1 NVIC简介**
NVIC(嵌套向量中断控制器)是STM32微控制器中负责管理中断的模块。它是一个硬件外设,提供对中断向量表、中断使能/禁止和中断优先级的控制。NVIC允许微控制器响应各种事件,例如外设请求、错误或外部中断。
**1.2 NVIC架构与工作原理**
NVIC由多个寄存器组成,用于配置和控制中断。主要寄存器包括:
* **NVIC_ISERx:**中断使能寄存器,用于使能特定中断。
* **NVIC_ICERx:**中断禁止寄存器,用于禁止特定中断。
* **NVIC_IPRx:**中断优先级寄存器,用于设置特定中断的优先级。
* **NVIC_STIR:**软件触发中断寄存器,用于手动触发中断。
* **NVIC_ICSR:**中断控制器状态寄存器,提供中断状态信息。
# 2. NVIC中断控制器编程
### 2.1 中断向量表
**中断向量表**是一段存储在固定地址的代码区域,它包含了所有中断处理程序的入口地址。当一个中断发生时,处理器会跳转到中断向量表中相应的中断处理程序地址处执行中断处理代码。
**STM32中断向量表结构**
STM32的中断向量表位于地址0x00000000,它由以下部分组成:
* **复位向量:**位于地址0x00000000,当处理器复位时跳转到此地址执行复位处理代码。
* **非掩码中断向量:**位于地址0x00000004~0x0000001C,用于处理非掩码中断,如NMI、HardFault等。
* **掩码中断向量:**位于地址0x00000020~0x000003FC,用于处理掩码中断,如外部中断、定时器中断等。
### 2.2 中断使能与禁止
**中断使能**
要使能一个中断,需要设置NVIC寄存器中的使能位。对于掩码中断,可以使用`NVIC_EnableIRQ()`函数或直接操作NVIC寄存器:
```c
NVIC_EnableIRQ(IRQn);
```
其中`IRQn`为中断号,如`NVIC_IRQ_EXTI0`表示外部中断0。
**中断禁止**
要禁止一个中断,需要清除NVIC寄存器中的使能位。可以使用`NVIC_DisableIRQ()`函数或直接操作NVIC寄存器:
```c
NVIC_DisableIRQ(IRQn);
```
### 2.3 中断优先级管理
STM32的NVIC支持中断优先级管理,允许为每个中断分配一个优先级,从而决定中断处理的顺序。
#### 2.3.1 中断优先级分组
NVIC将中断优先级分为4个分组,每个分组包含8个子优先级。通过设置NVIC寄存器中的`IPR`(中断优先级寄存器)可以为每个中断分配一个优先级分组:
```c
NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);
```
其中`NVIC_PRIORITYGROUP_4`表示将中断优先级分为4个分组。
#### 2.3.2 中断优先级子组
在每个优先级分组内,中断又可以细分为8个子优先级。通过设置NVIC寄存器中的`IP`(中断优先级寄存器)可以为每个中断分配一个子优先级:
```c
NVIC_SetPriority(IRQn, NVIC_EncodePriority(NVIC_PRIORITYGROUP_4, 0, 0));
```
其中`IRQn`为中断号,`NVIC_PRIORITYGROUP_4`表示中断优先级分组为4,`0`表示子优先级为0。
### 2.4 中断嵌套
**中断嵌套**允许高优先级中断打断低优先级中断的执行。当一个高优先级中断发生时,当前正在执行的低优先级中断会被暂停,直到高优先级中断处理完毕。
**NVIC中断嵌套控制**
STM32的NVIC支持中断嵌套控制,通过设置NVIC寄存器中的`SHCSR`(系统处理控制和状态寄存器)可以控制中断嵌套:
```c
SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk;
```
其中`SCB_SHCSR_MEMFAULTENA_Msk`表示使能内存故障中断嵌套。
# 3.1 中断向量表的配置
#### 中断向量表概述
中断向量表是存储在 Flash 中的一组地址,用于将中断号映射到相应的中断服务程序 (ISR)。当发生中断时,NVIC 将根据中断号从向量表中获取 ISR 的地址,然后跳转到 ISR 执行。
#### 向量表配置步骤
STM32 的中断向量表位于 Flash 的起始地址 0x00000000。用户可以根据需要自定义向量
0
0
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)