STM32 HAL 通用定时器延时函数

发布于:2025-04-19 ⋅ 阅读:(21) ⋅ 点赞:(0)

使用通用定时器TIM3,实现ms、us延时。

delay.c

#include "delay.h"
#include "stm32f1xx_hal.h"

TIM_HandleTypeDef htim3;

/**
  * @brief  初始化定时器3用于延时
  * @param  无
  * @retval 无
  */
void Delay_Init(void)
{
  TIM_ClockConfigTypeDef sClockSourceConfig = {0};
  
  /* 使能TIM3时钟 */
  __HAL_RCC_TIM3_CLK_ENABLE();
  
  /* 基础配置 */
  htim3.Instance = TIM3;
  htim3.Init.Prescaler = 72-1;  // 72MHz / 72 = 1MHz,即计数频率为1MHz,计数周期为1us
  htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim3.Init.Period = 0xFFFF;  // 最大计数值
  htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  
  if (HAL_TIM_Base_Init(&htim3) != HAL_OK)
  {
    Error_Handler();
  }
  
  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK)
  {
    Error_Handler();
  }
  
  /* 启动定时器 */
  HAL_TIM_Base_Start(&htim3);
}

/**
  * @brief  微秒级延时
  * @param  nus: 延时的微秒数,范围:0~65535
  * @retval 无
  */
void delay_us(uint16_t nus)
{
  uint16_t differ;
  uint16_t ticks = nus;
  uint16_t start = __HAL_TIM_GET_COUNTER(&htim3);
  
  while(1)
  {
    uint16_t now = __HAL_TIM_GET_COUNTER(&htim3);
    
    if(now < start)
      differ = now + 65536 - start;  // 处理计数器溢出
    else
      differ = now - start;
    
    if(differ >= ticks)
      break;
  }
}

/**
  * @brief  毫秒级延时
  * @param  nms: 延时的毫秒数
  * @retval 无
  */
void delay_ms(uint16_t nms)
{
  uint32_t i;
  for(i = 0; i < nms; i++)
  {
    delay_us(1000);  // 1ms = 1000us
  }
}

 delay.h

#ifndef __DELAY_H
#define __DELAY_H

#include "stm32f1xx_hal.h"

void Delay_Init(void);
void delay_us(uint16_t nus);
void delay_ms(uint16_t nms);

#endif /* __DELAY_H */



 使用示例

  Delay_Init();

  delay_ms(100);


网站公告

今日签到

点亮在社区的每一天
去签到