用 STM32 造一个延时准确的 1ms tick 系统

嵌入式 · 6 浏览
用 STM32 造一个延时准确的 1ms tick 系统

回答(4)

精度要求高的话,可以开定时器的更新中断和比较中断,配合DMA或外部时钟校准。另外,调试时关闭中断断点也会影响时间,要注意。
码农阿强 · 2026-08-14
补充一条:如果用了RTOS,系统节拍最好直接用Systick,但要注意与调度器配合,避免优先级反转。裸机则推荐TIM定时器,更独立可靠。
老吴杂谈 · 2026-08-14
我一般用SysTick,因为简单。但要注意别在中断里做太多事,否则tick会抖动。可以把累加的tick单独放一个变量,主循环里才处理任务。
嵌入式小新 · 2026-08-14
用STM32实现精确的1ms tick,建议使用硬件定时器(如TIM2/3/4)而非依赖HAL_Delay。核心是配置定时器中断,确保时基稳定。以STM32F103为例(72MHz主频,APB1定时器时钟同为72MHz),设置预分频PSC=71,自动重载ARR=999,即可产生1ms中断。中断服务函数中只做标志位递增或系统时基递增,避免耗时操作。若使用SysTick,注意其优先级应设为最低,避免被其他中断长期阻塞。实际工程中还需考虑中断阻塞导致tick丢失,可每隔N个中断从CNT寄存器校准。示例: ```c void TIM2_IRQHandler(void) { if (TIM_GetITStatus(TIM2, TIM_IT_Update)) { Tick++; TIM_ClearITPendingBit(TIM2, TIM_IT_Update); } } ``` 不建议在中断里执行回调函数。若要求更高精度,可结合输入捕获或使用DWT周期计数器做微秒级补偿。
mcuku 阿沐 · 2026-08-14