代码在运行时,在while((HAL_GetTick() - tickstart) < wait)卡住,但是当我将代码中的 HAL_Delay(1000); // 延迟1秒注释掉的时候,代码就不卡了,请问这是为何呢?
时间: 2023-09-03 11:27:15 浏览: 2264
### 回答1:
这可能是由于HAL_Delay(1000)阻塞了STM32的系统时钟,在while循环中等待时间过程中系统时钟停止工作,无法计时,造成卡住的现象。去掉延时函数后,系统时钟可以持续运转,计时器也可以正常工作,因此代码不会卡住。建议使用其他方法进行延时,例如使用定时器或者外部中断等方式。
### 回答2:
代码在运行时,在while((HAL_GetTick() - tickstart) < wait)卡住的原因是由于HAL_Delay函数在延迟1秒时,会使程序暂停运行1秒钟,此时HAL_GetTick()函数记录的时间不会更新。而在while循环中,一直判断(HAL_GetTick() - tickstart) < wait,如果HAL_GetTick()的值不变,那么循环条件始终成立,导致程序一直卡在这个循环中。
当将HAL_Delay(1000); // 延迟1秒注释掉后,代码不再卡住的原因是没有延迟,程序可以正常运行,执行完while循环中的语句后,程序继续执行下一行代码,而不会进入到延迟函数内部,因此程序不再卡住。
解决这个问题的办法是可以在循环中添加一些延迟,以便HAL_GetTick()的值可以及时更新。例如在循环内添加一个短暂的延迟,比如HAL_Delay(1);,使得程序每次循环都会有一小段时间的休眠,从而让HAL_GetTick()有机会更新时间。这样可以保证程序不会一直卡在while循环中。
另外,可以考虑使用HAL_Delay函数的替代方法,比如使用HAL_Delay的底层实现函数,或者使用其他的延迟函数来代替。这样可以避免在延迟函数中导致HAL_GetTick()的时间不更新的问题。
### 回答3:
在这种情况下,代码在while((HAL_GetTick() - tickstart) < wait)陷入无限循环。HAL_GetTick()函数返回系统启动后的毫秒数,tickstart是一个变量,表示代码开始运行时的时间,wait是一个变量,表示期望的延迟时间。
当执行到while((HAL_GetTick() - tickstart) < wait)时,代码会不断地比较系统当前时间与代码开始时间的差值,直到这个差值大于等于wait时,才会跳出循环。
在这个问题中,当将代码中的HAL_Delay(1000); // 延迟1秒注释掉后,while循环中没有延迟操作,导致循环非常快速地执行。在一秒内,很可能无法满足差值大于等于wait的条件,因此代码会一直处于循环状态,没有机会跳出循环。
而当加上延迟操作时,每次循环执行时会延迟1秒钟,这样while循环中的差值会随着时间的流逝逐渐增大,最终达到大于等于wait的条件,才会跳出循环,使代码继续执行。
因此,从逻辑上来说,将代码中的延迟操作注释掉会导致while循环一直无法满足跳出条件,从而使代码卡住。
阅读全文