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