打印
[蓝牙芯片]

解决ch57x的RTC库代码无法同时设置年月日时分秒问题分享

[复制链接]
12719|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
今天移植代码发现rtc的这个函数,在设置年月日的时候成功,但是时分秒一直无法设置成功

void RTC_InitTime( UINT16 y, UINT16 mon, UINT16 d, UINT16 h, UINT16 m, UINT16 s )
{
    UINT32  t;
    UINT16  year, month, day, sec2, t32k;
    UINT8V clk_pin;

    year = y;
    month = mon;
    day = 0;
    while ( year > BEGYEAR )
    {
      day += YearLength( year-1 );
      year--;
    }
    while ( month > 1 )
    {
      day += monthLength( IsLeapYear( y ), month-2 );
      month--;
    }

    day += d-1;
    sec2 = (h%24)*1800+m*30+s/2;
    t32k = (s&1)?(0x8000):(0);
    t = sec2;
    t = t<<16 | t32k;

    do{
      clk_pin = (R8_CK32K_CONFIG&RB_32K_CLK_PIN);
    }while( (clk_pin != (R8_CK32K_CONFIG&RB_32K_CLK_PIN)) || (!clk_pin) );


    R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
    R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
    R32_RTC_TRIG = day;
    R8_RTC_MODE_CTRL |= RB_RTC_LOAD_HI;
    R32_RTC_TRIG = t;
    R8_RTC_MODE_CTRL |= RB_RTC_LOAD_LO;
    R8_SAFE_ACCESS_SIG = 0;
}
经过测试,发现在设置时分秒之前,重新开关一下
    R8_SAFE_ACCESS_SIG = 0;    
    R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
    R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
能够解决该异常.
修改如下图所示:



使用特权

评论回复
沙发
单片小菜| | 2021-5-18 09:32 | 只看该作者
楼主的问题解决了吗?

使用特权

评论回复
板凳
lanjackg2003|  楼主 | 2021-5-18 10:46 | 只看该作者
单片小菜 发表于 2021-5-18 09:32
楼主的问题解决了吗?

解决了,就按照我分享的方式就可以

使用特权

评论回复
地板
WCHTech2| | 2021-5-18 17:39 | 只看该作者

应该是超过16个系统主频周期,自动关闭安全模式了,需要手动重新打开。

使用特权

评论回复
5
lanjackg2003|  楼主 | 2021-5-18 18:23 | 只看该作者
WCHTech2 发表于 2021-5-18 17:39
应该是超过16个系统主频周期,自动关闭安全模式了,需要手动重新打开。
...

那解释得通

官方库中的代码中好像还有几处有安全访问的问题
估计要更新新版本解决

使用特权

评论回复
6
勇敢的大白菜| | 2021-5-18 23:41 | 只看该作者
需要手动重新打开吗?

使用特权

评论回复
评论
WCHTech2 2021-5-19 09:39 回复TA
超过16个系统时钟周期就会自动关闭,再次使用就需要手动打开 
7
tail066| | 2021-6-16 20:01 | 只看该作者
这种安全访问,16个系统时钟后,MCU的自主行为么

使用特权

评论回复
8
lanjackg2003|  楼主 | 2021-6-30 17:06 | 只看该作者
tail066 发表于 2021-6-16 20:01
这种安全访问,16个系统时钟后,MCU的自主行为么

应该是

使用特权

评论回复
9
两只袜子| | 2021-7-1 19:28 | 只看该作者
改天按照楼主的方法试试

使用特权

评论回复
10
lanjackg2003|  楼主 | 2021-7-2 10:50 | 只看该作者
现在想想最好的方式应该是把总中断关了,防止程序在中断服务程序中执行超过16个时钟周期

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

55

主题

426

帖子

7

粉丝