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);
 
}
相关推荐
霖霖7145 分钟前
【ESP32笔记】蓝牙BLE连接与广播
笔记·单片机·mcu·物联网
sayang_shao15 分钟前
用 Rust 开发 STM32H743:从零搭建一个能烧录、能看日志的项目
stm32·单片机·rust
碧海银沙音频科技研究院24 分钟前
基于炬芯ATS308X内置音乐铃声与扫频音频功能实现
单片机·嵌入式硬件
硅基造物主43 分钟前
18.从 IP 到 MQTT:STM32 用 AT 指令驱动 ESP-12F 上云的完整链路(含全套实战代码 + 踩坑清单)
网络·stm32·单片机·嵌入式硬件·网络协议·tcp/ip
霖霖7141 小时前
【ESP32笔记】SmartConfig一键配网
笔记·单片机·mcu·物联网
霖霖7141 小时前
【ESP32笔记】WIFI连接—STA模式
笔记·单片机·mcu·物联网
HRTOS1 小时前
HRTOS 4.0 实测:时间片模式与调度位模式的任务切换性能对比
经验分享·单片机·嵌入式硬件·51单片机
一个风轻云淡2 小时前
扒开系统调用的三层皮:从 getpid 到手写 int 0x80
stm32·单片机·嵌入式硬件
qq_401700412 小时前
CAN 开源库大全(嵌入式/上位机,适配STM32、Linux、Qt,附带Github地址)
linux·stm32·开源
BT-BOX2 小时前
2026最新Keil 5软件下载安装详细教程含MDK和C51(附下载链接)
stm32·proteus