STM32之定时器实现us级延时

在 STM32 开发中,delay_ms()是最常用的延时函数,但很多场景需要更精细的us 级延时。本文将以STM32 的TIM7 定时器实现 us 级延时。

一、TIM7 的参数计算

TIM7 是 STM32 的基本定时器,挂载在APB1总线上,

\[基本定时器(TIM7)的时钟= PCLK1 × 2 \]

以常见的系统时钟配置为例(STM32F407):

  • 系统时钟(SYSCLK)= 168MHz;
  • APB1 总线时钟(PCLK1)= 42MHz(APB1 预分频系数为 4);
  • 基本定时器(TIM7)的时钟 = PCLK1 × 2 = 84MHz(APB1 预分频系数≠1 时,定时器时钟自动倍频 2 倍)。

三、完整代码示例

1、tim.c文件

/* TIM7 init function */
void TIM7_Init(void)
{
    TIM_MasterConfigTypeDef sMasterConfig = {0};

    htim7.Instance = TIM7;
    htim7.Init.Prescaler = 83;
    htim7.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim7.Init.Period = 65535;
    htim7.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
    if (HAL_TIM_Base_Init(&htim7) != HAL_OK)
    {
        Error_Handler();
    }
    sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
    sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
    if (HAL_TIMEx_MasterConfigSynchronization(&htim7, &sMasterConfig) != HAL_OK)
    {
        Error_Handler();
    }
}

void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
{
    if(tim_baseHandle->Instance==TIM7)
    {
        /* TIM7 clock enable */
        __HAL_RCC_TIM7_CLK_ENABLE();
    }
}

void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle)
{
    if(tim_baseHandle->Instance==TIM7)
    {
        /* Peripheral clock disable */
        __HAL_RCC_TIM7_CLK_DISABLE();
    }
}

3、bsp_timer.c文件

#include "bsp_timer.h"
#include "tim.h"

void timer_delay_us(uint32_t us)
{
    uint16_t delay = 0xfffe - us;
    
    __HAL_TIM_SetCounter(&htim7, delay);    /* 设置定时器7的计数初始值 */
    
    HAL_TIM_Base_Start(&htim7);     /* 开启定时器 */

    while (delay < 0xfffe)
    {
        delay = __HAL_TIM_GetCounter(&htim7);
    }
    
    HAL_TIM_Base_Stop(&htim7);  /* 关闭定时器 */
}
posted @ 2026-02-26 16:56  比特向阳  阅读(39)  评论(0)    收藏  举报