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库已经帮我们封装好了所有底层逻辑,直接调用即可。
2. 实现每执行10次ledBlueBlink()后运行一次ledGreenBlink()
从你的现有代码来看,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
相关产品推荐
相关产品推荐

