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);
}
Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐