[蓝牙芯片] 解决ch57x的RTC库代码无法同时设置年月日时分秒问题分享

[复制链接]
 楼主| lanjackg2003 发表于 2021-5-17 23:20 | 显示全部楼层 |阅读模式
今天移植代码发现rtc的这个函数,在设置年月日的时候成功,但是时分秒一直无法设置成功

  1. void RTC_InitTime( UINT16 y, UINT16 mon, UINT16 d, UINT16 h, UINT16 m, UINT16 s )
  2. {
  3.     UINT32  t;
  4.     UINT16  year, month, day, sec2, t32k;
  5.     UINT8V clk_pin;

  6.     year = y;
  7.     month = mon;
  8.     day = 0;
  9.     while ( year > BEGYEAR )
  10.     {
  11.       day += YearLength( year-1 );
  12.       year--;
  13.     }
  14.     while ( month > 1 )
  15.     {
  16.       day += monthLength( IsLeapYear( y ), month-2 );
  17.       month--;
  18.     }

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

  24.     do{
  25.       clk_pin = (R8_CK32K_CONFIG&RB_32K_CLK_PIN);
  26.     }while( (clk_pin != (R8_CK32K_CONFIG&RB_32K_CLK_PIN)) || (!clk_pin) );


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

1532460a28866ec58b.png

单片小菜 发表于 2021-5-18 09:32 | 显示全部楼层
楼主的问题解决了吗?
 楼主| lanjackg2003 发表于 2021-5-18 10:46 | 显示全部楼层
单片小菜 发表于 2021-5-18 09:32
楼主的问题解决了吗?

解决了,就按照我分享的方式就可以
WCHTech2 发表于 2021-5-18 17:39 | 显示全部楼层
999460a38b20c2ede.png
应该是超过16个系统主频周期,自动关闭安全模式了,需要手动重新打开。
 楼主| lanjackg2003 发表于 2021-5-18 18:23 | 显示全部楼层
WCHTech2 发表于 2021-5-18 17:39
应该是超过16个系统主频周期,自动关闭安全模式了,需要手动重新打开。
...

那解释得通

官方库中的代码中好像还有几处有安全访问的问题
估计要更新新版本解决
勇敢的大白菜 发表于 2021-5-18 23:41 | 显示全部楼层
需要手动重新打开吗?

评论

超过16个系统时钟周期就会自动关闭,再次使用就需要手动打开  发表于 2021-5-19 09:39
tail066 发表于 2021-6-16 20:01 | 显示全部楼层
这种安全访问,16个系统时钟后,MCU的自主行为么
 楼主| lanjackg2003 发表于 2021-6-30 17:06 | 显示全部楼层
tail066 发表于 2021-6-16 20:01
这种安全访问,16个系统时钟后,MCU的自主行为么

应该是
两只袜子 发表于 2021-7-1 19:28 来自手机 | 显示全部楼层
改天按照楼主的方法试试
 楼主| lanjackg2003 发表于 2021-7-2 10:50 | 显示全部楼层
现在想想最好的方式应该是把总中断关了,防止程序在中断服务程序中执行超过16个时钟周期
您需要登录后才可以回帖 登录 | 注册

本版积分规则

56

主题

441

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部

56

主题

441

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部