赞
踩
我们在写代码的时候避免不了要使用延时函数,很多延时函数都是使用中断或者tick来实现的,tick的方式最大到毫秒ms级别,通过中断方式的通用定时器来实现,如果实现1us的延时那么每1us就来一次中断,很影响cpu的效率。
本文提供一种不使用中断,并且很简单的方式实现的微秒级精确定时。
通过使用通用定时器来实现
代码如下(基于stm32f103)
- static void us_delay(uint32_t us)
- {
- uint32_t count = us;
-
- TIM_SetCounter(TIM3, count);
- TIM_Cmd(TIM3, ENABLE);
-
- while (count > 1)//一般改为>= 1,只是 > 1延时偶尔会不够
- {
- count = TIM_GetCounter(TIM3);
- }
- TIM_Cmd(TIM3, DISABLE);
- }
-
- static void timer_init(void)//2us
- {
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
-
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, 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(TIM3, &TIM_TimeBaseStructure);
-
- TIM_Cmd(TIM3, DISABLE);
- }
示波器测试抓到的5us延时如下:
当然如果要实现毫秒级别的要是就很简单了,代码如下:
- void ms_delay(uint32_t ms)
- {
-
- us_delay(ms * 1000);
-
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。