问题描述
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,GPIO_PIN_RESET);
for (int i=0; i<1000000; i++);
}
然后,始终在主文件中打开的LED1会短暂关闭,然后再打开,这是我所期望的。 那么,为什么带有HAL_Delay的代码不起作用?
解决方法
- 经验法则:在中断处理程序中从不使用延迟。
HAL_Delay
使用SysTick中断,如果SysTick的优先级低于调用其处理程序的中断的优先级,则将像SysTick Handler一样以死循环结束永远不会被调用。
空循环: 我个人建议使用其他形式的循环:
for(volatile count = 0; count < 1000; count++);
或
for(count = 0; count < 1000; count++) asm("");