STM32使用定时器实现微秒(us)级延时

STM32使用定时器实现微秒(us)级延时

引言

目前开发STM32普遍使用HAL库,但 HAL 库封装的延时函数目前仅支持 ms 级别的延时,日常很多情况下会用到 us 延时,特别是一些传感器的数据读取过程,对时序要求比较严格,us 延时必不可少,因此我们今天来介绍STM32如何使用定时器实现微秒(us)级延时。

前期准备Keil 5STM32CubeMXSTM32F407MCU介绍系统时钟可通过多个预分频器配置 AHB 频率、高速 APB (APB2) 和低速 APB (APB1)。AHB 域的最 大频率为 168 MHz。高速 APB2 域的最大允许频率为 84 MHz。低速 APB1 域的最大允许频 率为 42 MHz。

定时器时钟STM32的定时器大致分为三种:基本定时器、通用定时器和高级定时器。各个定时器和其时钟源的对应关系为:

其中,TIM1和TIM8是高级定时器;TIM2-TIM5、TIM9-TIM14是通用定时器;TIM6和TIM7为基本定时器。

高级控制定时器(TIM1 和 TIM8)包含一个 16 位自动重载计数器,该计数器由可编程预分频器驱动。此类定时器可用于各种用途,包括测量输入信号的脉冲宽度(输入捕获),或者生成输出波形(输出比较、PWM 和带死区插入的互补 PWM)。使用定时器预分频器和 RCC 时钟控制器预分频器,可将脉冲宽度和波形周期从几微秒调制 到几毫秒。通用定时器包含一个 16 位或 32 位自动重载计数器,该计数器由可编程预分频器驱动。它们可用于多种用途,包括测量输入信号的脉冲宽度(输入捕获)或生成输出波形(输出比较和 PWM)。使用定时器预分频器和 RCC 时钟控制器预分频器,可将脉冲宽度和波形周期从几微秒调制 到几毫秒。TIM9 到 TIM14 通用定时器包含一个 16 位自动重载计数器,该计数器由可编程预分频器 驱动。它们可用于多种用途,包括测量输入信号的脉冲宽度(输入捕获),或者生成输出波形(输出比较、PWM)。使用定时器预分频器和 RCC 时钟控制器预分频器,可将脉冲宽度和波形周期从几微秒调制到几毫秒。基本定时器 TIM6 和 TIM7 包含一个 16 位自动重载计数器,该计数器由可编程预分频器驱动。此类定时器不仅可用作通用定时器以生成时基,还可以专门用于驱动数模转换器 (DAC)。实 际上,此类定时器内部连接到 DAC 并能够通过其触发输出驱动 DAC。项目项目介绍实现一个us级延时

STM32CubeMX配置时钟

配置定时器

定时器频率为 =TIMxCLK/(TIM_Prescaler+1)。定时器按照此频率计数,累计 TIM_Period 个后产生一个更新或者中断。

程序定时器相关配置程序都由STM32CubeMX帮助我们生成了,我们主要来编写一下微秒级延时函数。

代码语言:javascript复制void delay_us(uint32_t us)

{

// Set timer period for desired delay in microseconds

__HAL_TIM_SET_AUTORELOAD(&htim2, us - 1);//定时器响应时间为period*定时器频率

HAL_TIM_Base_Start(&htim2);//start the timer

//通过轮询的方式等待定时器的更新事件

//当定时器溢出并计数器更新时,TIM_FLAG_UPDATE标志会被置位。

while(__HAL_TIM_GET_FLAG(&htim2,TIM_FLAG_UPDATE)==RESET);

__HAL_TIM_CLEAR_FLAG(&htim2,TIM_FLAG_UPDATE);//清楚更新标志位

HAL_TIM_Base_Stop(&htim2);//Stop the timer

}

上述程序首先通过__HAL_TIM_SET_AUTORELOAD设定延时周期,之后打开定时器,等待事件标志位更新后关闭定时器。

上一篇: 有钱能使鬼推磨,原来后半句更扎心!
下一篇: 6.11号:伊朗足球队70人赴美踢世界杯,15人在边境被拒,美国被指恶意报复

相关文章

DNF用实际数据告诉你
《QQ飞车手游》A级侠影传说怎么样 侠影传说性能效果测评
京东上购物怎么一起下单 京东一个帐户能同时两部手机一起登录吗?
世界杯决赛点球还是平的话怎么办,世界杯决赛打平怎么办
请教大家,PP在哪个国家购买相对便宜些?
2025 年平面设计趋势:哪些正流行,哪些已过时