查看: 1882|回复: 0

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

[复制链接]
  • TA的每日心情
    开心
    2016-3-22 09:25
  • 签到天数: 115 天

    连续签到: 1 天

    [LV.6]常住居民II

    发表于 2015-11-21 19:56:29 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 _烟酒僧_ 于 2015-11-21 20:06 编辑

    上一篇帖子,把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) {
       
    游客,如果您要查看本帖隐藏内容请回复

    QQ截图20151121194413.png

    总结一下 ,有了以上的代码,再加入一点万年历算法,我们可以完全脱离
    时钟芯片做出自己想要的时钟来,而且时间跨度很大,可以跨0XFFFFFFFF秒,
    更加随心所欲。


    End





    回复

    使用道具 举报

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

    本版积分规则

    关闭

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

    手机版|小黑屋|与非网

    GMT+8, 2024-4-27 00:11 , Processed in 0.112028 second(s), 16 queries , MemCache On.

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

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.