微秒延时us
代码解析
第1行:配置SysTick为1MHz
c
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000000);
HAL_RCC_GetHCLKFreq():获取CPU主时钟频率(单位:Hz)除以1,000,000:将SysTick定时器配置为每1微秒中断一次
例:如果HCLK=72MHz,则72,000,000/1,000,000 = 72,即每72个时钟周期产生一次中断
第2行:执行延时
c
HAL_Delay(us-1);
使用HAL库的标准毫秒延时函数,但因为SysTick已被重新配置为微秒级别,所以实际上延时的是(us-1)微秒
减1是为了补偿函数调用和重配置的时间
第3行:恢复SysTick为1kHz
c
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
将SysTick重新配置回原来的1毫秒中断一次
这是必要的,因为HAL库的其他功能(如超时检测)依赖于1ms的SysTick
注意事项
⚠️ 潜在问题:
中断影响:重配置SysTick会短暂影响依赖SysTick的其他功能
精度问题:函数调用和重配置本身需要时间,可能影响精度
不是原子操作:在延时期间如果发生中断,可能影响延时精度
更好的替代方案
对于需要更高精度的微秒延时,通常推荐使用:
专用的硬件定时器
DWT(Data Watchpoint and Trace)单元(如果可用)
简单的循环延时
这个函数提供了一个快速实现微秒延时的方法,但在对时序要求严格的场合可能需要更精确的方案。
