stm32 HAL库中的HAL_Delay()卡死解决方案

本文解决了一个在使用VSCode与PlatformIO进行STM32开发时遇到的问题,即跑马灯程序无法运行。问题根源在于HAL_Delay()函数的阻塞,通过对比官方例程和添加SysTick_Handler()函数的实现,最终使LED成功闪烁。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题

试试VScode+PlatformIO来开发stm32,结果写了个跑马灯死活跑不动。
仔细看了看发现卡在在HAL_Delay()函数中,于是上stm官网下载例程对比+google之

解决方式

stm跑马灯例程中除了main.c外,还有stm32f3xx_it.c和system_stm32f3xx.c
关键语句在stm32f3xx_it.c中:

/**
  * @brief  This function handles SysTick Handler.
  * @param  None
  * @retval None
  */
void SysTick_Handler(void)
{
  HAL_IncTick();
}

所以你可以试着把这几个玩意都包含在工程里
或者,在自己的文件里加入:

extern "C" void SysTick_Handler(void)
{
	HAL_IncTick();
  //osSystickHandler(); For FREERTOS stuff
}

搞定,小灯泡可算跑起来了

### STM32 HAL_Delay 函数卡死解决方案 当遇到 `HAL_Delay()` 函数在STM32上出现卡死的情况时,主要原因是该函数依赖于 SysTick 定时器来实现毫秒级延迟。如果 SysTick 的中断优先级设置过低,则可能导致其他高优先级中断抢占 CPU 时间,从而使得 SysTick 中断无法及时响应,最终造成 `HAL_Delay()` 调用失败并陷入等待状态。 对于这个问题,有几种方法可以解决: #### 提升 SysTick 中断优先级 调整 SysTick 中断的优先级别至较高位置能够有效防止其被更高优先级的中断打断。具体操作是在初始化阶段通过修改 NVIC (Nested Vectored Interrupt Controller) 来改变 SysTick 的配置参数[^1]。 ```c // 设置SysTick中断优先级为0,即最高优先级 __NVIC_SetPriority(SysTick_IRQn, 0); ``` #### 避免在中断服务程序中调用 HAL_Delay() 由于 `HAL_Delay()` 是基于循环计数的方式工作,并且会阻塞当前线程直到指定时间过去,在多任务环境下尤其是处于 ISR (Interrupt Service Routine) 内部时可能会引起不可预测的行为甚至系统崩溃。因此推荐不在任何类型的中断上下文中直接调用此函数[^2]。 #### 使用替代方案实现延时功能 考虑到上述两点局限性,可以选择更合适的办法来进行短时间内的暂停控制,比如利用硬件定时器配合回调机制完成精确的时间管理;或是采用非阻塞性的设计模式如轮询检测标志位变化等方式代替简单的忙等待逻辑[^3]。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值