【嵌入式学习笔记】---- 基于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库提供的函数和系统时钟
posted @ 2024-03-16 00:34  晚风也温柔  阅读(55)  评论(0编辑  收藏  举报