|
上一篇帖子,把EEPROM涉及的方方面面介绍的比较详细。
你可能觉得实用,也可能感觉比较肤浅,不过这都没关系,
因为这一篇会用以上一篇为基础,而我并不打算在这一篇,再
扯片内EEPROM的事。
要把片内RTC32包含的沟沟道道完全理顺并不简单,我也被官方库,
例程代码坑害过。
下面贴出官方玩具级代码,和我给出的产品级代码,需要提醒一下的是,
官方的这段样板程序是埋了地雷,有重大缺陷的,请君慎用。(单片机嵌入式技术群 162388414)
仔细对比一下应该能够看出两端代码的端倪……
跑板请选A,项目植入建议选用B
A、官方玩具级“样板程序”,
---------------------------------------------------------------------------------------------------
// Workaround for known issue: Enable RTC32 sysclk
sysclk_enable_module(SYSCLK_PORT_GEN, SYSCLK_RTC);
while (RTC32.SYNCCTRL & RTC32_SYNCBUSY_bm) {
// Wait for RTC32 sysclk to become stable
}
// If we have battery power and RTC is running, don't initialize RTC32
if (rtc_vbat_system_check(false) != VBAT_STATUS_OK) {
rtc_init();
// Set current time to after production date
rtc_timestamp = production_date_get_timestamp() + 1;
rtc_set_time(rtc_timestamp);
}
---------------------------------------------------------------------------------------------------
B、产品级代码
---------------------------------------------------------------------------------------------------
uint8_t rtc32FirstBootFlag;
uint32_t rtcCounter;
sysclk_enable_module(SYSCLK_PORT_GEN, SYSCLK_RTC);
while (RTC32.SYNCCTRL & RTC32_SYNCBUSY_bm) {
}
rtc32FirstBootFlag = nvm_eeprom_read_byte(0x0000);
if(rtc32FirstBootFlag != 0x09) {
nvm_eeprom_write_byte(0x0000,0x09);
rtc_vbat_system_check(false);
rtc_init();
rtc_set_time(0);
} else {
if(rtc_vbat_system_check(true) != VBAT_STATUS_OK) {
rtc_init();
rtc_set_time(0);
}
}
rtcCounter = rtc_get_time();
---------------------------------------------------------------------------------------------------
简单测试一下,读到的RTC32计数器的值为0xC05,因为我断电了一段时间,
片内RTC已经跑了0xC05秒
总结一下 ,有了以上的代码,再加入一点万年历算法,我们可以完全脱离
时钟芯片做出自己想要的时钟来,而且时间跨度很大,可以跨0XFFFFFFFF秒,
更加随心所欲。 |
|