STM32不使用中断实现定时器微秒级精确延时

我们在写代码的时候避免不了要使用延时函数,很多延时函数都是使用中断或者tick来实现的,tick的方式最大到毫秒ms级别,通过中断方式的通用定时器来实现,如果实现1us的延时那么每1us就来一次中断,很影响cpu的效率。

本文提供一种不使用中断,并且很简单的方式实现的微秒级精确定时。

通过使用通用定时器来实现

代码如下(基于stm32f103)

cpp 复制代码
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延时如下:

当然如果要实现毫秒级别的要是就很简单了,代码如下:

cpp 复制代码
void ms_delay(uint32_t ms)
{
 
    us_delay(ms * 1000);
 
}
相关推荐
嵌入式软硬件攻城狮1 小时前
6.单片机回调函数
单片机·嵌入式硬件
就是蠢啊2 小时前
单片机入门实验——点灯
单片机·嵌入式硬件
@曾记否2 小时前
瑞控FPVF405飞控开发板硬件功能整理
stm32·嵌入式硬件
oshan20122 小时前
小华HC32L136K8TA 单片机LED(三)
单片机·嵌入式硬件
小齐勇闯天涯2 小时前
STM32--PWM原理机制
stm32·单片机·嵌入式硬件
余生皆假期-8 小时前
SPWM 与 SVPWM 电压利用率简谈
单片机·嵌入式
许商9 小时前
【stm32】【CDC】详解
stm32·单片机·嵌入式硬件
漂洋过海的鱼儿9 小时前
“中断方式”来读取串口
单片机·嵌入式硬件
小龙报10 小时前
《嵌入式成长系列之51单片机 --- 固件烧录》
c语言·开发语言·单片机·嵌入式硬件·51单片机·创业创新·学习方法
一只肥瘫瘫10 小时前
基于MATLAB的滑膜观测器仿真搭建
单片机·嵌入式硬件·matlab