stm32f1 TIM2实现1ms延时
时间: 2024-09-28 10:13:11 浏览: 38
STM32F1和STM32F4延时函数
在STM32F1系列微控制器上,可以利用TIM2 (Timer 2) 的定时功能来实现大约1ms的延时。这里是一个基本步骤:
1. 配置TIM2寄存器:
- 将TIM2设置为模式3,即PWM(脉宽调制)模式,因为在这种模式下,我们可以方便地生成周期性的时间间隔。
- 设置TIM2的预分频器(Prescaler)为适合1ms时间间隔的比例。例如,如果系统时钟频率是72MHz,可以选择预分频值为8192,使得每个计数周期为1ms / (系统时钟 / 8192)。
```c
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM_TimeBaseInitTypeDef.TIM_Prescaler = SystemCoreClock / 1000 / 8; // 根据实际情况调整
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct);
```
2. 启动TIM2:
- 开启TIM2的时钟和更新事件。
```c
TIM_Cmd(TIM2, ENABLE);
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); // 更新中断使能
```
3. 使用软件触发(Software Trigger)实现延时:
- 清零当前计数值,然后设置中断请求,让程序暂停等待下一个计数周期结束。
```c
TIM_SetCompare(TIM2, 0, 0); // 设定比较寄存器,用于设定周期长度
TIM_Cmd(TIM2, ENABLE); // 开始计时
// 进入一个死循环,在中断到来时退出
while (!TIM_GetITStatus(TIM2, TIM_IT_Update)); // 等待计数完成
```
4. 中断处理:
- 当计数到达预定值时,TIM2的Update中断会被触发。在对应的中断服务函数中,你可以继续你的程序流程,然后再次清零计数器开始新的1ms延时。
```c
void TIM2_IRQHandler(void)
{
TIM_ClearFlag(TIM2, TIM_FLAG_Update); // 清除标志位
if (TIM_GetITStatus(TIM2, TIM_IT_Update)) {
// 计数结束,执行延时任务后重新开始计时
TIM_SetCompare(TIM2, 0, 0);
TIM_Cmd(TIM2, ENABLE);
}
}
```
阅读全文