You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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的硬件定时器中断方案,步骤如下:

  1. 配置定时器:通过CubeMX或手动代码配置一个定时器(以TIM2为例),设置为1毫秒触发一次中断(预分频器和自动重装载值根据你的STM32核心时钟计算,比如核心时钟72MHz时,预分频器设为71,自动重装载值设为999),并开启定时器中断。

  2. 编写中断回调与主循环代码:

// 全局变量用于控制执行周期和计数
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 19:01:06