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

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

  • 引言
  • 前期准备
  • 介绍
    • 系统时钟
    • 定时器时钟
  • 项目
    • 项目介绍
    • STM32CubeMX
    • 程序

引言

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

前期准备

  1. Keil 5
  2. STM32CubeMX
  3. STM32F407MCU

介绍

系统时钟

可通过多个预分频器配置 AHB 频率、高速 APB (APB2) 和低速 APB (APB1)。AHB 域的最 大频率为 168 MHz。高速 APB2 域的最大允许频率为 84 MHz。低速 APB1 域的最大允许频 率为 42 MHz。
STM32使用定时器实现微秒(us)级延时_第1张图片

定时器时钟

STM32的定时器大致分为三种:基本定时器、通用定时器和高级定时器。各个定时器和其时钟源的对应关系为:
STM32使用定时器实现微秒(us)级延时_第2张图片
其中,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

  1. 配置时钟
    STM32使用定时器实现微秒(us)级延时_第3张图片

  2. 配置定时器
    STM32使用定时器实现微秒(us)级延时_第4张图片
    定时器频率为 =TIMxCLK/(TIM_Prescaler+1)。定时器按照此频率计数,累计 TIM_Period 个后产生一个更新或者中断。

程序

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

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设定延时周期,之后打开定时器,等待事件标志位更新后关闭定时器。

你可能感兴趣的:(stm32,单片机,嵌入式硬件)