我们在写代码的时候避免不了要使用延时函数,很多延时函数都是使用中断或者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延时如下:
文章来源:https://www.toymoban.com/news/detail-848119.html
当然如果要实现毫秒级别的要是就很简单了,代码如下:文章来源地址https://www.toymoban.com/news/detail-848119.html
void ms_delay(uint32_t ms)
{
us_delay(ms * 1000);
}
到了这里,关于STM32不使用中断实现定时器微秒级精确延时的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!