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); /* 关闭定时器 */
}

浙公网安备 33010602011771号