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