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

解决方法

  1. 经验法则:在中断处理程序中从不使用延迟

HAL_Delay 使用SysTick中断,如果SysTick的优先级低于调用其处理程序的中断的优先级,则将像SysTick Handler一样以死循环结束永远不会被调用。

空循环: 我个人建议使用其他形式的循环:

for(volatile count = 0; count < 1000; count++);

for(count = 0; count < 1000; count++) asm("");

https://godbolt.org/z/hY117n

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...