stm32学习(3)——NVIC中断优先级分组

本文深入探讨STM32F103系列芯片的中断管理系统,对比51单片机中断,详细介绍STM32的60个可屏蔽中断及其NVIC中断优先级分组机制。文章解析了抢占优先级与响应优先级的概念,以及如何通过函数设置中断优先级,为读者提供STM32中断管理的全面指南。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

相信大多数铁汁在学习stm32的时候都了解过51单片机的基本内容,对于51单片机来说,中断就那么几个:

  1. 外部中断0
  2. 定时器/计数器0中断
  3. 外部中断1
  4. 定时器/计数器1中断
  5. 串口中断

它们在51单片机中的优先级也是按自上而下的顺序,中断少且优先级明确,这就是大家了解的51单片机中断系统,又顺便复习了一波老知识。

而在stm32f103系列芯片中有60个可屏蔽中断(可屏蔽中断简单来说就是可以由寄存器控制是否产生中断的中断,skr~),从《stm32中文参考手册》中可以看到有这么0-59号一共60个可屏蔽中断。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

NVIC中断优先级分组

对于数量如此之多的中断源怎么来进行中断管理也是一个问题,但是stm32给出了很好地解决办法,NVIC中断优先级分组(NVIC不懂没关系,我也不懂,懂分组就行了)
在这里插入图片描述
从图中可以看到(application interrupt and reset control register应用中断和复位控制寄存器AIRCR[10:8]这三位,也就是下图中绿色的三位,由这三位共同决定分组配置。
在这里插入图片描述
还要了解抢占优先级与响应优先级的基本概念:

  1. 高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的
  2. 抢占优先级相同的中断,高响应优先级不可以打断低响应优先级的中断
  3. 抢占优先级相同的中断,当两个中断同时发生的情况下,哪个响应优先级高,哪个先执行
  4. 如果两个中断的抢占优先级和响应优先级都是一样的话,则看哪个中断先发生就先执行
  5. 优先级数字越小,优先级越高,越先被执行

了解了抢占与响应两个优先级的基本概念后再看上面的表就会发现,可以设置5中不同的优先级分组,每种都是4位也就是16种不同的优先级设置。

NVIC中断优先级设置

一般情况下,系统代码执行过程中,只设置一次中断优先级分组(并且是在main函数比较靠前的位置设置),设置好分组之后一般不会再改变分组。若是在多处进行了分组,程序会以最后一次的分组为准,并且之前设置的分组全部失效。随意改变分组会导致中断管理混乱,程序出现意想不到的执行结果。
在stm32中,关于NVIC优先级设置的函数都在misc.h里可以看到:

void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);
void NVIC_SetVectorTable(uint32_t NVIC_VectTab, uint32_t Offset);
void NVIC_SystemLPConfig(uint8_t LowPowerMode, FunctionalState NewState);
void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource);

在main函数中通常使用一个中断优先级分组设置函数

NVIC_PriorityGroupConfig();

//函数的入口参数可以选择这些,也就是对应上表的几种分组
#define IS_NVIC_PRIORITY_GROUP(GROUP) (((GROUP) == NVIC_PriorityGroup_0) || \
                                       ((GROUP) == NVIC_PriorityGroup_1) || \
                                       ((GROUP) == NVIC_PriorityGroup_2) || \
                                       ((GROUP) == NVIC_PriorityGroup_3) || \
                                       ((GROUP) == NVIC_PriorityGroup_4))

在单个中断设置抢占和响应优先级时通常用:

 NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);

//入口参数有三个
  assert_param(IS_FUNCTIONAL_STATE(NVIC_InitStruct->NVIC_IRQChannelCmd));		//中断使能
  assert_param(IS_NVIC_PREEMPTION_PRIORITY(NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority)); 		//抢占优先级设置 
  assert_param(IS_NVIC_SUB_PRIORITY(NVIC_InitStruct->NVIC_IRQChannelSubPriority));		//响应优先级设置

关于NVIC中断优先级分组的介绍就到这了,砰~,水遁消失。

### STM32F407 中断优先级配置 #### NVIC 的角色与功能 嵌套向量中断控制器(NVIC)作为STM32中负责中断管理的关键部分,具备多项重要特性。这些特性涵盖了中断优先级设定、中断使能/禁用操作以及支持更复杂的中断嵌套机制[^1]。 #### 优先级分组概念 为了更好地管理和区分不同类型的中断事件,STM32允许用户定义多个级别的优先权。具体来说,在STM32F4系列里,存在五种不同的优先级组合方式供开发者选择。这种灵活性使得应用程序能够更加精细地调整各个中断源的重要性顺序[^3]。 #### 寄存器层面的操作 实际的优先级数值存储于特定的一组寄存器——即中断优先级寄存器(IP),其编号范围从IP[0]到IP[240]不等。通过对这些寄存器写入适当的数据,就可以实现对各路中断请求的具体优先级别指定[^2]。 #### 配置实例展示 下面给出了一段用于设置NVIC中断分组至模式2的例子代码: ```c // 设置NVIC中断分组为2: 使用2位表示抢占优先级, 另外2位用来表达子优先级(响应优先级) NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); ``` 接着是对某个具体中断进行初始化的过程说明: ```c NVIC_InitTypeDef NVIC_InitStructure; // 假设我们要配置USART1全局中断 NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; // 抢占优先级设为1 NVIC📐⚗⚗ ⚗⚗⚗📐📐📐📐📐⚗⚗⚗📐📐📐📐📐⚗⚗⚗📐📐📐📐⚗⚗⚗📐📐📐📐⚗⚗⚗📐📐📐📐⚗⚗⚗📐📐⚗⚗⚗
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值