注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
liklon的个人空间 https://home.eeworld.com.cn/space-uid-343627.html [收藏] [复制] [分享] [RSS]
日志

【liklon玩GD32F350】五、RTC时钟

已有 1230 次阅读2018-9-5 15:56

在后续的开发中还需要一个日历,那么就调试一下GD32的RTC。

根据实际的板子看,这两个晶振是都没有焊的,所以RTC时钟源也只能是选择内部的40K

在手册中还有这么一段话:

综上两点完成如下代码:
  1.     rcu_periph_clock_enable(RCU_PMU);
  2.     pmu_backup_write_enable();
  3.    
  4.     rcu_osci_on(RCU_IRC40K);
  5.     rcu_osci_stab_wait(RCU_IRC40K);
  6.     rcu_rtc_clock_config(RCU_RTCSRC_IRC40K);
  7.     rcu_periph_clock_enable(RCU_RTC);
  8.     rtc_register_sync_wait();
复制代码


进一步对RTC进行初始化:
  1. void calendar_init(calendar_info_t info)
  2. {
  3.     rtc_parameter_struct rtc_parameter =
  4.     {
  5.         .rtc_factor_asyn = 0x4e - 1,
  6.         .rtc_factor_syn = 0x200 - 1,
  7.         .rtc_display_format = RTC_24HOUR,
  8.     };

  9.     rtc_parameter.rtc_year = DEC2BCD(info.year);
  10.     rtc_parameter.rtc_month = info.month;
  11.     rtc_parameter.rtc_date = DEC2BCD(info.day);
  12.     rtc_parameter.rtc_day_of_week = info.week;
  13.     rtc_parameter.rtc_hour = info.hour;
  14.     rtc_parameter.rtc_minute = DEC2BCD(info.min);
  15.     rtc_parameter.rtc_second = DEC2BCD(info.second);
  16.     rtc_init(&rtc_parameter);

  17. }
复制代码

其中calendar_info_t 是自定义的结构体,以及DEC2BCD 和BCD2DEC转换如下:
  1. #define BCD2DEC(n)  ((n >> 4) * 10 + (n & 0xf))
  2. #define DEC2BCD(n)  (((n / 10) << 4) + (n % 10))


  3. typedef struct
  4. {
  5.     uint8_t year;
  6.     uint8_t month;
  7.     uint8_t day;
  8.     uint8_t week;
  9.     uint8_t hour;
  10.     uint8_t min;
  11.     uint8_t second;
  12. }calendar_info_t;
复制代码

看下面这个结构体的注释,提到BCD编码的则需要转换
  1. typedef struct
  2. {
  3.     uint8_t rtc_year;                                                                  /*!< RTC year value: 0x0 - 0x99(BCD format) */
  4.     uint8_t rtc_month;                                                                 /*!< RTC month value */
  5.     uint8_t rtc_date;                                                                  /*!< RTC date value: 0x1 - 0x31(BCD format) */
  6.     uint8_t rtc_day_of_week;                                                           /*!< RTC weekday value */
  7.     uint8_t rtc_hour;                                                                  /*!< RTC hour value */
  8.     uint8_t rtc_minute;                                                                /*!< RTC minute value: 0x0 - 0x59(BCD format) */
  9.     uint8_t rtc_second;                                                                /*!< RTC second value: 0x0 - 0x59(BCD format) */
  10.     uint16_t rtc_factor_asyn;                                                          /*!< RTC asynchronous prescaler value: 0x0 - 0x7F */
  11.     uint16_t rtc_factor_syn;                                                           /*!< RTC synchronous prescaler value: 0x0 - 0x7FFF */
  12.     uint32_t rtc_am_pm;                                                                /*!< RTC AM/PM value */
  13.     uint32_t rtc_display_format;                                                       /*!< RTC time notation */
  14. }rtc_parameter_struct;
复制代码

在上述的初始化代码中有两个分频参数:

接下来是编写读取时间的函数:
  1. void calendar_get_date(calendar_info_t *pinfo)
  2. {
  3.     rtc_parameter_struct rtc_parameter;
  4.     rtc_current_time_get(&rtc_parameter);
  5.     pinfo->year = BCD2DEC(rtc_parameter.rtc_year);
  6.     pinfo->month = rtc_parameter.rtc_month;
  7.     pinfo->day = BCD2DEC(rtc_parameter.rtc_date);
  8.     pinfo->week = rtc_parameter.rtc_day_of_week;
  9.     pinfo->hour = rtc_parameter.rtc_hour;
  10.     pinfo->min = BCD2DEC(rtc_parameter.rtc_minute);
  11.     pinfo->second = BCD2DEC(rtc_parameter.rtc_second);
  12. }
复制代码



在main函数中测试:
  1.     calendar_info.year = 18;
  2.     calendar_info.month = 9;
  3.     calendar_info.day = 5;
  4.     calendar_info.week = 3;
  5.     calendar_info.hour = 15;
  6.     calendar_info.min = 26;
  7.     calendar_info.second = 22;
  8.     calendar_init(calendar_info);
  9.     uart1_write((uint8_t *)"hello\n\r", 7);
  10.     while(1)
  11.     {
  12.         calendar_get_date(&calendar_info);
  13.         
  14.         if(calendar_info.second != second)
  15.         {
  16.             sprintf((char *)tmp, "%2d-%2d-%2d %2d:%2d:%2d %2d\n\r",
  17. calendar_info.year, calendar_info.month, calendar_info.day, calendar_info.hour, calendar_info.min, calendar_info.second, calendar_info.week);
  18.             uart1_write(tmp, strlen((char *)tmp));
  19.             second = calendar_info.second;
  20.         }
  21.     }
复制代码

测试结果:

大概1s中相差110ms左右

本文来自论坛,点击查看完整帖子内容。

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章