一、定时器配置
设置其工作模式为16位自动重载,并使用PCLK时钟源分频至1MHz,使得每个计数周期为1微秒。
二、代码
hd_gpt_timer3.c
#include "hd_gpt_timer.h"
/**
* @brief TIM3 微秒延时(1 tick = 1 µs)
* @param us 要延时的微秒数(最大 65535 µs)
*/
void delay_us(uint16_t us)
{
if (us == 0) return; // 避免出现 start==CNT 死等
uint16_t start = Tim3_M0_Cnt16Get();
while ((uint16_t)(Tim3_M0_Cnt16Get() - start) < us);
}
/**
* @brief TIM3 初始化,使用 PCLK÷32 → 1 MHz, tick = 1 µs
* 在 main 或系统初始化时调用一次
*/
void Timer3_Init_ForDelay(void)
{
stc_tim3_mode0_cfg_t cfg;
DDL_ZERO_STRUCT(cfg);
Sysctrl_SetPeripheralGate(SysctrlPeripheralTim3, TRUE);
cfg.enWorkMode = Tim3WorkMode0;
cfg.enCT = Tim3Timer;
cfg.enPRS = Tim3PCLKDiv32; // 32MHz / 32 = 1MHz
cfg.enCntMode = Tim316bitArrMode; // 自动重载
cfg.bEnTog = FALSE;
cfg.bEnGate = FALSE;
Tim3_Mode0_Init(&cfg);
Tim3_M0_Cnt16Set(0); // CNT清零
Tim3_M0_Run(); // 启动定时器
}
hd_gpt_timer.h
#ifndef HD_GPT_TIMER_H
#define HD_GPT_TIMER_H
#include "ddl.h"
#include "timer3.h"
#include "gpio.h"
void Timer3_Init_ForDelay(void);
void delay_us(uint16_t us);
#endif
————————————————
版权声明:本文为CSDN博主「chem4111」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_46286415/article/details/148057787
|
|