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微控制器[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

将 VL53L0X 与 STM32 微控制器一起使用

我应该从哪里获得 STM32 微控制器的头文件?

STM32F4高性能MCU微控制器

如何为 STM32F4 微控制器的 flash bank 实现 OTA 更新故障转移场景?

初识STM32

如何使用 OpenOCD 通过 JTAG 链批量刷写 STM32 微控制器?