浪浪云
侧边栏壁纸
博主头像
静水流深

静水流深,沧笙踏歌

  • 累计撰写 48 篇文章
  • 累计创建 0 个标签
  • 累计收到 23 条评论

目 录CONTENT

文章目录

STM32定时器—定时周期测试例程

唐韵
2025-05-25 / 0 评论 / 0 点赞 / 23 阅读 / 0 字

此代码用于测试定时器的定时周期
写在定时器中断回调函数中

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,原因如下:

  1. HAL_GetTick() 的分辨率是 1ms,它只能反映“至少”过了1ms,实际可能是0.5ms~1.49ms之间都显示为1。
  2. 如果你的定时器周期小于1ms(比如0.5ms),diff 也会大部分时间显示为0,偶尔跳1。
  3. 如果你的定时器周期大于1ms(比如5ms),diff 会显示为5。

提示

  • 如果你每次都看到输出为1,大概率定时器周期就是1ms左右。
  • 如果你定时器实际配置为0.5ms,但用 HAL_GetTick() 测试,可能会看到偶尔1、偶尔0。
  • 更精确的周期测试,建议用 DWT 计数器或定时器自身的 CNT 计数

0

评论区