Files
JYF_STC15W4K_wireless_charge/Driver/timer4.c

56 lines
1.2 KiB
C
Raw Normal View History

2025-03-18 19:34:19 +08:00
#include "timer4.h"
2025-03-18 22:49:46 +08:00
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)
{
u32 cycles = us * (FOSC / 1000000); // 计算所需时钟周期数
u16 reload = 65536 - (cycles / 1); // 1T模式下无需分频
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
}