此代码用于测试定时器的定时周期
写在定时器中断回调函数中
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == TIM5)
{
static uint32_t last_tick = 0;
uint32_t now_tick = HAL_GetTick();
uint32_t diff = now_tick - last_tick;
last_tick = now_tick;
// 通过串口或调试器输出diff,观察周期
char msg[32];
int len = snprintf(msg, sizeof(msg), "TIM5 interval: %lu ms\r\n", diff);
HAL_UART_Transmit(&huart1, (uint8_t*)msg, len, 100);
}
}
此代码调用了系统滴答计时器,分辨率为1ms,可以测试定时周期大于1ms(且为1ms 的整数)的计时器。
举例:串口输出的信息为 TIM5 interval: 1 ms,说明两次回调之间的 HAL_GetTick()
差值为 1ms。也就是定时周期为1ms。TIM5 interval后面的数值代表定时周期。
另外 ,即使看到TIM5 interval: 1 ms
但这并不一定代表定时器真正的周期就是 1ms,原因如下:
- HAL_GetTick() 的分辨率是 1ms,它只能反映“至少”过了1ms,实际可能是0.5ms~1.49ms之间都显示为1。
- 如果你的定时器周期小于1ms(比如0.5ms),
diff
也会大部分时间显示为0,偶尔跳1。 - 如果你的定时器周期大于1ms(比如5ms),
diff
会显示为5。
提示
- 如果你每次都看到输出为1,大概率定时器周期就是1ms左右。
- 如果你定时器实际配置为0.5ms,但用
HAL_GetTick()
测试,可能会看到偶尔1、偶尔0。 - 更精确的周期测试,建议用 DWT 计数器或定时器自身的 CNT 计数
评论区