如何在STM32上让函数在指定时长内重复执行?
STM32实现函数1秒内重复执行的方案
针对你需要让num_display_func在1秒内重复执行的需求,这里提供两种实用的实现方式:
方法一:基于HAL_GetTick()的软件轮询(简单易实现)
利用STM32 HAL库自带的HAL_GetTick()函数(返回系统启动后的毫秒数),通过记录起始时间,在1秒窗口内循环调用目标函数。
替换你原有的for循环,代码示例:
while (1) { /* USER CODE END WHILE */ uint32_t start_time = HAL_GetTick(); uint32_t count = 0; // 持续执行直到超过1秒 while(HAL_GetTick() - start_time < 1000) { num_display_func(count); count++; // 可选:添加短延时控制执行频率 // 比如HAL_Delay(1) → 每秒约1000次执行 // HAL_Delay(10) → 每秒约100次执行 // 不添加则函数会被高频调用,次数取决于函数本身执行耗时 } }
注意
- 该方法实现简单,但如果主循环存在其他耗时操作,会影响1秒内的执行次数准确性;
- 若需要固定执行频率,通过调整
HAL_Delay()的参数即可控制。
方法二:硬件定时器中断(时间精度高)
如果需要精准控制执行频率(比如每秒固定执行N次),推荐使用STM32的硬件定时器中断方案,步骤如下:
配置定时器:通过CubeMX或手动代码配置一个定时器(以TIM2为例),设置为1毫秒触发一次中断(预分频器和自动重装载值根据你的STM32核心时钟计算,比如核心时钟72MHz时,预分频器设为71,自动重装载值设为999),并开启定时器中断。
编写中断回调与主循环代码:
// 全局变量用于控制执行周期和计数 uint16_t exec_count = 0; uint8_t enable_1s_exec = 0; // 定时器中断回调函数 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if(htim->Instance == TIM2) { if(enable_1s_exec) { num_display_func(exec_count); exec_count++; // 执行满1秒后停止 if(exec_count >= 1000) // 1ms中断一次,1000次即1秒 { enable_1s_exec = 0; exec_count = 0; } } } } // 主循环逻辑 while (1) { /* USER CODE END WHILE */ // 触发1秒的函数执行周期 enable_1s_exec = 1; // 等待本次1秒执行完成 while(enable_1s_exec); // 可选:添加间隔时间,比如每5秒触发一次1秒执行 // HAL_Delay(5000); }
注意
- 中断回调函数要尽量简短,避免耗时操作,防止影响其他中断响应;
- 若需要持续每秒执行,可去掉
enable_1s_exec的控制逻辑,直接在中断中每次调用函数即可。
内容的提问来源于stack exchange,提问作者Theja
相关产品推荐
相关产品推荐

