网上大多数延时函数都是通过中断方式的通用定时器来实现,如果实现1us的延时那么每1us就来一次中断,很影响cpu的效率。
本文不使用中断通过是用通用定时器来实现精确延时。
代码如下(基于stm32f103)
static void udelay(uint32_t us)
{
uint32_t count = us;
TIM_SetCounter(TIM2, count);
TIM_Cmd(TIM2, ENABLE);
while (count > 1)//一般改为>= 1,只是 > 1延时偶尔会不够
{
count = TIM_GetCounter(TIM2);
}
TIM_Cmd(TIM2, DISABLE);
}
static void TIM_Configuration(void)//2us
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Down;
TIM_TimeBaseStructure.TIM_Period = 1;
TIM_TimeBaseStructure.TIM_Prescaler = 71;//72Mhz
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
TIM_Cmd(TIM2, DISABLE);
}
示波器测试抓到的5us延时如下: