NVIC简介
NVIC(Nested Vectored Interrupt Controller),中断嵌套向量控制器,是 Cortex‐M3 不可分离的一部分,它与 CM3 内核共同完成对中断的响应。在了解NVIC之前最好简单了解一下CM3内核的中断系统,传送。
NVIC 共支持 1 至 240 个外部中断输入(通常外部中断写作 IRQn),每个中断有最高256(最低8)级的优先级,具体的中断数和优先级级数由芯片厂商在设计芯片时决定(STM32F1支持60个外部中断,16级优先级)。此外,NVIC 还支持一个“永垂不朽”的不可屏蔽中断(NMI)输入。NMI 的实际功能亦由芯片制造商决定。在某些情况下,NMI 无法由外部中断源控制。
NVIC相关寄存器
在内核文件core_cm3.h中定义了NVIC相关的寄存器,
/** @addtogroup CMSIS_CM3_NVIC CMSIS CM3 NVIC
memory mapped structure for Nested Vectored Interrupt Controller (NVIC)
@{
*/
typedef struct
{
__IO uint32_t ISER[8]; /*!< Offset: 0x000 Interrupt Set Enable Register */
uint32_t RESERVED0[24];
__IO uint32_t ICER[8]; /*!< Offset: 0x080 Interrupt Clear Enable Register */
uint32_t RSERVED1[24];
__IO uint32_t ISPR[8]; /*!< Offset: 0x100 Interrupt Set Pending Register */
uint32_t RESERVED2[24];
__IO uint32_t ICPR[8]; /*!< Offset: 0x180 Interrupt Clear Pending Register */
uint32_t RESERVED3[24];
__IO uint32_t IABR[8]; /*!< Offset: 0x200 Interrupt Active bit Register */
uint32_t RESERVED4[56];
__IO uint8_t IP[240]; /*!< Offset: 0x300 Interrupt Priority Register (8Bit wide) */
uint32_t RESERVED5[644];
__O uint32_t STIR; /*!< Offset: 0xE00 Software Trigger Interrupt Register */
} NVIC_Type;
/*@}*/ /* end of group CMSIS_CM3_NVIC */
中断使能寄存器 ISER[8] (Interrupt Set-Enable Registers),前面提到CM3 内核支持 256 个中断,这里用 8 个 32 位寄存器来控制,每个位控制一个中断。写1使能该位中断,写0无效。
中断除能寄存器 ICER[8] (Interrupt Clear-Enable Registers),该寄存器组与 ISER 的作用恰好相反,是用来清除某个中断的使能的。写1清除相应位中断,写0无效。
中断挂起寄存器 ISPR[8] (Interrupt Set-Pending Registers),每个位对应的中断和 ISER 是一样的。通过置 1,可以将正在进行的中断挂起,而执行同级或更高级别的中断。写0无效。
中断解挂寄存器 ICPR[8] (Interrupt Clear-Pending Registers),其作用与 ISPR 相反,对应位也和 ISER 是一样的。写1解挂,写0无效。
中断激活标志位寄存器 IABR[8] (Interrupt Active Bit Registers),只读寄存器,对应位所代表的中断和 ISER 一样,如果为 1,表示该位所对应的中断正在被执行,中断执行完由硬件自动清零。
中断优先级控制的寄存器 IP[240] (Interrupt Priority Registers),与中断分组密切相关,由 240 个 8bit 的寄存器组成,每个可屏蔽中断占用 8bit,最多共可表示 240 个可屏蔽中断(STM32 只用到了其中的前 60 个,IP[59]~IP[0]分别对应中断 59~0)。每个可屏蔽中断占用的 8bit 并没有全部使用,STM32只用了 4位(高四位[7:4],MSB),这 4 位又分为抢占优先级和子优先级,而这两个优先级各占几个位又要根据 SCB->AIRCR 中的中断分组设置来决定。
应用中断和复位控制寄存器 SCB_AIRCR
[10:8]位就是中断优先级分组的设置位。
这里再啰嗦一遍
中断优先级配置
中断优先级分组相关函数在misc.c/h文件中
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)//设置中断优先级分组
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct) //针对每个特定的中断设置抢占优先级和响应优先级
配置步骤
1.在主函数使用NVIC_PriorityGroupConfig()函数初始化的部分设置中断优先级分组,没有特殊情况的话,一般为分组2,即2位抢占优先级,2位响应优先级。
可选参数
NVIC_PriorityGroup_0 // 0位抢占优先级,4位响应优先级
NVIC_PriorityGroup_1 // 1位抢占优先级,4位响应优先级
NVIC_PriorityGroup_2
NVIC_PriorityGroup_3
NVIC_PriorityGroup_4 // 4位抢占优先级,1位响应优先级
2. 针对每个中断,使用NVIC_Init() 函数设置对应的抢占优先级和响应优先级。
参数为NVIC初始化结构体,其定义如下,包含的参数为:中断请求通道NVIC_IRQChannel、抢占优先级NVIC_IRQChannelPreemptionPriority、响应优先级(亚优先级)NVIC_IRQChannelSubPriority、中断通道使能控制NVIC_IRQChannelCmd。
typedef struct
{
uint8_t NVIC_IRQChannel; /*!< Specifies the IRQ channel to be enabled or disabled.
This parameter can be a value of @ref IRQn_Type
(For the complete STM32 Devices IRQ Channels list, please
refer to stm32f10x.h file) */
uint8_t NVIC_IRQChannelPreemptionPriority; /*!< Specifies the pre-emption priority for the IRQ channel
specified in NVIC_IRQChannel. This parameter can be a value
between 0 and 15 as described in the table @ref NVIC_Priority_Table */
uint8_t NVIC_IRQChannelSubPriority; /*!< Specifies the subpriority level for the IRQ channel specified
in NVIC_IRQChannel. This parameter can be a value
between 0 and 15 as described in the table @ref NVIC_Priority_Table */
FunctionalState NVIC_IRQChannelCmd; /*!< Specifies whether the IRQ channel defined in NVIC_IRQChannel
will be enabled or disabled.
This parameter can be set either to ENABLE or DISABLE */
} NVIC_InitTypeDef;
设置定时器3的抢占优先级举例如下:
主函数中;
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2: 2位抢占优先级,2位响应优先级
//×××_Int_Init(); 代码:外设中断配置函数
while(1)
{
//...
}
}
中断配置函数×××_Int_Init() 中:
×××_Int_Init()
{
NVIC_InitTypeDef NVIC_InitStructure;
//Device Init 代码:外设的初始化配置
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级0级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //从优先级3级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器
//Enable Device 代码:使能外设
}
上一篇:STM32-USART串口通信【USART和UART的区别】
下一篇:STM32-异常与中断
推荐阅读最新更新时间:2024-11-17 11:27
推荐帖子
- 【麦昆试用】主要功能对应驱动引脚
- 因为没有原理图,初步整理了一下microbit对应麦昆的功能,方便大家使用。左LEDP8右LEDP12红外接收器P16超声波传感器P1、P2蜂鸣器P0左寻线传感器P13右寻线传感器P14WS2812P15电机I2C(P19、P20)【麦昆试用】主要功能对应驱动引脚电机用P19,P20?2路电机吗 2路电机,通过I2C控制。是什么驱动芯片? 参考这个帖子:https://bbs.eeworld.com.cn/t
- dcexpert MicroPython开源版块
- 本周精彩博文分享
- TI参展2018年上海汽车灯具展览会TI在3月28日至29日于上海召开的十三届汽车灯具产业发展技术论坛暨第四届上海国际汽车灯具展览会(ALE)上展出了最新的汽车外部照明解决方案。ALE上海是一个年度汽车灯展,顶尖创新者和公司可在展会上分享汽车外部照明领域最新的技术。〉〉〉点击查看详情【超强技术干货来袭】工业、汽车18个终端应用解决方案各位“攻城狮”们!TI工程师精心整理了18篇技术解决方案,
- 橙色凯 模拟与混合信号
- 【DigiKey“智造万物,快乐不停”创意大赛】MAIX BIT KIT上“九子贤棋”的核心逻辑
- 正在调试九子贤棋的自动求解代码,发现有bug,修复后觉得有必要梳理一下规则的实现方法。这里贴一下lucky9starClass和调用求解方法的代码:#################################################################################lucky9starClass########################################
- nemon DigiKey得捷技术专区
- MC9S08DZ60做IIC从机的配置和程序
- MC9S08DZ60做IIC从机的初始化配置和程序,编程环境是codewarrior,C语言。MC9S08DZ60做IIC从机的配置和程序
- liulongzp NXP MCU
- 布局 线宽 间距 走线 泪滴 过孔 【快速提升PCB板Layout质量的6个细节】
- 前言现在很多的PCBLayout工程师都是按照硬件工程师或者PISI工程师给出的约束规则来完成布局布线的,俗称的拉线工。如不想被当做拉线工来看待。要具备一定的电路理解能与SI/PI工程师做PI/SI分析的能力。PCBLayout是一项技术活,也是经验活。学习一些有用的经验,往往可以让人受益匪浅。
- 成都亿佰特 PCB设计
- 【2024 DigiKey 创意大赛】 键鼠统一管家(1) 软件算法及实现
- #【2024DigiKey创意大赛】键鼠统一管家(1)软件算法及实现##1.引言我此次使用OPENMVH7开发板来实现人脸检测,并根据人脸中心位置与预设标定位置的比较来判断人脸朝向。因此在本文将介绍人脸识别算法原理、算法实现流程以及测试结果。##2.算法原理Haar级联分类器是一种用于对象检测的机器学习算法,由PaulViola和MichaelJones在2001年提出。它的核心思想是使用大量的正样本(包含人脸的图像)和负样本(不包含人脸的图像)来训练一个级联函数,这
- lzhan DigiKey得捷技术专区
设计资源 培训 开发板 精华推荐
- 板载DC-DC的USB PD控制器STUSB4710评估板
- AD9767-EBZ,AD9767数模转换器评估板
- AM1D-0509SH30-RZ 9V 1W DC-DC 转换器的典型应用
- CY3674、EZ-USB FX1 开发套件 (DVK) 是开发基于 FX2LP 8051 MCU 的 EZ-USB 的良好起点
- 【模拟电路】三极管恒压恒流电源
- RV4145A(3线)低功率接地故障断路器的典型GFI应用电路
- RSO-1209DZ ±9V、56mA输出DC/DC转换器的典型应用电路
- 使用 Infineon Technologies AG 的 OMR7815NH 的参考设计
- AM2G-4805SZ 5V 2 瓦 DC-DC 转换器的典型应用
- 用于有线网络的 5V 模拟放大