【发布时间】: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 中断具有更高的优先级,也应避免中断处理程序中的延迟,因此您应该重新考虑您的设计。
标签: timer microcontroller interrupt hal stm32f7