GD32F470 RTC设置 不生效!(BUG)

[复制链接]
2821|12
 楼主| caizhiwei 发表于 2023-3-20 18:56 | 显示全部楼层 |阅读模式
用的官方的标准库,先使用历程,貌似OK;
第一次能设置,RTC跑起来了之后,设置不生效,但是仿真到库函数里面,返回值确实成功的!

评论

RTC有一个初始化模式,RTC运行起来,如果重新想设置RTC时间,需要控制RTC模块进入初始化模式  发表于 2023-3-20 20:03
duzhiqiang521 发表于 2023-3-20 20:01 | 显示全部楼层
啥意思?
 楼主| caizhiwei 发表于 2023-3-21 13:09 | 显示全部楼层
问题解决了: 1. 没有初始化RTC是不行的,结果是 TRC 能走秒,但是写不进去;
2. 年月日不需要转BCD,但是时分秒需要转;
 楼主| caizhiwei 发表于 2023-3-21 13:10 | 显示全部楼层
代码分享给大家:
  1. /*******************************************************************!
  2.     \brief  使用固定格式设置时间,默认东八区
  3.     \param[in]  year: 0 ~ 99 (十进制)
  4.                             month: 1 ~ 12 (十进制)
  5.                             date: 1 ~ 31 (十进制)
  6.                             day_of_week:1 ~7 (十进制)
  7.                             hour: 0 ~ 23
  8.                             minute: 0 ~ 59
  9.                             second: 0 ~ 59
  10.     \param[out] none
  11.     \retval     none
  12. *******************************************************************/
  13. void BSP_RTC_time_setup(uint8_t year, uint8_t month, uint8_t date,\
  14.               uint8_t hour,  uint8_t minute,  uint8_t second)
  15. {
  16.     //设置RTC时间值
  17.     rtc_parameter_struct rtc_initpara;

  18.     rtc_initpara.factor_asyn = 0x7F;
  19.     rtc_initpara.factor_syn = 0xFF;
  20.     rtc_initpara.year = (year);
  21.     rtc_initpara.day_of_week = RTC_SATURDAY;  // 一般用不到
  22.     rtc_initpara.month = (month);
  23.     rtc_initpara.date = (date);
  24.     rtc_initpara.display_format = RTC_24HOUR;
  25.     rtc_initpara.am_pm = RTC_AM;
  26.    
  27.     rtc_initpara.hour = RTC_ByteToBCD(hour);
  28.         rtc_initpara.minute = RTC_ByteToBCD(minute);
  29.         rtc_initpara.second = RTC_ByteToBCD(second);

  30. #if 0
  31.     /* current time input */
  32.     //当前时间输入
  33.     printf("=======Configure RTC Time========\n\r");
  34.     printf("  please input hour:\n\r");
  35.     while (0xFF == tmp_hh)
  36.         {
  37.         tmp_hh = usart_input_threshold(23);//输入 时
  38.         rtc_initpara.hour = tmp_hh;
  39.     }
  40.     printf("  %0.2x\n\r", tmp_hh);

  41.     printf("  please input minute:\n\r");
  42.     while (0xFF == tmp_mm)
  43.         {
  44.         tmp_mm = usart_input_threshold(59);//输入 分
  45.         rtc_initpara.minute = tmp_mm;
  46.     }
  47.     printf("  %0.2x\n\r", tmp_mm);

  48.     printf("  please input second:\n\r");
  49.     while (0xFF == tmp_ss)
  50.         {
  51.         tmp_ss = usart_input_threshold(59);//输入 秒
  52.         rtc_initpara.second = tmp_ss;
  53.     }
  54.     printf("  %0.2x\n\r", tmp_ss);
  55.    
  56. #endif
  57.             //RTC当前时间配置
  58.     if(ERROR == rtc_init(&rtc_initpara))
  59.         {
  60.         printf("\n\r** RTC time configuration failed! **\n\r");
  61.     }
  62.         else
  63.         {
  64.         printf("\n\r** RTC time configuration success! **\n\r");
  65.         rtc_show_time();
  66.     }
  67. }
 楼主| caizhiwei 发表于 2023-3-21 13:10 | 显示全部楼层
点击插入代码,但是还是没有代码格式,
 楼主| caizhiwei 发表于 2023-3-21 13:11 | 显示全部楼层
  1. uint8_t RTC_BCDToByte(uint8_t Value)//BCD转二进制
  2. {
  3.         uint8_t tmp;
  4.         tmp = ((Value & 0xF0u) >> 4u) * 10u;
  5.         return (tmp + (Value & 0x0Fu));
  6. }

  7. uint8_t RTC_ByteToBCD(uint8_t Value)//二进制转BCD
  8. {
  9.         uint32_t bcdhigh = 0u;
  10.         uint8_t Param = Value;

  11.         while(Param >= 10u)
  12.         {
  13.                 bcdhigh++;
  14.                 Param -= 10u;
  15.         }
  16.         return  ((uint8_t)(bcdhigh << 4u) | Param);
  17. }
 楼主| caizhiwei 发表于 2023-3-21 13:11 | 显示全部楼层
这两个小函数很好用,分享之
sagade 发表于 2023-3-22 09:49 | 显示全部楼层
本帖最后由 sagade 于 2023-3-22 09:54 编辑
caizhiwei 发表于 2023-3-21 13:09
问题解决了: 1. 没有初始化RTC是不行的,结果是 TRC 能走秒,但是写不进去;
2. 年月日不需要转BCD,但是 ...

分秒是BCD的啊 96381641a5fb356682.png
 楼主| caizhiwei 发表于 2023-3-22 15:09 | 显示全部楼层

截图的注释里,年月日是bcd格式,但是填进去不行。实际操作就是10进制

结论:数据手册+代码注释有误
sagade 发表于 2023-3-23 09:52 | 显示全部楼层
caizhiwei 发表于 2023-3-22 15:09
截图的注释里,年月日是bcd格式,但是填进去不行。实际操作就是10进制

结论:数据手册+代码注释有误 ...

库文件的注释确实是有点问题,手册应该是对的,我450/470都是按照手册来操作的,BCD码写入RTC,读取的时候再转成10进制的,没有问题。
库文件貌似没有对写入值做判断,写入的不是BCD码也能写入,但是在边界的地方就会出错,比如跨年跨月的时候。
 楼主| caizhiwei 发表于 2023-3-23 16:19 | 显示全部楼层
354641c0b6c0de4b.png
这是官方的历程,写的稀烂,打印出来的数据有 89分 89秒
 楼主| caizhiwei 发表于 2023-3-23 16:21 | 显示全部楼层
为啥呢? 因为没有 bcd->hex 转换。
毫秒打印为啥搞3个变量?
  1.     time_subsecond = (1000 - (time_subsecond*1000+1000)/400);

这一句不就好了么 一个%d输出。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

100

主题

856

帖子

16

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