HAL_Delay用法
时间: 2023-08-07 10:02:19 浏览: 68
HAL_Delay是HAL库中提供的延时函数,用于在单片机中实现延时操作。根据引用[1]和引用[2]的内容,当我们重写了基于systick的延时函数后,HAL_Delay就不再适用,因为两者不能同时使用。如果在程序中仍然存在HAL_Delay函数的调用,程序不会报错,但在单片机运行时会卡在这里。
需要特别注意的是,在中断中使用HAL_Delay函数会导致程序异常,原因是HAL_Delay函数使用了滴答定时器的中断。如果在高于滴答定时器中断的中断函数中使用HAL_Delay函数,程序将会锁死在HAL_Delay函数内部的while循环中,无法跳出函数。这是因为滴答定时器无法被重新调用,导致HAL_Delay函数无法正常退出。这一点在引用[3]中有详细说明。
因此,使用HAL_Delay函数时需要注意以下几点:
1. 不要同时使用基于systick的延时函数和HAL_Delay函数。
2. 避免在中断中使用HAL_Delay函数,以防止程序异常和死锁的情况发生。
综上所述,HAL_Delay函数的使用需要遵循以上的注意事项。
相关问题
HAL_Delay如何计算时间
HAL_Delay函数是由HAL库提供的延时函数,其计算时间是通过调用底层的系统滴答定时器来实现的。在使用HAL_Delay函数时,需要事先配置好系统滴答定时器的时钟源和时钟频率,以使其能够产生一定的时间间隔,然后根据所需要延时的时间,调用HAL_Delay函数来延时相应的时间。例如,如果系统滴答定时器的时钟频率为1MHz,那么调用HAL_Delay(1000)函数将会延时1秒钟的时间。具体的计算方法可以参考HAL库的相关文档或者参考官方提供的示例代码。
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if(GPIO_Pin == GPIO_PIN_9) { HAL_Delay(5); if(page_sta==0) { OLED_Clear(); page_sta=1; page2_test(); } else if(page_sta==1) { OLED_Clear(); page_sta=0; page1_test(); } } } 程序到HAL_Delay(5);就卡死了
这个程序很可能是因为 HAL_Delay(5) 导致的死循环,因为 HAL_Delay() 函数是一个阻塞函数,会使CPU进入等待状态,直到延时时间结束。在这段代码中,如果GPIO中断触发时,跳转到中断处理函数 HAL_GPIO_EXTI_Callback(),如果GPIO_Pin为GPIO_PIN_9,则会执行 HAL_Delay(5),这里的延时时间是5ms,这段时间内CPU会一直等待,如果期间又有GPIO中断触发,则会卡死。
解决这个问题的方法是使用定时器中断来替代 HAL_Delay() 函数,或者使用RTOS等操作系统来管理任务,避免阻塞CPU。