如何解决STM32 HAL_Delay TIMER微控制器
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("");
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。