SysTick做延时是不是不太准?
感觉用它定1ms会飘,尤其开中断多的时候,是不是得换别的定时器?感觉SysTick更适合节拍,不适合测量。 有中断抢占的话确实不太准。 SysTick只适合大致延时,不适合定时。 定时建议用TIM2或TIM21。 低功耗下SysTick可能不工作。 我测过偏差在10%左右。 用DWT周期计数器精度更高。 SysTick是基于系统时钟的,时钟变了也影响。 我都拿它做tick,延时另开定时器。 加了OS之后tick的粒度也会变粗。 SysTick作为内核定时器(优先级通常为最低),若被更高优先级中断(如外部中断、DMA传输完成中断)频繁抢占,会导致延时累积误差
优化SysTick延时(推荐轻量级场景)关闭SysTick中断:仅用于忙等待延时,避免被其他中断抢占
其实SysTick在中断服务期间暂停计数,返回后继续执行,但中断处理时间未被补偿
时钟源依赖性,SysTick默认使用内核时钟(HCLK),若时钟配置动态变化(如通过PLL切换频率),需手动更新重装载值(SysTick->LOAD),否则延时将线性漂移
传统SysTick延时函数(如HAL_Delay)通过循环查询SysTick->VAL实现,会阻塞CPU执行其他任务,降低系统实时性
缺乏时间戳补偿,在中断密集场景下,未记录中断占用时间,导致延时计算不准确
可以这样,短延时(<100μs):使用DWT循环计数。中等延时(100μs~10ms):使用硬件定时器回调。长延时(>10ms):结合RTOS任务调度
短延时优化,对小于100μs的延时,直接使用空循环(__NOP())或DWT(数据观察跟踪)计数器
动态时钟补偿,若系统可能动态调整时钟,需在频率变化时更新LOAD值。
页:
[1]