用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