STM32阻塞延时接收到中断怎么处理
时间: 2025-05-01 21:42:12 浏览: 20
### STM32中正确处理阻塞延时函数期间发生的中断
在STM32中,当使用`HAL_Delay()`这样的阻塞型延时函数时,确实可能会遇到一些挑战,特别是在涉及到中断处理的情况下。由于`HAL_Delay()`内部依赖于SysTick定时器产生的周期性中断来计算经过的时间[^1]。
为了确保在调用`HAL_Delay()`期间能够正常响应其他外设触发的中断请求IRQ,需要注意以下几点:
#### 设置合理的中断优先级
不同类型的硬件事件应当分配不同的中断优先级别。一般来说,应该把那些实时性强、对延迟敏感的任务赋予较高的抢占优先级;而对于像系统滴答这类非紧急的服务,则可适当降低其权重。具体操作可通过NVIC(嵌套向量中断控制器)的相关API完成设置。
```c
// 配置USART接收中断具有更高的优先级以便打断当前正在执行中的HAL_Delay()
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_USART1_CLK_ENABLE();
/* Configure USART1 */
huart1.Instance = USART1;
...
// 设定串口接收中断为高优先级
HAL_NVIC_SetPriority(USART1_IRQn, 0, 0); // 抢占优先级最高
HAL_NVIC_EnableIRQ(USART1_IRQn);
```
#### 使用非阻塞方式替代传统延时
考虑到某些应用场景下可能不允许长时间占用CPU资源等待时间流逝,建议采用更灵活的方法代替简单的循环或忙等策略。比如利用RTOS提供的任务调度机制或是设计状态机模型配合外部计数/定时模块共同工作。
对于不希望被任何低优先生硬切断的情况,可以选择编写自定义版本的延时子程序,它能够在每次进入前保存现场信息,并在外围设备发出信号后恢复原状继续运行下去直到满足设定条件为止。
```c
void my_custom_delay(uint32_t ms){
uint32_t startTicks = HAL_GetTick();
while ((HAL_GetTick() - startTicks) < ms){
if (__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE)){
/* 处理接收到的数据帧 */
UART_HandleTypeDef *huart = &huart1;
__HAL_UART_CLEAR_IDLEFLAG(huart);
// 这里可以加入实际业务逻辑
break; // 如果有必要提前退出延时过程
}
// 可选:允许其他更高优先级ISR介入
__WFI(); // Wait For Interrupt指令让MCU进入睡眠模式节省功耗
}
}
```
上述代码片段展示了如何构建一个更加健壮且易于扩展的基础框架,在保持原有功能的同时增强了对外部刺激做出快速反应的能力[^2]。
阅读全文
相关推荐


















