STM32 HAL库实现US微秒延时函数

STM32之CubeL4定时器控制实现微秒延时

现代的ST主推HAL库,但是这么强大的HAL库,居然没有一个微秒级别的延时函数????


在HAL库中有毫秒级延时HAL_Delay(),原理是使用Systick作为延时计数器来实现的。如果需要增加精确的微秒级别延时,一般都是直接更改Systick配置参数,但HAL固件很多的地方都使用了HAL_Delay()函数,因此不建议修改系统自动配置的Systick参数。

一、定时器微秒实现原理

CK_INT 80M时钟输入定时器,80分频后1Mhz = 1us,也就是计数器CNT每加一次就是1us。

在这里插入图片描述
STM32L4x1 参考手册P780

我是用到是TIM2,首先需要知道TIM2的时钟,查看手册得知TIM2在APB1总线上
在这里插入图片描述
STM32L431xx 参考手册P16

知道时钟输入后直接在CubeMX中配置定时器。

定时器计数配置

首先配置系统时钟
在这里插入图片描述
接下来配置定时器
在这里插入图片描述
编写思路

设置CNT的值为0 --> (开始计数) --> 比较CNT值 --> (到达CNT值) --> 停止计数

具体代码实现

delay.c

// Core\Src\delay.c
#include "tim.h"

/**
 * @brief    微秒延时
 * @param    Delay_us  —— 指定延迟时间长度,单位为微秒。
 * @retval   None
 */
void HAL_Delay_Us(uint32_t Delay_us) 
{
		__HAL_TIM_SetCounter(&htim2, 0);
		__HAL_TIM_ENABLE(&htim2);
		while(__HAL_TIM_GetCounter(&htim2) < Delay_us);
		/* Disable the Peripheral */
		__HAL_TIM_DISABLE(&htim2);
}

delay.h

// Core\Inc\delay.h
#ifndef __DELAY_H__
#define __DELAY_H__

#include "stm32f4xx_hal.h"
#include "main.h"
#include "tim.h"

void HAL_Delay_US(uint32_t Delay_us);

#endif /* __DELAY_H__ */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
    
		GPIOA->BSRR = GPIO_PIN_2;	// PA2 = 1 	
		HAL_Delay_US(10);
		GPIOA->BSRR = (uint32_t)GPIO_PIN_2<< 16U; // PA2 = 0 	
		HAL_Delay_US(10);
  
  }
  /* USER CODE END 3 */
}

2us
在这里插入图片描述
5us
在这里插入图片描述

10us

在这里插入图片描述

50us

在这里插入图片描述

500us

在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值