-1

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 的代码不起作用呢?

4

1 回答 1

3
  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

于 2020-09-03T07:33:27.343 回答