stm32f103 hal计数器
时间: 2025-03-12 10:19:34 浏览: 34
### STM32F103 使用 HAL 库实现计数器功能
对于STM32F103系列微控制器而言,通过HAL库可以简化定时器配置过程并提供更高级别的抽象层。利用这些特性能够轻松创建一个基于硬件定时器的计数器。
#### 定义全局变量用于存储时间戳
为了跟踪经过的时间或者执行周期性的任务,定义两个全局无符号整型变量`uwTick`和`uwTickFreq`分别表示当前滴答次数与时钟频率[^1]:
```c
uint32_t uwTick = 0;
const uint32_t uwTickFreq = 1000; // 设定每秒中断一次
```
#### 初始化TIMx定时器
初始化指定编号的通用定时器(例如 TIM2),设置自动重装载模式,并开启更新事件中断。这一步骤通常放在系统的初始化部分完成:
```c
static void MX_TIM2_Init(void)
{
__HAL_RCC_TIM2_CLK_ENABLE();
TIM_HandleTypeDef htim2;
htim2.Instance = TIM2;
htim2.Init.Prescaler = SystemCoreClock / 1000 - 1; // 配置预分频系数使定时器工作于kHz级别
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 999; // 设置ARR值为999对应1ms溢出间隔
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
{
Error_Handler();
}
/* 启动定时器 */
if(HAL_TIM_Base_Start_IT(&htim2)!= HAL_OK){
Error_Handler();
}
}
```
#### 中断服务程序处理逻辑
每当发生定时器更新事件时触发此ISR,在其中增加全局变量`uwTick`的数值以记录流逝的时间毫秒数。当达到特定条件时还可以控制LED闪烁或其他动作[^2]:
```c
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance==TIM2){
uwTick++;
if(uwTick % uwTickFreq == 0){
printf("%lu ms elapsed.\r\n", uwTick);
static GPIO_PinState last_state = RESET;
HAL_GPIO_TogglePin(LED_1_GPIO_Port, LED_1_Pin);
}
}
}
```
上述代码展示了如何使用STM32 HAL库中的定时器模块来构建简单的计数器应用实例。需要注意的是实际项目中可能还需要考虑更多细节比如错误处理机制等。
阅读全文
相关推荐


















