STM32 HAL_Delay TIMER微控制器[关闭]
Posted
技术标签:
【中文标题】STM32 HAL_Delay TIMER微控制器[关闭]【英文标题】:STM32 HAL_Delay TIMER Microcontroller [closed] 【发布时间】:2020-12-22 02:55:21 【问题描述】:HAL_Delay() 函数和空的 for 循环有什么区别?定时器应创建中断并关闭 LED。 如果我在中断函数中使用 HAL_Delay(),结果是 LED 永远关闭:
void TIM6_DAC_IRQHandler()
HAL_TIM_IRQHandler(&htim6);
HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_RESET);
HAL_Delay(125);
但如果我改用:
void TIM6_DAC_IRQHandler()
HAL_TIM_IRQHandler(&htim6);
HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_RESET);
for (int i=0; i<1000000; i++);
然后 LED1 在主文件中始终亮着,它会在短时间内关闭然后亮起,正如我所期望的那样。 那么为什么带有 HAL_Delay 的代码不起作用呢?
【问题讨论】:
空的 for 循环可以被优化掉,如果你知道如何防止延迟的持续时间不像以前在 PIC 上那样严格。即使您对其进行了调整,更改循环的对齐方式也可以更改时间(通过在之前或附近添加其他代码)以及您解决优化问题的方法可能会使它容易受到攻击。硬件计时器有自己的库开销准确性问题,您不能延迟非常小的周期,但通常是更好的路径。 HAL_Delay() 可能依赖于系统定时器和 SysTick 中断。是否启用了 SysTick 中断? SysTick 中断相对于 TIM6 中断的优先级是多少?如果 TIM6 中断的优先级较高,则在 TIM6 中断执行时不会执行 SysTick 中断,因此 HAL_Delay 将无法正常工作。即使 SysTick 中断具有更高的优先级,也应避免中断处理程序中的延迟,因此您应该重新考虑您的设计。 【参考方案1】:-
经验法则:不要在中断处理程序中使用延迟。
HAL_Delay
使用 SysTick 中断,如果 SysTick 的优先级低于调用它的处理程序的中断的优先级,将进入死循环,因为 SysTick 处理程序永远不会调用。
空循环: 我个人建议使用其他形式的循环:
for(volatile count = 0; count < 1000; count++);
或
for(count = 0; count < 1000; count++) asm("");
https://godbolt.org/z/hY117n
【讨论】:
以上是关于STM32 HAL_Delay TIMER微控制器[关闭]的主要内容,如果未能解决你的问题,请参考以下文章