不使用中断实现通用定时器精确延时

网上大多数延时函数都是通过中断方式的通用定时器来实现,如果实现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延时如下:

猜你喜欢

转载自blog.csdn.net/a2988a/article/details/82855058