定时器实现的思路也比较简单,定时器一般有ms定时和us定时,我们可以先初始化两个定时器,一个配置成1ms定时,一个配置成1us定时。
以下以us级定时器为例说明如何基于定时器编写延时函数。
实现微秒级延时
void TIM3Init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //开启时钟
TIM_TimeBaseInitStruct.TIM_Period = 0xffff; //装载计数值
TIM_TimeBaseInitStruct.TIM_Prescaler = 42 - 1; //装载预分频值,1us
TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1; //预分频值为1
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;//向上计数方式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStruct); //进行定时器配置
TIM_Cmd(TIM3, ENABLE); //使能TIMx外设
}
// 微秒延时
void delay_us(uint16_t us)
{
u16 tp1;
u16 tp2;
u16 dif;
tp1 = TIM3->CNT;
while(1)
{
tp2 = TIM3->CNT;
dif = tp2 - tp1;
if(dif >= us)
break;
}
}
|