HAL库驱动中,由于某些外设的驱动需要使用超时判断(比如I2C、SPI、SDIO等),需要精确延时(精度为1ms),使用的是SysTick,但是在操作系统里面,我们需要使用
SysTick来提供系统时基,那么就冲突了,怎么办?答案是利用DWT重新编写HAL库的相关延时和超时函数HAL_InitTick()、HAL_GetTick()和HAL_Delay(),这三个函数
在HAL库中都是弱定义函数(函数开头带__weak关键字)。
在Cortex-M内核里面有一个外设叫DWT(Data Watchpoint and Trace), 该外设有一个32位的寄存器叫CYCCNT,它是一个向上的计数器, 记录的是内核时钟运行的个数,最
长能记录的时间为: 10.74s = 2的32次方/400000000 (CYCNNT从0开始计数到溢出,最长的延时时间与内核的频率有关,假设内核频率为400M,内核时钟跳一次的时间大概为
1/400M=2.5ns) ,当CYCCNT溢出之后,会清0重新开始向上计数。这种延时方案不仅精确,而且还不占用单片机的外设资源,非常方便。所以HAL库里面刚刚讲到的需要重写的
三个函数我们都基于CYCCNT的方案来实现----》摘录自RTT。
HAL库编译很慢,只有对于大内存的F7/H7才用HAL库