STM32中断系统详解(大白话版)

活动发起人@小虚竹 想对你说:         

这是一个以写作博客为目的的创作活动,旨在鼓励大学生博主们挖掘自己的创作潜能,展现自己的写作才华。如果你是一位热爱写作的、想要展现自己创作才华的小伙伴,那么,快来参加吧!我们一起发掘写作的魅力,书写出属于我们的故事。我们诚挚邀请你参加为期14天的创作挑战赛!

提醒:在发布作品前,请将不需要的内容删除。

一、中断是什么?

1.1 生活场景比喻

想象你在家做饭:

  • 你正在切菜(主程序运行)

  • 突然水烧开了(中断触发)

  • 你暂停切菜(保存现场)

  • 去关火(执行中断服务程序)

  • 回来继续切菜(恢复现场继续执行主程序)

1.2 专业定义

中断是CPU处理紧急事件的机制,当特定事件发生时,暂停当前任务优先处理该事件。


二、STM32的中断类型

2.1 外部中断(EXTI)

  • 触发方式

    • 按钮按下(电平变化)

    • 传感器信号到来(边沿触发)

  • 配置参数

    // 例子:配置PA0引脚为上升沿触发
    HAL_GPIO_DeInit(GPIOA, GPIO_PIN_0);
    EXTI_ConfigTypeDef extiConfig = {0};
    extiConfig.Line = EXTI_LINE0;
    extiConfig.Mode = EXTI_MODE_INTERRUPT;
    extiConfig.Trigger = EXTI_TRIGGER_RISING;
    HAL_EXTI_SetConfigLine(&extiConfig);

2.2 内部中断

中断源 应用场景 特点
定时器中断 精准定时/PWM输出 需要配置预分频器
ADC转换完成中断 采集传感器数据 避免CPU轮询等待
串口接收中断 实时接收蓝牙/WIFI数据 设置接收缓冲区

2.3 优先级那些事

  • 抢占优先级:插队权利(数值越小越优先)

  • 响应优先级:排队顺序(同组内比较)

  • 分组配置

    // 常用分组2(4位抢占优先级,0位响应优先级)
    HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);

三、中断处理全流程

3.1 完整处理流程

  1. 事件发生(如按键按下)

  2. 标志位被置1(EXTI_PR寄存器)

  3. NVIC检查优先级

  4. 暂停当前程序(自动保存PC指针)

  5. 跳转到中断服务函数

  6. 执行用户代码

  7. 清除中断标志(必须手动操作!)

  8. 返回原程序

3.2 中断服务函数模板

// EXTI0中断服务函数
void EXTI0_IRQHandler(void) {
  if(__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_0) != RESET) {
    // 你的处理代码
    HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
    
    // 必须清除标志位!!!
    __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_0);
  }
}

四、手把手配置中断(以按键为例)

4.1 CubeMX配置步骤

  1. 选择GPIO引脚

  2. 设置为外部中断模式

  3. 选择触发边沿(上升沿/下降沿)

  4. 配置NVIC使能中断

  5. 设置优先级分组

  6. 生成代码

4.2 代码补充说明

// 主函数中需要开启中断
HAL_NVIC_EnableIRQ(EXTI0_IRQn);

// 中断服务函数必须与中断向量表对应
// 函数名不能写错!否则进不了中断

五、常见问题避坑指南

5.1 中断不触发

  • 检查项:

    1. GPIO时钟是否使能?

    2. NVIC是否开启?

    3. 中断服务函数名是否正确?

    4. 标志位是否清除?

5.2 中断卡死

  • 可能原因:

    • 在中断里调用了阻塞函数(如HAL_Delay)

    • 未及时清除标志导致重复进入中断

5.3 中断优先级混乱

  • 建议方案:

    • 关键外设(如电机控制)用高优先级

    • 普通外设(如LED显示)用低优先级

    • 相同优先级外设注意执行顺序


六、高级技巧

6.1 中断嵌套

  • 条件:配置不同抢占优先级

  • 注意:谨慎使用,可能导致堆栈溢出

6.2 中断与DMA配合

  • 最佳实践:

    • DMA负责数据传输

    • 传输完成后触发中断处理数据

    • 减少CPU介入时间


七、总结要点

  1. 中断是处理紧急事件的"插队"机制

  2. STM32有59+个中断源(不同型号有差异)

  3. 必须清除中断标志!必须清除!必须清除!

  4. 优先级配置影响系统实时性

  5. 中断服务函数要尽量简短

大白话总结:中断就像公司里的紧急电话,平时大家各忙各的(主程序),当电话响起(中断触发),秘书(NVIC)根据来电重要性(优先级)决定是否让老板(CPU)立即接听,处理完事情后要挂断电话(清除标志),否则电话会一直响!

你可能感兴趣的:(stm32,stm32,单片机,嵌入式硬件)