系统嘀嗒定时器和普通定时器差不多,一定时间(用户设定)后就会产生中断(如果使能了嘀嗒定时器中断)。 讲到这里,可以总结 HAL_Delay 函数的实现原理:uwTick 每隔一段时间就会增加,通过读取 uwTick 的值保存,过一段时间再读取 uwTick 的值,两次读取的时间相减,就可以知道过去了多长时间。这段时间与用户设定的值(Del...
然后调试到HAL_Delay()方法的内部发现 HAL_GetTick( )函数一直返回 __weak void HAL_Delay(uint32_t Delay) { uint32_t tickstart = HAL_GetTick(); uint32_t wait = Delay; /* Add a freq to guarantee minimum wait */ if (wait < HAL_MAX_DELAY) { wait += (uint32_t)(uwTickFreq); } ...
今天在stm32U5A5上使用DMA做SPI数据传输时发现了一个神奇的现象。 过程:使用了HAL的HAL_SPI_TransmitReceive_DMA函数,该函数负责实现SPI通讯,并在实现后会调用一个叫做HAL_SPI_TxRxCpltCallback的回调函数。如果在HAL_SPI_TxRxCpltCallback使用HAL_Delay函数,程序便会一直卡死。 如下图:理论上在完成通讯后,会点亮...