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

什么是 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;  // 子优先级 1NVIC_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.rhkb.cn/news/33419.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jmeter下载及环境配置

Jmeter下载及环境配置 java环境变量配置配置jdk环境变量检查是否配置成功JMeter下载 java环境变量配置 访问地址: https://www.oracle.com/cn/java/technologies/downloads/ 注意:需要自己注册账号 下载完成,解压后的目录为: …

coze ai assistant Task 2

创建一个智能体:夸夸机器人 https://www.coze.cn/store/agent/7480939060010713138?bot_idtrue 改为豆包系列-豆包角色扮演 添加bingWebSearch搜索 添加前: 添加后: 改为工具调用: 添加知识库 使用长期记忆 结合自己的需求&…

Unity基于C#+UGUI解决方案,制作每日签到系统(本地存储签到数据)

一、需求介绍:基于本地存储系统制作一个每日签到系统界面,相关签到界面如下图所示,点击“签到有礼”按钮后就会跳转到“每日登录礼”这个界面,点击“立即签到”按钮之后,按钮就会置灰,而且按钮的文字会变成“等待明日”。 二、制作界面显示相关功能,需要在Unity中新建一…

多线程(超详细) (ε≡٩(๑>₃<)۶ 一心向学)

多线程目录 一、认识线程 1、概念: 1) 线程是什么 2) 线程为什么存在 3) 进程与线程的区别 二、创建线程 1、方法1:继承Thread类 2、方法2:实现 Runnable 接口 3、方法3:匿名内部类创建 Thread 子类对象 4、方法4&#…

SpringBoot——Maven篇

Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的工具。它具有许多特性,其中一些重要的特性包括: 1. 自动配置:Spring Boot 提供了自动配置的机制,可以根据应用程序的依赖和环境自动配置应用程序的各种组件&#xff…

中文大语言模型提示工程:解锁AI力量的密钥(完整优化版)

文章目录 **引言:AI时代的"咒语"革命****一、为什么中文提示工程是技术深水区?****1.1 中文的"模糊美学"挑战****1.2 文化认知鸿沟****1.3 分词歧义陷阱** **二、中文提示工程六脉神剑(附实战代码)****2.1 结…

C++中虚析构函数的作用是什么?为什么基类需要虚析构函数?

C中虚析构函数的作用是什么?为什么基类需要虚析构函数? 在C中,虚析构函数(virtual destructor)的作用是确保在通过基类指针或引用删除派生类对象时,能够正确调用派生类的析构函数,从而避免资源…

【C++项目实战】校园公告搜索引擎:完整实现与优化指南

🎬 个人主页:谁在夜里看海. 📖 个人专栏:《C系列》《Linux系列》《算法系列》 ⛰️ 道阻且长,行则将至 目录 📚一、项目概述 📖1.项目背景 📖2.主要功能 📖3.界面展…

大数据技术之Spark优化

第 1 章 Spark 性能调优 问:spark 优化 第一句:我们可以从性能,算子,shuffle 过程以及 jvm 四个方面展开优化。 1 常规性能调优 1.1 常规性能调优一:最优资源配置 Spark 性能调优的第一步,就是为任务分配更多的资源,在一定范围内,增加资源的分配与性能的提升是成正…

【 Manus平替开源项目】

文章目录 Manus平替开源项目1 OpenManus1.1 简介1.2 安装教程1.3 运行 2 OWL2.1 简介2.2 安装教程2.3 运行 3 OpenHands(原OpenDevin)3.1 简介3.2 安装教程和运行 Manus平替开源项目 1 OpenManus 1.1 简介 开发团队: MetaGPT 核心贡献者(5…

《Java SQL 操作指南:深入理解 Statement 用法与优化》

在 Java 数据库编程中,Statement 是用于执行 SQL 语句的接口,允许程序与数据库进行交互。本文将详细介绍 Statement 的基本概念、常见用法以及 PreparedStatement 和 CallableStatement 等相关接口。 1. Statement 基本介绍 Statement 接口继承了 AutoC…

FFMPEG录制远程监控摄像头MP4

手绘效果图 上图是录制功能的HTML前端页面,录制功能和解码视频放在一起。录制功能关键是录制(开始录制按钮)、停止录像按钮。当点击“录制”的时候则会开始录制MP4文件, 当点击停止的时候就会停止录制MP4。经过录制后,则会生成MP4,并放到我的RV1126的/tm…

数据类型及sizeof,进制转换

其实数据类型可以讲很多内容,这里看情况需要讲多久吧。 本篇基本都是理论。 目录 数据类型的分类 基本数据类型 构造数据类型 指针类型 空类型 计算数据类型或变量所占用的内存字节数 基本语法 进制转换 二进制 二进制的概念 二进制与十进制的转换 十六进…

网络安全之tcpdump工具

引言 wireshark是一款非常不错的抓包软件,在图形化界面占绝对统治地位;尽管其在字符界面下有些许选项可供使用,但终究不太方便,下面我再介绍一款NB的终端抓包工具 tcpdump 1、混杂模式 linux的网卡有混杂模式一说,当开…

建筑管理(2): 施工承包模式,工程监理,质量监督

文章目录 一. 施工承包模式1. 施工总承包模式1.1 施工总承包的特点1.2 施工总承包模式中的承包方 2. 平行承包模式3. 联合体与合作体承包模式 二. 工程监理1. 强制实行监理的工程范围1.1 国家重点建设工程1.2 大中型公用事业工程(重点)1.3 成片开发建设的住宅小区工程1.4 必须实…

[LeetCode热门100题]|137,260,268,面试17.19

1、137 只出现一次数字|| 1、题目描述 137 只出现一次数字||https://leetcode.cn/problems/single-number-ii/description/ 给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。 你…

MySQL中有哪几种锁?

大家好,我是锋哥。今天分享关于【MySQL中有哪几种锁?】面试题。希望对大家有帮助; MySQL中有哪几种锁? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在MySQL中,锁是用来控制并发访问的机制,确…

外贸企业可以申请网络专线吗?

在对外业务不断扩大的情况下,外贸企业对网络的需求愈发迫切。稳定、快速的网络连接不仅是企业开展国际业务的基础,更是提升竞争力的关键。外贸企业是否可以申请网络专线?如何选择适合的外贸网络专线服务?本文将为您详细解答。 网络…

python笔记2

变量:含义 一个容器,计算机当中的存储空间。 可以理解为一个用于标识或引用数据的名字或标签。 作用: 可以通过定义一个变量来给需要使用多次的数据命名,就像一个标签一样。下次需要使用这个数据时,只需要通过这个变…

【算法】动态规划

⭐️个人主页:小羊 ⭐️所属专栏:Linux 很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~ 目录 持续更新中...1、常规动态规划Fibonacci数列杨辉三角最小花费爬楼梯孩子们的游戏 2、背包问题3、最长公共子序列4、最长递增子序列…