查看: 1117|回复: 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/4 下一条

【预约参会三重礼】2025 瑞萨电子工业以太网技术日
2025瑞萨电子工业以太网技术日聚焦工业4.0核心需求,为工程师与企业决策者提供实时通信技术最佳解决方案,通过案例剖析、现场演示、动手实践,全方位解读瑞萨电子最新实时通信技术解决方案,洞察行业发展趋势,助力企业高效开发更具竞争力工业以太网产品。

查看 »

手机版|小黑屋|与非网

GMT+8, 2025-4-1 13:53 , Processed in 0.108660 second(s), 19 queries , MemCache On.

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

苏公网安备 32059002001037号

Powered by Discuz! X3.5

Copyright © 2001-2024, Tencent Cloud.