【HAL库+cubeMX基础】中断优先级
·
STM32F1中断优先级配置
STM32F1系列使用嵌套向量中断控制器(NVIC)管理中断优先级,优先级分为抢占优先级和子优先级(响应优先级)。配置需注意以下关键点:
中断优先级分组 STM32F1支持4位优先级配置,通过NVIC_PriorityGroupConfig()函数设置优先级分组,决定抢占优先级和子优先级的位数分配。分组方式如下:
- 分组0:0位抢占优先级,4位子优先级
- 分组1:1位抢占优先级,3位子优先级
- 分组2:2位抢占优先级,2位子优先级
- 分组3:3位抢占优先级,1位子优先级
- 分组4:4位抢占优先级,0位子优先级
常用配置为分组2(2位抢占优先级,2位子优先级):
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
优先级数值规则
- 数值越小优先级越高(0为最高)
- 抢占优先级高的中断可打断正在执行的低抢占优先级中断
- 相同抢占优先级时,高子优先级的中断先响应,但不能互相打断
配置示例 以配置USART1中断为例:
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; // 抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 子优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
中断优先级设计建议
关键外设优先
- 将实时性要求高的外设(如PWM、紧急故障检测)设置为高抢占优先级
- 通信接口(如USART、SPI)可设置中等优先级
- 非实时任务(如LED刷新)设为最低优先级
避免优先级反转
- 相同抢占优先级的中断应尽量缩短执行时间
- 避免在中断服务函数中进行耗时操作
默认优先级顺序 当多个中断同时发生且优先级相同时,处理器按固定顺序响应(见参考手册的"中断和异常向量表")。例如:
- 外部中断EXTI0的默认优先级高于EXTI1
- 定时器TIM1中断默认优先级高于TIM2
常见问题处理
中断无法触发
- 检查NVIC配置是否使能
- 确认优先级分组设置与具体优先级数值匹配
- 确保全局中断已开启(
__enable_irq())
优先级不生效
- 重新核对优先级分组设置
- 检查是否在运行时修改了优先级分组(需保持全局一致)
- 确认没有在中断服务函数中错误修改优先级寄存器
代码模板 标准优先级配置流程:
void NVIC_Configuration(void) {
// 设置优先级分组
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
// 配置具体外设中断
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
更多推荐



所有评论(0)