【嵌入式学习笔记】---- 基于SysTick定时器实现微秒延时
硬件开发板:STM32G0B1RET6
软件平台:cubemax+keil+VScode
1 驱动代码
My_Delay.h
#ifndef _MY_DELAY_H_
#define _MY_DELAY_H_
#include "main.h"
#include "stm32g0xx_hal.h"
// 微秒级延时函数
void my_delay_us(uint32_t us);
// 微秒级延时函数
void my_delay_ms(uint32_t ms);
#endif
My_Delay.c
#include "My_Delay.h"
// 微秒级延时函数
void my_delay_us(uint32_t us)
{
uint32_t start = HAL_GetTick(); // 获取当前毫秒计数
// 计算所需的毫秒延时次数
uint32_t delay_ms = us / 1000;
// 计算余数,用于微秒级精确延时
uint32_t remaining_us = us % 1000;
// 执行毫秒级延时
HAL_Delay(delay_ms);
// 延时剩余的微秒
if (remaining_us)
{
uint32_t end = start + delay_ms; // 结束毫秒计数
while (HAL_GetTick() < end); // 等待毫秒计数达到结束值
uint32_t now = HAL_GetTick(); // 获取当前毫秒计数
while (HAL_GetTick() == now); // 等待下一个毫秒的开始
while (HAL_GetTick() < (now + 1)); // 等待进入下一个毫秒
// 微秒级精确延时
while (HAL_GetTick() < (now + 1 + remaining_us / 1000)); // 等待进入下一个微秒级时刻
}
}
// 毫秒级延时函数
void my_delay_ms(uint32_t ms)
{
HAL_Delay(ms);
}
main函数
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_TIM6_Init();
MX_USART2_UART_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
my_delay_us(100000);
printf("delay ok\n");
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
2 特点
2.1 优点
- 简单易用:使用了HAL库提供的标准函数,不需要额外的配置和初始化
- 精度较高:通过结合毫秒级延时和微秒级精确延时,可以实现较高精度的延时,适用于一些对时间精度要求较高的应用场景
- 兼容性好:由于使用了HAL库提供的函数,因此代码具有较好的兼容性,可以适用于不同型号的STM32微控制器
2.2 缺点
- 无法在延时期间进行其他操作:在进行微秒级延时时,CPU会忙等待,无法执行其他任务,会导致CPU利用率低下
- 延时精度受系统时钟影响:延时精度受到系统时钟频率的影响,如果系统时钟频率发生变化,可能会影响延时精度
- 可移植性差:如果将代码移植到其他系统或者其他平台上,可能需要重新调整延时参数,因为它依赖于STM32 HAL库提供的函数和系统时钟
本文来自博客园,作者:晚风也温柔,转载请注明原文链接:https://www.cnblogs.com/zxr-blog/p/18076559