Files
JYF_STC15W4K_wireless_charge/Driver/timer.c

101 lines
2.0 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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 ();
}