stm32定时器延时
时间: 2025-01-08 17:51:26 浏览: 3
### 使用STM32定时器实现精确延时
为了使用STM32定时器实现精确延时,需先完成定时器的初始化工作。这涉及使能定时器时钟、配置预分频器和自动重载寄存器等操作[^2]。
#### 初始化定时器用于延时
```c
void TIM3_Init(void){
// 使能定时器3及时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
// 配置定时器模式
TIM_TimeBaseInitTypeDef timer_init;
TIM_TimeBaseStructInit(&timer_init);
// 设置预分频系数为7199,即系统频率除以7200 (假设系统频率为72MHz)
timer_init.TIM_Prescaler = 7199;
// 自动重装载值设定为期望延迟减一(单位微秒),此处设为1s延时则填入9999
timer_init.TIM_Period = 9999;
// 向上计数模式
timer_init.TIM_CounterMode = TIM_CounterMode_Up;
// 关闭重复计数功能
timer_init.TIM_RepetitionCounter = 0;
// 应用上述参数到TIM3实例化对象中去
TIM_TimeBaseInit(TIM3,&timer_init);
// 清空更新中断标志位
TIM_ClearFlag(TIM3,TIM_FLAG_Update);
// 开启定时器
TIM_Cmd(TIM3,ENABLE);
}
```
此段代码展示了如何针对特定需求调整定时器设置,从而达到所需的延时效果。通过改变`TIM_Prescaler`与`TIM_Period`两个变量可灵活调节实际产生的延时时长。
#### 实现延时函数
基于已初始化好的定时器,编写简单的阻塞型延时函数如下:
```c
// 延时n毫秒
void Delay_ms(uint32_t nms){
uint32_t temp=0;
// 等待直到指定时间内发生溢出事件为止
while(nms--){
TIM_SetCounter(TIM3,0);// 计数值清零
// 当未检测到更新事件到来之前一直循环等待
while(!TIM_GetFlagStatus(TIM3,TIM_FLAG_Update));
// 更新事件触发后清除之以便下次再利用
TIM_ClearFlag(TIM3,TIM_FLAG_Update);
}
}
```
这段代码实现了基于定时器的软件延时方法,在每次调用该函数时都会按照预先设定的时间间隔执行相应次数的等待过程,最终达成整体上的固定时间段内的暂停作用[^1]。
阅读全文