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中断优先级分组的介绍就到这了,砰~,水遁消失。

### 解决PyCharm无法加载Conda虚拟环境的方法 #### 配置设置 为了使 PyCharm 能够成功识别并使用 Conda 创建的虚拟环境,需确保 Anaconda 的路径已正确添加至系统的环境变量中[^1]。这一步骤至关重要,因为只有当 Python 解释器及其关联工具被加入 PATH 后,IDE 才能顺利找到它们。 对于 Windows 用户而言,在安装 Anaconda 时,默认情况下会询问是否将它添加到系统路径里;如果当时选择了否,则现在应该手动完成此操作。具体做法是在“高级系统设置”的“环境变量”选项内编辑 `Path` 变量,追加 Anaconda 安装目录下的 Scripts 文件夹位置。 另外,建议每次新建项目前都通过命令行先激活目标 conda env: ```bash conda activate myenvname ``` 接着再启动 IDE 进入工作区,这样有助于减少兼容性方面的问题发生概率。 #### 常见错误及修复方法 ##### 错误一:未发现任何解释器 症状表现为打开 PyCharm 新建工程向导页面找不到由 Conda 构建出来的 interpreter 列表项。此时应前往 Preferences/Settings -> Project:...->Python Interpreter 下方点击齿轮图标选择 Add...按钮来指定自定义的位置。按照提示浏览定位到对应版本 python.exe 的绝对地址即可解决问题。 ##### 错误二:权限不足导致 DLL 加载失败 有时即使指定了正确的解释器路径,仍可能遇到由于缺乏适当的操作系统级许可而引发的功能缺失现象。特别是涉及到调用某些特定类型的动态链接库 (Dynamic Link Library, .dll) 时尤为明显。因此拥有管理员身份执行相关动作显得尤为重要——无论是从终端还是图形界面触发创建新 venv 流程均如此处理能够有效规避此类隐患。 ##### 错误三:网络连接异常引起依赖下载超时 部分开发者反馈过因网速慢或者其他因素造成 pip install 操作中途断开进而影响整个项目的初始化进度条卡住的情况。对此可尝试调整镜像源加速获取速度或是离线模式预先准备好所需资源包后再继续后续步骤。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值