NVIC (Nested Vector Interrupt Controller) 中断与应用详解


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_2NVIC_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(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值