!!!RTC测试通过!AP0801
没有纽扣电池时,只要保持供电,即使系统重启也不丢时间; 有纽扣电池时,即使断开电源,系统也能保持时间49天。
This commit is contained in:
parent
e69b98b143
commit
5f83bcf460
|
@ -43,7 +43,7 @@ void AP0801::Init(ushort code, cstring name, COM message)
|
||||||
sys.Name = (char*)name;
|
sys.Name = (char*)name;
|
||||||
|
|
||||||
// RTC 提取时间
|
// RTC 提取时间
|
||||||
HardRTC::Start();
|
HardRTC::Start(false, false);
|
||||||
|
|
||||||
// 初始化系统
|
// 初始化系统
|
||||||
sys.Init();
|
sys.Init();
|
||||||
|
|
|
@ -26,8 +26,13 @@ void HardRTC::Start(bool lowpower, bool external)
|
||||||
auto& time = (TTime&)Time;
|
auto& time = (TTime&)Time;
|
||||||
time.OnLoad = FuncLoadTime;
|
time.OnLoad = FuncLoadTime;
|
||||||
time.OnSave = FuncSaveTime;
|
time.OnSave = FuncSaveTime;
|
||||||
time.OnSleep = FuncSleep;
|
if(lowpower) time.OnSleep = FuncSleep;
|
||||||
|
|
||||||
auto rtc = Instance();
|
auto rtc = Instance();
|
||||||
if(!rtc->Opened) rtc->Init();
|
if(!rtc->Opened)
|
||||||
|
{
|
||||||
|
rtc->LowPower = lowpower;
|
||||||
|
rtc->External = external;
|
||||||
|
rtc->Init();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,8 @@
|
||||||
|
|
||||||
#include "Platform\stm32.h"
|
#include "Platform\stm32.h"
|
||||||
|
|
||||||
|
//#define TIME_DEBUG DEBUG
|
||||||
|
|
||||||
/************************************************ HardRTC ************************************************/
|
/************************************************ HardRTC ************************************************/
|
||||||
|
|
||||||
bool RTC_WaitForLastTask2(uint retry = 300)
|
bool RTC_WaitForLastTask2(uint retry = 300)
|
||||||
|
@ -130,7 +132,7 @@ void HardRTC::LoadTime()
|
||||||
// 计数器记录保存时间以来经过的毫秒数
|
// 计数器记录保存时间以来经过的毫秒数
|
||||||
uint ms = RTC_GetCounter();
|
uint ms = RTC_GetCounter();
|
||||||
// 采用第二个后备寄存器保存秒以上的数据
|
// 采用第二个后备寄存器保存秒以上的数据
|
||||||
uint sec = ReadBackup(1);
|
uint sec = ReadBackup(2);
|
||||||
// 谨记sec + ms/1000就是当前绝对时间,要减去系统启动以来的总秒数,才能作为系统基准时间
|
// 谨记sec + ms/1000就是当前绝对时间,要减去系统启动以来的总秒数,才能作为系统基准时间
|
||||||
time.BaseSeconds = sec + (ms / 1000) - time.Seconds;
|
time.BaseSeconds = sec + (ms / 1000) - time.Seconds;
|
||||||
}
|
}
|
||||||
|
@ -145,8 +147,6 @@ void HardRTC::SaveTime()
|
||||||
{
|
{
|
||||||
debug_printf("LoadTime: ");
|
debug_printf("LoadTime: ");
|
||||||
DateTime::Now().Show(true);
|
DateTime::Now().Show(true);
|
||||||
|
|
||||||
g_Counter = 0;
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -159,7 +159,7 @@ void HardRTC::SaveTime()
|
||||||
debug_printf("SaveTime %ds %dms\r\n", sec, ms);
|
debug_printf("SaveTime %ds %dms\r\n", sec, ms);
|
||||||
#endif
|
#endif
|
||||||
// 绝对总秒数存储后备寄存器
|
// 绝对总秒数存储后备寄存器
|
||||||
WriteBackup(1, sec);
|
WriteBackup(2, sec);
|
||||||
// 剩余毫秒数设置计数器
|
// 剩余毫秒数设置计数器
|
||||||
RTC_SetCounter(ms);
|
RTC_SetCounter(ms);
|
||||||
|
|
||||||
|
@ -215,14 +215,22 @@ uint HardRTC::ReadBackup(byte addr)
|
||||||
{
|
{
|
||||||
if(!Opened) return 0;
|
if(!Opened) return 0;
|
||||||
|
|
||||||
return BKP_ReadBackupRegister(BKP_DR1 + (addr << 2));
|
// BKP寄存器是16位,小端写入
|
||||||
|
uint v = BKP_ReadBackupRegister(BKP_DR1 + (addr << 2));
|
||||||
|
addr++;
|
||||||
|
v |= BKP_ReadBackupRegister(BKP_DR1 + (addr << 2)) << 16;
|
||||||
|
|
||||||
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
void HardRTC::WriteBackup(byte addr, uint value)
|
void HardRTC::WriteBackup(byte addr, uint value)
|
||||||
{
|
{
|
||||||
if(!Opened) return;
|
if(!Opened) return;
|
||||||
|
|
||||||
BKP_WriteBackupRegister(BKP_DR1 + (addr << 2), value);
|
// BKP寄存器是16位,小端写入
|
||||||
|
BKP_WriteBackupRegister(BKP_DR1 + (addr << 2), value & 0xFFFF);
|
||||||
|
addr++;
|
||||||
|
BKP_WriteBackupRegister(BKP_DR1 + (addr << 2), value >> 16);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 从停止模式醒来后配置系统时钟,打开HSE/PLL,选择PLL作为系统时钟源
|
// 从停止模式醒来后配置系统时钟,打开HSE/PLL,选择PLL作为系统时钟源
|
||||||
|
@ -275,5 +283,7 @@ void AlarmHandler(ushort num, void* param)
|
||||||
//SYSCLKConfig_STOP();
|
//SYSCLKConfig_STOP();
|
||||||
//rtc->LoadTime();
|
//rtc->LoadTime();
|
||||||
|
|
||||||
|
#if TIME_DEBUG
|
||||||
debug_printf("离开低功耗模式\r\n");
|
debug_printf("离开低功耗模式\r\n");
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue