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);
 
}
相关推荐
Python小老六5 小时前
冯诺依曼架构 vs 哈佛架构 对比
stm32·单片机·嵌入式硬件·架构
TEC_INO5 小时前
Hal库的使用
单片机·hal库
羽获飞6 小时前
从零开始学嵌入式之STM32——13.使用STM32自带硬件模块实现IIC协议通讯
单片机·嵌入式硬件
单片机设计星球6 小时前
51单片机的【智能婴儿床】仿真设计
单片机·嵌入式硬件·51单片机
wuchen10046 小时前
网狐的定时器引擎架构理解
架构·定时器·网狐
dashizhi20157 小时前
禁止复制电脑文件、电脑机密数据禁止拷贝、禁止电脑文件复制到U盘和移动硬盘的方法
运维·网络·stm32·安全·电脑
San_a dreamer fish8 小时前
STM32开发入门基础篇知识要点
stm32·单片机·嵌入式硬件
济6178 小时前
ARM Linux 驱动开发篇--- Linux 并发与竞争实验(互斥体实现 LED 设备互斥访问)--- Ubuntu20.04互斥体实验
linux·stm32·嵌入式linux驱动开发
安庆平.Я9 小时前
STM32——FreeRTOS - 移植
stm32·单片机·嵌入式硬件
HIZYUAN10 小时前
AG32 MCU可以替代STM32+CPLD吗(一)
stm32·单片机·嵌入式硬件