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