STM32 HAL 通用定时器延时函数
使用通用定时器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,计数周期为1ushtim3.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; // 处理计数器溢出elsediffer = 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);