stm32f103设置1s定时器
时间: 2024-12-26 17:26:01 浏览: 18
### 配置 STM32F103 的 1 秒定时器
为了在 STM32F103 上实现 1 秒定时器的功能,可以使用 TIM2 定时器来完成此操作。这里提供了一个基于 HAL 库的简单例子。
首先定义系统时钟频率以及所需的延时时间:
```c
#define SYSCLK_FREQ_HZ (72000000UL) // 假设系统时钟为72MHz
#define ONE_SECOND ((SYSCLK_FREQ_HZ / 1000) * 1000)
```
初始化定时器并启动计数功能:
```c
TIM_HandleTypeDef htim2;
void MX_TIM2_Init(void){
__HAL_RCC_TIM2_CLK_ENABLE();
htim2.Instance = TIM2;
htim2.Init.Prescaler = (uint32_t)(SYSCLK_FREQ_HZ/1000)-1; // 设置预分频值使得每毫秒发生一次溢出中断
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();
}
}
```
编写回调函数处理定时器中断,在每次达到设定的时间间隔时调用该函数:
```c
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){
static uint32_t count_ms = 0;
if(htim->Instance==TIM2){
count_ms++;
if(count_ms >= 1000){ // 当累积到1000次(也就是一秒之后),执行特定的任务
count_ms = 0;
/* 用户自定义的一秒钟周期性任务 */
Toggle_LED(); // 切换LED状态作为测试输出
}
}
}
```
最后不要忘记使能全局中断和定时器中断源,并开启定时器开始工作[^1]:
```c
HAL_NVIC_SetPriority(TIM2_IRQn, 0, 1);
HAL_NVIC_EnableIRQ(TIM2_IRQn);
if(HAL_TIM_Base_Start_IT(&htim2)!= HAL_OK){
Error_Handler();
}
```
阅读全文