【STM32】NVIC(嵌套向量中断控制器)

news2025/3/16 5:40:09

什么是 NVIC?

NVIC(Nested Vectored Interrupt Controller,嵌套向量中断控制器) 适用于 Cortex-M0、M3、M4、M7 等 ARM 处理器,广泛用于 STM32、ESP32、GD32、NXP 等 MCU 中,它用于管理和控制中断,是 ARM Cortex-M 系列微控制器 的核心外设之一。NVIC 负责中断优先级管理、嵌套中断处理和中断向量跳转,使 Cortex-M 处理器能够高效地响应中断请求。

NVIC 主要功能
	1. 支持多个中断源(STM32F103 系列最多支持 60 个)
	2. 支持中断优先级管理(可配置 8~256 级优先级)
	3. 支持中断嵌套(高优先级中断可打断低优先级中断)
	4. 支持向量表偏移(Vector Table Offset Register, VTOR)
	5. 支持低功耗中断唤醒(Wake-up Interrupt Controller, WIC)
	6. 支持中断屏蔽、清除、挂起和使能
NVIC 与 Cortex-M 处理器紧密集成,能够 `直接与 CPU 交互`,实现高效的中断处理机制:
	NVIC 负责中断管理,Cortex-M3/M4 使用 NVIC 进行中断分配,支持快速中断响应(低延迟),支持 Tail-Chaining(尾链接优化),减少中断切换开销。

📌 NVIC 架构示意图:

			+-----------------------------------+
            |          Cortex-M 内核           |
            +-----------------------------------+
            |           NVIC 控制器           |
            |  - 中断向量表 (Vector Table)     |
            |  - 优先级寄存器 (IPR)            |
            |  - 使能寄存器 (ISER)             |
            |  - 清除寄存器 (ICER)             |
            |  - 挂起寄存器 (ISPR / ICPR)      |
            |  - 系统控制寄存器 (AIRCR)         |
            +-----------------------------------+
            |         外设(UART, GPIO, TIM)  |
            +-----------------------------------+

NVIC 寄存器

STM32F103 及其他 Cortex-M 系列 MCU 中,NVIC 主要通过以下寄存器进行控制:

寄存器作用
ISER(中断使能寄存器)设置某个中断为“使能”状态
ICER(中断清除寄存器)关闭某个中断
ISPR(中断挂起寄存器)设置某个中断为“挂起”状态(软件触发)
ICPR(中断清除挂起寄存器)取消某个中断的挂起状态
IABR(中断激活状态寄存器)读取当前激活的中断
IPR(中断优先级寄存器)设置中断优先级
STIR(软件触发中断寄存器)手动触发一个中断(仅限 Cortex-M3/M4)

NVIC 中断优先级管理

1. 中断优先级划分

NVIC 采用 8 位优先级字段,在不同的 STM32 设备中,实际使用的优先级位数可能不同:

  • NVIC 采用 分组优先级(Group Priority)+ 子优先级(Sub Priority) 机制
    • 分组优先级(Preempt Priority):决定中断是否可以抢占其他中断。
    • 子优先级(Sub Priority):当多个相同分组优先级的中断发生时,决定处理顺序。

📌 优先级编码格式(STM32F103,4-bit)

| 4-bit 优先级字段 |  |
|-----------------|  
|  Preemption(4)  |  Sub(0)  |
  • 数值越小,优先级越高(0 最高,255 最低)。
  • 抢占优先级高的中断可以中断低优先级的中断。

2. NVIC 优先级配置示例

使用 CMSIS(Cortex Microcontroller Software Interface Standard) 提供的函数可以轻松配置 NVIC:

#include "stm32f10x.h"

// 配置中断优先级
void NVIC_Configuration(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;

    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;  // 选择 USART1 中断
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;  // 抢占优先级 1(数值小,优先级高)
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;  // 子优先级 1
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  // 使能中断
    NVIC_Init(&NVIC_InitStructure);
}

// USART1_IRQn:定义要配置的中断源
// NVIC_IRQChannelPreemptionPriority:设置抢占优先级
// NVIC_IRQChannelSubPriority:设置子优先级
// NVIC_IRQChannelCmd:使能该中断

示例二:Cortex-M 配置优先级:

void NVIC_SetPriority_Config(void) {
    NVIC_SetPriorityGrouping(2);  // 2 位抢占,2 位子优先级
    NVIC_SetPriority(EXTI0_IRQn, NVIC_EncodePriority(2, 1, 1));
}

3. NVIC 优先级分组

通过 SCB->AIRCR 配置 优先级分组

分组模式抢占优先级位数子优先级位数适用场景
0b000(Group 0)0 位4 位适用于无抢占,所有中断按优先级顺序执行
0b100(Group 1)1 位3 位适用于少量高优先级抢占中断
0b101(Group 2)2 位2 位适用于多级抢占
0b110(Group 3)3 位1 位适用于实时系统,多级抢占
0b111(Group 4)4 位0 位适用于完全抢占,所有中断可被更高优先级中断打断

示例:高优先级中断打断低优先级中断:

📌 在 NVIC 配置中

EXTI0_IRQn 抢占优先级 0
TIM2_IRQn 抢占优先级 2
	➡ 当 TIM2 在运行时,EXTI0 可以抢占 TIM2。
void TIM2_IRQHandler(void) {
    // 低优先级中断(定时器中断)
    if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) {
        TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
    }
}

void EXTI0_IRQHandler(void) {
    // 高优先级中断(外部中断)
    if (EXTI_GetITStatus(EXTI_Line0) != RESET) {
        EXTI_ClearITPendingBit(EXTI_Line0);
    }
}

NVIC 低功耗管理

NVIC 具备低功耗模式下的中断唤醒功能:

  • 睡眠模式(Sleep Mode):等待中断(WFI)或事件(WFE)唤醒。
  • 停止模式(Stop Mode):只有特定外设(如 RTC、EXTI)可唤醒。
  • 待机模式(Standby Mode):最低功耗模式,仅通过外部中断(EXTI)或 RTC 唤醒。

示例代码(使用 WFI 指令进入低功耗模式):

void Enter_SleepMode(void)
{
    __WFI();  // 等待中断唤醒
}

不过,在某些情况下,可以通过软件触发中断(不依赖外部事件):

NVIC_SetPendingIRQ(EXTI0_IRQn);  // 触发 EXTI0 中断挂起

// 应用场景:
// 手动测试中断处理函数
// 在任务调度器中强制触发某个中断

NVIC 相关 API(CMSIS)

函数作用
NVIC_EnableIRQ(IRQn_Type IRQn) 使能指定中断
NVIC_DisableIRQ(IRQn_Type IRQn)禁用指定中断
NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)设置中断优先级
NVIC_GetPriority(IRQn_Type IRQn)获取当前中断优先级
NVIC_SetPendingIRQ(IRQn_Type IRQn)触发中断挂起
NVIC_ClearPendingIRQ(IRQn_Type IRQn)清除中断挂起
NVIC_GetPendingIRQ(IRQn_Type IRQn)获取中断挂起状态
NVIC_GetActive(IRQn_Type IRQn)读取当前激活的中断

NVIC 是 ARM Cortex-M 系列的核心中断管理单元,支持多级中断嵌套、优先级分配和中断屏蔽,合理配置 NVIC 优先级,可以提高系统的实时性和响应速度,掌握 NVIC 操作 API(使能/禁用/挂起/清除)在嵌入式开发是十分重要的一环。它支持 60+ 中断源,最高 256 级优先级; 支持抢占式优先级调度,优化中断响应;支持低功耗模式唤醒,适用于电池供电设备;提供 CMSIS API,简化 NVIC 配置,可以利用 NVIC 提高 STM32 应用的实时性,优化中断的处理机制。

以上。仅供学习与分享交流,请勿用于商业用途!转载需提前说明。

我是一个十分热爱技术的程序员,希望这篇文章能够对您有帮助,也希望认识更多热爱程序开发的小伙伴。
感谢!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2315816.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux中Gdb调试工具常用指令大全

1.gdb的安装 如果你是root用户直接用指令 :yum install gdb ;如果你是普通用户用指令:sudo yum install gdb; 2.gdb调试前可以对你的makefile文件进行编写: 下面展示为11.c文件编写的makefile文件: code…

操作系统-八股

进程基础: 进程定义:运行中的程序,有独立的内存空间和地址,是系统进行资源调度和分配的基本单位。 并发,并行 并发就是单核上面轮询,并行就是同时执行(多核); 进程上下…

ICLR2025 | SLMRec: 重新思考大语言模型在推荐系统中的价值

note 问题背景:序列推荐(SR)任务旨在预测用户可能的下一个交互项目。近年来,大型语言模型(LLMs)在SR系统中表现出色,但它们巨大的规模使得在实际平台中应用变得低效和不切实际。 研究动机&…

71.HarmonyOS NEXT PicturePreviewImage组件深度剖析:从架构设计到核心代码实现

温馨提示:本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦! HarmonyOS NEXT PicturePreviewImage组件深度剖析:从架构设计到核心代码实现 (一) 文章目录 HarmonyOS NEXT PicturePreviewImage组件深…

简单实现京东登录页面

Entry Component struct Index {State message: string ;build() { Column(){//顶部区域Row(){Image($r(app.media.jd_cancel)).width(20).height(20)Text(帮助)}.width(100%).justifyContent(FlexAlign.SpaceBetween)//logo图标Image($r(app.media.jd_logo)).width(250).heig…

9.贪心算法

简单贪心 1.P10452 货仓选址 - 洛谷 #include<iostream> #include<algorithm> using namespace std;typedef long long LL; const int N 1e510; LL a[N]; LL n;int main() {cin>>n;for(int i 1;i < n;i)cin>>a[i];sort(a1,a1n);//排序 LL sum 0…

大模型训练全流程深度解析

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。https://www.captainbed.cn/north 文章目录 1. 大模型训练概览1.1 训练流程总览1.2 关键技术指标 2. 数据准备2.1 数据收集与清洗2.2 数据…

每日一题---单词搜索(深搜)

单词搜索 给出一个二维字符数组和一个单词&#xff0c;判断单词是否在数组中出现&#xff0c; 单词由相邻单元格的字母连接而成&#xff0c;相邻单元指的是上下左右相邻。同一单元格的字母不能多次使用。 数据范围&#xff1a; 0 < 行长度 < 100 0 < 列长度 <…

插入排序c++

插入排序的时间复杂度为O&#xff08;N^2&#xff09;&#xff0c;和冒泡排序的时间复杂度相同&#xff0c;但是在某些情况下插入排序会更优。 插入排序的原理是&#xff1a;第1次在0~0范围内排序&#xff0c;第2次在0~1范围内排序&#xff0c;第3次在0~2范围内排序……相当于…

Swagger 从 .NET 9 中删除:有哪些替代方案

微软已经放弃了对 .NET 9 中 Swagger UI 包 Swashbuckle 的支持。他们声称该项目“不再由社区所有者积极维护”并且“问题尚未得到解决”。 这意味着当您使用 .NET 9 模板创建 Web API 时&#xff0c;您将不再拥有 UI 来测试您的 API 端点。 我们将调查是否可以在 .NET 9 中使用…

嵌入式八股ARM篇

前言 ARM篇主要介绍一下寄存器和中断机制,至于汇编这一块…还请大家感兴趣自行学习 1.寄存器 R0 - R3 R4 - R11 寄存器 R0 - R3一般用作函数传参 R4 - R11用来保存程序运算的中间结果或函数的局部变量 在函数调用过程中 注意在发生异常的时候 cortex-M0架构会自动将R0-R3压入…

使用DeepSeek和墨刀AI,写PRD文档、画原型图的思路、过程及方法

使用DeepSeek和墨刀AI&#xff0c;写PRD文档、画原型图的思路、过程及方法 现在PRD文档要如何写更高效、更清晰、更完整&#xff1f; 还是按以前的思路写PRD&#xff0c;就还是以前的样子。 现在AI这么强大&#xff0c;产品经理如何使用DeepSeek写PRD文档&#xff0c;产品经…

【VUE2】第五期——VueCli创建项目、Vuex多组件共享数据、json-server——模拟服务端api

黑马程序员视频地址&#xff1a;091-vuex的基本认知_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1HV4y1a7n4?vd_source0a2d366696f87e241adc64419bf12cab&spm_id_from333.788.videopod.episodes&p91 目录 1 VueCli 自定义创建项目 2 Eslint代码规范 2.1 规…

rpmlib(SetVersions) is needed by can-uilts-v2019.00.0-alt1.aarch64

在我在Linux中安装离线CAN工具时&#xff0c;出现了一个问题&#xff0c; rootwanghuo:~# rpm -ivh can-uilts-v2019.00.0-alt1.aarch64.rpm error: Failed dependencies:rpmlib(SetVersions) is needed by can-uilts-v2019.00.0-alt1.aarch64 意思是尝试安装 can-uilts-v20…

CNN 稠密任务经典结构

FCN UNet FPN FCNUNETFPNpadding无&#xff08;逐渐变小&#xff09; 有&#xff08;左右对称&#xff09;上采样 双线性双线性 最近邻跳跃链接 相加 Cropcat 1x1卷积相加 三个网络差不多&#xff0c;UNet名字最直观&#xff0c;后续流传…

算法刷题整理合集(二)

本篇博客旨在记录自已的算法刷题练习成长&#xff0c;里面注有详细的代码注释以及和个人的思路想法&#xff0c;希望可以给同道之人些许帮助。本人也是算法小白&#xff0c;水平有限&#xff0c;如果文章中有什么错误或遗漏之处&#xff0c;望各位可以在评论区指正出来&#xf…

STM32配套程序接线图

1 工程模板 2 LED闪烁 3LED流水灯 4蜂鸣器 5按键控制LED 6光敏传感器控制蜂鸣器 7OLED显示屏 8对射式红外传感器计次 9旋转编码器计次 10 定时器定时中断 11定时器外部时钟 12PWM驱动LED呼吸灯 13 PWM驱动舵机 14 PWM驱动直流电机 15输入捕获模式测频率 16PWMI模式测频率占空…

Houdini学习笔记

1. Houdini中一次只能显示一个物体 如果要都显示 需要 merge 节点 粉色的是 以参考显示 2.对任意一个节点按F1 可以弹出houdini官方文档 3. 恢复视角 Space H,居中 Space G 居中选中物体

仿Ant Design Vue风格自定义浏览器滚动条样式

仿Ant Design Vue风格自定义浏览器滚动条样式 问题原因 浏览器默认的滚动条样式很丑&#xff0c;无法满足需求&#xff0c;需要自定义滚动条样式&#xff0c;参考ant-design-vue的样式 css修改滚动相关属性可查阅官方文档 选择器介绍 ::webkit-scrollbar&#xff1a;滚动条…

单元测试、系统测试、集成测试、回归测试的步骤、优点、缺点、注意点梳理说明

单元测试、系统测试、集成测试、回归测试的梳理说明 单元测试 步骤&#xff1a; 编写测试用例&#xff0c;覆盖代码的各个分支和边界条件。使用测试框架&#xff08;如JUnit、NUnit&#xff09;执行测试。检查测试结果&#xff0c;确保代码按预期运行。修复发现的缺陷并重新测…