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

STM32L1硬件定时器当前值读取及双定时任务实现问询

Hey there, let's tackle your two STM32L1 timer questions one by one:

1. 如何读取STM32L1中硬件定时器的当前值?

在STM32 HAL库中,有一个专门的宏可以直接获取定时器的当前计数值:__HAL_TIM_GET_COUNTER(&htim2)。这个宏会直接读取指定定时器句柄对应的计数器寄存器(CNT)的值,无需手动操作底层寄存器。

举个简单的使用例子:

// 读取TIM2的当前计数值
uint32_t tim2_current_count = __HAL_TIM_GET_COUNTER(&htim2);

这个宏定义在stm32l1_hal_tim.h头文件中,HAL库已经帮我们封装好了所有底层逻辑,直接调用即可。

从你的现有代码来看,HAL_TIM_PeriodElapsedCallback会在TIM2完成一个周期时触发ledBlueBlink()(也就是每100µs执行一次)。要实现每10次这个回调触发后运行一次ledGreenBlink(),只需要一个简单的计数器来跟踪回调触发的次数即可。

下面是修改后的回调函数实现:

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
  // 静态计数器,在回调调用之间保持值的持久性,无需全局变量
  static uint8_t blink_counter = 0;

  if(htim->Instance == TIM2) {
    ledBlueBlink();
    
    // 每次执行完蓝色LED闪烁后,计数器加1
    blink_counter++;
    
    // 当计数器达到10时,执行绿色LED闪烁并重置计数器
    if(blink_counter >= 10) {
      ledGreenBlink();
      blink_counter = 0;
    }
  }
}

为什么这个方案可行:

  • 静态变量blink_counter在回调函数的多次调用之间会保留自己的值,不会每次都被初始化,刚好用来记录ledBlueBlink()的执行次数。
  • 每10次回调触发(也就是10×100µs=1ms),计数器达到阈值,触发ledGreenBlink()后重置,开始下一轮计数。

如果你需要在其他代码中也访问这个计数器,可以改用全局变量(注意要避免其他地方误修改它):

uint8_t blink_counter = 0; // 全局计数器

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
  if(htim->Instance == TIM2) {
    ledBlueBlink();
    blink_counter++;
    if(blink_counter >= 10) {
      ledGreenBlink();
      blink_counter = 0;
    }
  }
}

内容的提问来源于stack exchange,提问作者Gaurav1234

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 08:37:41