stm32 定时器_STM32使用通用定时器做精确延时(非中断方式)
时间: 2023-06-26 20:07:05 浏览: 240
STM32——通用定时器
5星 · 资源好评率100%
在STM32中,可以使用通用定时器来实现精确的延时。在非中断方式下,我们需要使用定时器的计数器来实现精确的计时。
下面是一个使用TIM2定时器实现精确延时的例子:
```c
#include "stm32f10x.h"
void TIM2_Delay_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); //使能TIM2时钟
TIM_TimeBaseInitStruct.TIM_Period=arr; //自动重装载值
TIM_TimeBaseInitStruct.TIM_Prescaler=psc; //分频器
TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1; //时钟分割
TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);
TIM_Cmd(TIM2,DISABLE); //关闭定时器2
}
void TIM2_Delay_us(u32 us)
{
TIM_SetCounter(TIM2,0); //计数器清0
TIM_Cmd(TIM2,ENABLE); //使能定时器2
while(TIM_GetCounter(TIM2)<us); //等待计数器计满us
TIM_Cmd(TIM2,DISABLE); //关闭定时器2
}
int main(void)
{
TIM2_Delay_Init(72-1,72-1); //初始化定时器2,分频系数为72,则计数器时钟为1MHz
TIM2_Delay_us(1000); //延时1ms
while(1);
return 0;
}
```
在上述代码中,我们使用TIM2定时器来实现延时。在初始化函数`TIM2_Delay_Init()`中,我们配置了定时器的自动重装载值和分频器,以及向上计数模式。在延时函数`TIM2_Delay_us()`中,我们首先将计数器清零,然后使能定时器开始计数。接着,我们不断检查计数器是否达到了指定的延时时间,如果没有,则继续等待。当计数器计满指定的时间后,我们关闭定时器,延时结束。
需要注意的是,这种方式并不是非常精确,因为延时过程中可能会有其他中断干扰计数器的计数。如果需要更精确的延时,可以考虑使用硬件定时器中断方式实现。
阅读全文