2025-03-19 18:22:32 +08:00
|
|
|
|
#include "timer.h"
|
2025-03-18 19:34:19 +08:00
|
|
|
|
|
2025-03-19 18:22:32 +08:00
|
|
|
|
// 初始化所有定时器
|
|
|
|
|
void
|
|
|
|
|
Timer_Init (void)
|
|
|
|
|
{
|
|
|
|
|
Timer3_Init (); // 定时器3初始化
|
|
|
|
|
Timer4_Init (); // 定时器4初始化
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 定时器3
|
|
|
|
|
uint32_t uptime = 0;
|
|
|
|
|
uint8_t time3_cnt = 0;
|
|
|
|
|
// 定时器3初始化
|
|
|
|
|
void
|
|
|
|
|
Timer3_Init (void) // 10毫秒@30.000MHz
|
|
|
|
|
{
|
|
|
|
|
T4T3M &= 0xFD; // 定时器时钟12T模式
|
|
|
|
|
T3L = 0x58; // 设置定时初始值
|
|
|
|
|
T3H = 0x9E; // 设置定时初始值
|
|
|
|
|
T4T3M |= 0x08; // 定时器3开始计时
|
|
|
|
|
IE2 |= 0x20; // 使能定时器3中断
|
|
|
|
|
}
|
|
|
|
|
// 定时器3的中断服务
|
|
|
|
|
void
|
|
|
|
|
Timer3_Isr (void) interrupt 19
|
|
|
|
|
{
|
2025-03-20 16:36:10 +08:00
|
|
|
|
if (++time3_cnt >= 100)
|
2025-03-19 18:22:32 +08:00
|
|
|
|
{
|
|
|
|
|
uptime++;
|
|
|
|
|
time3_cnt = 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// 获取系统时间(单位:秒)
|
|
|
|
|
uint32_t
|
|
|
|
|
GetUpTime (void)
|
|
|
|
|
{
|
|
|
|
|
return uptime;
|
|
|
|
|
}
|
2025-03-20 16:36:10 +08:00
|
|
|
|
// 获取系统时间(单位:毫秒)
|
|
|
|
|
uint32_t
|
|
|
|
|
GetUpTime_10Ms (void)
|
|
|
|
|
{
|
|
|
|
|
return uptime*100+time3_cnt;
|
|
|
|
|
}
|
2025-03-18 19:34:19 +08:00
|
|
|
|
|
2025-03-19 18:22:32 +08:00
|
|
|
|
// 定时器4
|
|
|
|
|
u8 Timer4_OF = 0; // 定时器4溢出标志
|
2025-03-18 19:34:19 +08:00
|
|
|
|
// 定时器4初始化(16位自动重载模式)
|
2025-03-18 22:49:46 +08:00
|
|
|
|
void
|
|
|
|
|
Timer4_Init (void)
|
|
|
|
|
{
|
|
|
|
|
Timer4_Stop (); // 停止定时器4
|
|
|
|
|
T4T3M &= 0x0F; // 清除T4控制位
|
|
|
|
|
T4T3M |= 0x20; // 设置T4为1T模式
|
|
|
|
|
T4L = 0xD0; // 设置定时初始值
|
|
|
|
|
T4H = 0x8A; // 设置定时初始值 1ms@30MHz 1T
|
|
|
|
|
IE2 |= 0x40; // 使能定时器4中断
|
2025-03-18 19:34:19 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 微秒级延时(误差±0.3us)
|
2025-03-18 22:49:46 +08:00
|
|
|
|
void
|
|
|
|
|
Timer4_DelayUs (u16 us)
|
|
|
|
|
{
|
2025-03-21 00:45:04 +08:00
|
|
|
|
// u32 cycles = us * (FOSC / 1000000); // 计算所需时钟周期数
|
|
|
|
|
// 30000000/1000000=30
|
|
|
|
|
u16 reload = 65536 - (30 * us); // 1T模式下无需分频
|
2025-03-18 22:49:46 +08:00
|
|
|
|
|
|
|
|
|
T4H = reload >> 8; // 设置重载值高字节
|
|
|
|
|
T4L = reload & 0xFF; // 低字节
|
|
|
|
|
T4T3M |= 0x80; // 启动定时器4
|
|
|
|
|
|
|
|
|
|
while (Timer4_OF != True)
|
|
|
|
|
; // 等待TF4溢出标志置位
|
|
|
|
|
Timer4_OF = False; // 清除溢出标志
|
2025-03-18 19:34:19 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 毫秒级延时(基于微秒级扩展)
|
2025-03-18 22:49:46 +08:00
|
|
|
|
void
|
|
|
|
|
Timer4_DelayMs (u16 ms)
|
|
|
|
|
{
|
|
|
|
|
while (ms--)
|
|
|
|
|
{
|
|
|
|
|
Timer4_DelayUs (1000);
|
2025-03-18 19:34:19 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 停止定时器4
|
2025-03-18 22:49:46 +08:00
|
|
|
|
void
|
|
|
|
|
Timer4_Stop (void)
|
|
|
|
|
{
|
|
|
|
|
T4T3M &= ~0x80; // 停止定时器4
|
2025-03-18 19:34:19 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 定时器4中断服务程序
|
2025-03-18 22:49:46 +08:00
|
|
|
|
void
|
|
|
|
|
Timer4_Isr (void) interrupt 20
|
2025-03-18 19:34:19 +08:00
|
|
|
|
{
|
2025-03-18 22:49:46 +08:00
|
|
|
|
Timer4_OF = True;
|
|
|
|
|
Timer4_Stop ();
|
2025-03-18 19:34:19 +08:00
|
|
|
|
}
|