!!!RTC测试通过!AP0801

没有纽扣电池时,只要保持供电,即使系统重启也不丢时间;
有纽扣电池时,即使断开电源,系统也能保持时间49天。
This commit is contained in:
nnhy 2016-09-17 03:35:30 +00:00
parent e69b98b143
commit 5f83bcf460
3 changed files with 24 additions and 9 deletions

View File

@ -43,7 +43,7 @@ void AP0801::Init(ushort code, cstring name, COM message)
sys.Name = (char*)name;
// RTC 提取时间
HardRTC::Start();
HardRTC::Start(false, false);
// 初始化系统
sys.Init();

View File

@ -26,8 +26,13 @@ void HardRTC::Start(bool lowpower, bool external)
auto& time = (TTime&)Time;
time.OnLoad = FuncLoadTime;
time.OnSave = FuncSaveTime;
time.OnSleep = FuncSleep;
if(lowpower) time.OnSleep = FuncSleep;
auto rtc = Instance();
if(!rtc->Opened) rtc->Init();
if(!rtc->Opened)
{
rtc->LowPower = lowpower;
rtc->External = external;
rtc->Init();
}
}

View File

@ -3,6 +3,8 @@
#include "Platform\stm32.h"
//#define TIME_DEBUG DEBUG
/************************************************ HardRTC ************************************************/
bool RTC_WaitForLastTask2(uint retry = 300)
@ -130,7 +132,7 @@ void HardRTC::LoadTime()
// 计数器记录保存时间以来经过的毫秒数
uint ms = RTC_GetCounter();
// 采用第二个后备寄存器保存秒以上的数据
uint sec = ReadBackup(1);
uint sec = ReadBackup(2);
// 谨记sec + ms/1000就是当前绝对时间要减去系统启动以来的总秒数才能作为系统基准时间
time.BaseSeconds = sec + (ms / 1000) - time.Seconds;
}
@ -145,8 +147,6 @@ void HardRTC::SaveTime()
{
debug_printf("LoadTime: ");
DateTime::Now().Show(true);
g_Counter = 0;
}
#endif
@ -159,7 +159,7 @@ void HardRTC::SaveTime()
debug_printf("SaveTime %ds %dms\r\n", sec, ms);
#endif
// 绝对总秒数存储后备寄存器
WriteBackup(1, sec);
WriteBackup(2, sec);
// 剩余毫秒数设置计数器
RTC_SetCounter(ms);
@ -215,14 +215,22 @@ uint HardRTC::ReadBackup(byte addr)
{
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)
{
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作为系统时钟源
@ -275,5 +283,7 @@ void AlarmHandler(ushort num, void* param)
//SYSCLKConfig_STOP();
//rtc->LoadTime();
#if TIME_DEBUG
debug_printf("离开低功耗模式\r\n");
#endif
}