简介
NVIC(Nested Vectored Interrupt Controller,嵌套向量中断控制器)是 Cortex-M4 内核中的中断控制器,用于管理所有中断和异常。STM32F407 系列芯片基于 Cortex-M4 内核,配备了功能强大的 NVIC,支持多达 82 个中断源,支持中断优先级分组、中断嵌套、中断屏蔽等功能,是实现实时系统的关键组件。本文从 NVIC 的基本原理出发,详细讲解 STM32F407 NVIC 的配置方法、代码实现、中断管理以及实际应用案例,帮助你快速掌握 NVIC 的使用技巧。
一、NVIC核心概念与分类
1.1 基本概念
NVIC 是 Cortex-M4 内核中的中断控制器,其主要特点包括:
- 多中断源:支持多达 82 个中断源
- 优先级分组:支持 16 级优先级,可灵活分组
- 中断嵌套:高优先级中断可以打断低优先级中断
- 中断屏蔽:支持全局中断屏蔽和单个中断屏蔽
- 自动上下文保存:自动保存和恢复 CPU 上下文
关键参数:
- 中断优先级:16 级优先级(0-15),0 为最高优先级
- 优先级分组:抢占优先级和子优先级的分组方式
- 中断向量:每个中断对应一个中断向量
- 中断挂起:记录中断的状态
1.2 STM32F407 的 NVIC 资源
STM32F407 系列芯片基于 Cortex-M4 内核,配备了功能强大的 NVIC:
| 功能 | 特性 |
|---|---|
| 中断源数量 | 82 个中断源 |
| 优先级级别 | 16 级优先级(0-15) |
| 优先级分组 | 5 种分组方式(0-4) |
| 中断嵌套 | 支持中断嵌套 |
| 中断屏蔽 | 支持全局中断屏蔽和单个中断屏蔽 |
| 中断挂起 | 支持中断挂起和清除 |
中断源分类:
- 系统异常:包括 NMI、HardFault、MemManage、BusFault、UsageFault 等
- 外部中断:包括 WWDG、PVD、TAMPER、RTC、FLASH、RCC、EXTI、DMA、ADC、USART、SPI、I2C、TIM、CAN、USB、ETH 等
关键特性:
- 支持 16 级优先级
- 支持中断优先级分组
- 支持中断嵌套
- 支持中断屏蔽
- 支持中断挂起
- 支持自动上下文保存
二、NVIC工作原理
2.1 基本工作原理
NVIC 的基本工作原理是管理所有中断和异常,根据优先级决定中断响应顺序。
工作流程:
- 外设或外部事件触发中断
- NVIC 接收中断请求
- NVIC 根据优先级决定是否响应中断
- 如果中断优先级高于当前执行的优先级,NVIC 响应中断
- CPU 自动保存上下文,跳转到中断服务函数
- 中断服务函数执行完毕,CPU 自动恢复上下文,继续执行被打断的任务
2.2 优先级分组
NVIC 支持 5 种优先级分组方式:
分组方式0:
- 抢占优先级:0 位
- 子优先级:4 位
- 优先级范围:0-15
分组方式1:
- 抢占优先级:1 位
- 子优先级:3 位
- 抢占优先级范围:0-1
- 子优先级范围:0-7
分组方式2:
- 抢占优先级:2 位
- 子优先级:2 位
- 抢占优先级范围:0-3
- 子优先级范围:0-3
分组方式3:
- 抢占优先级:3 位
- 子优先级:1 位
- 抢占优先级范围:0-7
- 子优先级范围:0-1
分组方式4:
- 抢占优先级:4 位
- 子优先级:0 位
- 抢占优先级范围:0-15
- 子优先级范围:0
2.3 中断嵌套
NVIC 支持中断嵌套,高优先级中断可以打断低优先级中断。
中断嵌套规则:
- 抢占优先级高的中断可以打断抢占优先级低的中断
- 抢占优先级相同的中断不能互相打断
- 抢占优先级相同的中断,子优先级高的先响应
- 抢占优先级和子优先级都相同的中断,中断号小的先响应
三、NVIC配置与代码实现
3.1 标准库配置步骤
使用标准库配置 NVIC 的基本步骤:
- 配置优先级分组
- 配置中断优先级
- 使能中断
3.2 代码实现(优先级分组方式2)
#include"stm32f4xx.h"/** * @brief 初始化NVIC * @param 无 * @retval 无 */voidNVIC_Init_Config(void){NVIC_InitTypeDef NVIC_InitStructure;// 1. 配置优先级分组方式2(2位抢占优先级,2位子优先级)NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2)