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);
 
}
相关推荐
Jason_zhao_MR2 小时前
电能质量监测为什么需要PTP精确时钟同步
linux·单片机·嵌入式硬件·嵌入式
happygrilclh2 小时前
嵌入式 GUI 框架大概说明
stm32
Freak嵌入式2 小时前
RP2040 PIO 编程模型与状态机原理:从硬件架构到工作逻辑全解析
java·大数据·开发语言·单片机·嵌入式硬件·硬件架构
Messy create2 小时前
【BMS-AFE-断路检测】
单片机·嵌入式硬件·能源
恶魔泡泡糖3 小时前
stm32F103C8T6标准库DWT基础应用1
stm32·单片机·嵌入式硬件
LCG元3 小时前
STM32L4 LPUART 实战:Stop2 模式下低功耗串口唤醒与不定长接收
stm32·单片机·嵌入式硬件
星河单片机3 小时前
STM32+VK2828U7G5模块GPS定位+NMEA解析
stm32·单片机·嵌入式硬件
白搞电子3 小时前
ESP-Mosaico 掌上游戏开发:LVGL 抛硬币动画、音频混音与 BMI270 摇晃触发
单片机·嵌入式硬件·物联网·游戏·音视频
新晨单片机设计4 小时前
S004A-基于STM32单片机密码锁【Proteus仿真+Keil程序+原理图】
stm32·单片机·proteus
DevLoom_4 小时前
Mac 移动硬盘不显示?2026整理汇总完整解决方案
stm32·单片机·macos