查看: 995|回复: 0

【XMEGA深思录】2、抽筋扒皮彻查片内RTC32

[复制链接]

该用户从未签到

发表于 2015-11-24 23:30:27 | 显示全部楼层 |阅读模式
分享到:
上一篇帖子,把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秒,
更加随心所欲。
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /4 下一条

手机版|小黑屋|与非网

GMT+8, 2024-11-18 12:34 , Processed in 0.126585 second(s), 18 queries , MemCache On.

ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

苏公网安备 32059002001037号

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.