Improve clock accuraty and reduce clock drifting over time (before : 1/2h per day, now : 0 minutes in 24h).
This commit is contained in:
parent
dff0d747c4
commit
be7be86033
|
@ -29,6 +29,7 @@ void DateTime::SetTime(uint16_t year, uint8_t month, uint8_t day, uint8_t dayOfW
|
||||||
}
|
}
|
||||||
|
|
||||||
void DateTime::UpdateTime(uint32_t systickCounter) {
|
void DateTime::UpdateTime(uint32_t systickCounter) {
|
||||||
|
// Handle systick counter overflow
|
||||||
uint32_t systickDelta = 0;
|
uint32_t systickDelta = 0;
|
||||||
if(systickCounter < previousSystickCounter) {
|
if(systickCounter < previousSystickCounter) {
|
||||||
systickDelta = 0xffffff - previousSystickCounter;
|
systickDelta = 0xffffff - previousSystickCounter;
|
||||||
|
@ -37,8 +38,18 @@ void DateTime::UpdateTime(uint32_t systickCounter) {
|
||||||
systickDelta = systickCounter - previousSystickCounter;
|
systickDelta = systickCounter - previousSystickCounter;
|
||||||
}
|
}
|
||||||
|
|
||||||
previousSystickCounter = systickCounter;
|
/*
|
||||||
currentDateTime += std::chrono::milliseconds(systickDelta);
|
* 1000 ms = 1024 ticks
|
||||||
|
*/
|
||||||
|
auto correctedDelta = systickDelta / 1024;
|
||||||
|
auto rest = (systickDelta - (correctedDelta*1024));
|
||||||
|
if(systickCounter >= rest) {
|
||||||
|
previousSystickCounter = systickCounter - rest;
|
||||||
|
} else {
|
||||||
|
previousSystickCounter = 0xffffff - (rest - systickCounter);
|
||||||
|
}
|
||||||
|
|
||||||
|
currentDateTime += std::chrono::seconds (correctedDelta);
|
||||||
|
|
||||||
auto dp = date::floor<date::days>(currentDateTime);
|
auto dp = date::floor<date::days>(currentDateTime);
|
||||||
auto time = date::make_time(currentDateTime-dp);
|
auto time = date::make_time(currentDateTime-dp);
|
||||||
|
|
1558
src/sdk_config.h
1558
src/sdk_config.h
File diff suppressed because it is too large
Load diff
Loading…
Reference in a new issue