文章目录
NVIC (Nested Vector Interrupt Controller) 中断与应用详解
NVIC(嵌套向量中断控制器)在 Cortex-M 系列的 STM32 微控制器中负责中断优先级的管理和中断嵌套。理解 NVIC 的核心功能和用法对于提高嵌入式系统的实时性和可靠性至关重要。本文将详细介绍 NVIC 的基础知识、优先级控制、中断服务设计以及 STM32 中的一些常见应用场景。
1. NVIC 基本概念与功能
NVIC 的主要作用是通过控制中断优先级来管理嵌套中断,使系统能更有效地处理不同优先级的任务。其核心特点包括:
- 多通道中断支持:提供 68 个可屏蔽中断通道,不包含 16 个 Cortex-M3 的内核中断。
- 可编程优先级:16 级优先级,每级用 4 位二进制表示,分为抢占优先级和响应优先级。
- 低延迟的中断处理:通过抢占控制使高优先级任务快速响应。
- 电源管理控制:可在中断响应时动态调整功耗。
- 系统控制寄存器:管理系统行为的关键寄存器。
2. 中断优先级的概念
NVIC 中断优先级分为 抢占优先级 和 响应优先级,共同决定中断的执行顺序:
- 抢占优先级:控制中断的嵌套层级。优先级高的中断可以打断优先级低的中断。
- 响应优先级:在抢占优先级相同的情况下,响应优先级高的中断会先被执行。
- 中断向量表的顺序:当两个挂起中断的优先级一致时,执行位置在中断向量表中较高的中断。
这种优先级控制方式有效管理了中断的嵌套与响应,确保高优先级任务的及时处理。
3. 中断优先级分组
优先级分组将 NVIC 的 4 位优先级分为抢占优先级和响应优先级两部分,用 HAL_NVIC_SetPriorityGrouping
设置:
Priority Group | 抢占优先级位数 | 响应优先级位数 | 用法 |
---|---|---|---|
NVIC_PRIORITYGROUP_0 | 0 | 4 | 只有响应优先级,无嵌套 |
NVIC_PRIORITYGROUP_1 | 1 | 3 | 一层抢占优先级,支持简单嵌套 |
NVIC_PRIORITYGROUP_2 | 2 | 2 | 支持中等程度嵌套 |
NVIC_PRIORITYGROUP_3 | 3 | 1 | 高度抢占控制 |
NVIC_PRIORITYGROUP_4 | 4 | 0 | 全抢占优先级,完全嵌套 |
示例
若系统中存在多个优先级任务(如传感器采集和通信任务),可以选择 NVIC_PRIORITYGROUP_2
或 NVIC_PRIORITYGROUP_3
来优化中断的抢占和嵌套控制:
// 设置优先级分组为 2,抢占优先级 2 位,响应优先级 2 位
HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_2);
4. 中断向量表 (Interrupt Vector Table)
中断向量表存储每个中断的入口地址,通常位于存储器的固定位置(STM32 默认起始地址为 0x0800_0000
)。在某些特殊应用中(如 Bootloader 和实时操作系统),开发者可能需要将向量表位置重定位,例如重定位到 RAM 中:
// 将中断向量表的基地址重新定位到 RAM 区域的起始地址
SCB->VTOR = 0x20000000;
这种重定位能够让系统在不同的代码段(如主程序和 Bootloader)间切换。
5. 优先级阈值与中断屏蔽
NVIC 支持设置中断优先级阈值,从而屏蔽低于该优先级的中断,避免低优先级中断干扰关键任务。可以通过 BASEPRI
寄存器设置屏蔽阈值:
// 将最低允许中断优先级设置为 3,屏蔽所有优先级低于 3 的中断
__set_BASEPRI(