使用通用定时器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);