惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

D
Docker
B
Blog RSS Feed
Microsoft Security Blog
Microsoft Security Blog
Y
Y Combinator Blog
N
Netflix TechBlog - Medium
M
MIT News - Artificial intelligence
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
B
Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
C
Check Point Blog
The GitHub Blog
The GitHub Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
P
Proofpoint News Feed
Martin Fowler
Martin Fowler
大猫的无限游戏
大猫的无限游戏
GbyAI
GbyAI
博客园_首页
A
About on SuperTechFans
Blog — PlanetScale
Blog — PlanetScale
人人都是产品经理
人人都是产品经理
T
Tailwind CSS Blog
aimingoo的专栏
aimingoo的专栏
T
The Blog of Author Tim Ferriss
The Cloudflare Blog

静水流深

NAS连续运行58天- 静水流深 从森林走向森林- 静水流深 1Panel添加群晖Webdav作为备份账号- 静水流深 Halo—Joe3主题添加页脚信息- 静水流深 【转载】调试的本质:从混乱到有序,产品状态逐步确定- 静水流深 INAV航点飞行- 静水流深 STM32 Cube MX迁移工程- 静水流深 INAV固定翼之AUTO Tune 和 AUTO Level Trim- 静水流深 STM32 HAL库 printf 重定向至指定串口输出- 静水流深 关于3D打印航模一些想法- 静水流深 愿有岁月可回首- 静水流深 如何用深度学习做目标识别?—— 完整工具链详解- 静水流深 对深度学习与图像目标识别相关概念的理解- 静水流深 U-Center配置GPS- 静水流深 1Panel申请和续签证书&配置反向代理- 静水流深 早点睡,早点起,做好手头的事- 静水流深 Mission Planner地面站模拟飞行和MAVLINK消息UDP转发- 静水流深 Ardupilot设置MSP协议OSD- 静水流深 ArduPilot VTOL QuickTune 快速自动调参记录- 静水流深
STM32定时器—定时周期测试例程- 静水流深
唐韵 · 2001-05-25 · via 静水流深

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

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 计数