GD32F407单片机开发入门(十七)内部RTC实时时钟及实战含源码 ...

打印 上一主题 下一主题

主题 1784|帖子 1784|积分 5352

一.概要

RTC(Real-Time Clock)是一种用于追踪和记录现实时间的时钟体系。RTC模块提供了一个包罗日期(年/月/日)和时间(时/分/秒/亚秒)的日历功能。除亚秒用二进制码体现外,时间和日期都以BCD码的情势体现。RTC可以进行夏令时赔偿。RTC可以工作在省电模式下,并通过软件设置来智能唤醒。RTC支持外接更高精度的低频时钟,用以达到更高的日历精度。
本文先容了GD32 RTC实时时钟的基本概念,内部结构,以及用内部RTC进行时间计时的例程。
二.RTC基本特点

1.通过软件设置来实现夏令时赔偿
2.参考时钟检测功能:通过外接更高精度的低频率时钟源(50Hz或60Hz)来进步日历精度
3.数字校准功能:通过调整最小时间单位(最大可调精度0.95ppm)来进行日历校准
4.通过移位功能进行亚秒级调整
5.记录事件时间的时间戳功能
6.两个模式可设置的独立的侵入检测
7.可编程的日历和两个位域可屏蔽的闹钟
8.可屏蔽的中断源: 闹钟0和闹钟1,时间戳检测,侵入检测,自动唤醒事件
9.20个32位(共80字节)通用备份寄存器,可以或许在省电模式下保存数据。当有外部事件侵入时,备份寄存器将会复位
三.GD32单片机RTC内部结构图

RTC内部结构图如下

RTC单位有三个可选的独立时钟源:LXTAL、IRC32K和HXTAL的2-31(由RCU_CFG寄存器设置)分频后的时钟。
ck_spre用于为日历寄存器提供时钟,每个时钟增长一秒。
异步预分频器(Asynchronous Prescaler):将输入时钟分频为中间频率(如从32.768 kHz分频至1 kHz)。异步分频器紧张用来低落功率斲丧。
同步预分频器(Synchronous Prescaler):进一步分频中间频率至1 Hz信号,驱动计数器。
可编程闹钟:通过比力器匹配计数器值,触发中断或唤醒事件。
四.设置一个RTC走秒例程

STLINK接GD32F407VET6开发板,STLINK接电脑USB口。

紧张代码
  1. #define RTC_CLOCK_SOURCE_LXTAL //配置时钟源为外部32.768K晶振
  2. /*!
  3.     \brief    get current time and date
  4.     \param[in]  none
  5.     \param[out] rtc_initpara_struct: pointer to a rtc_parameter_struct structure which contains
  6.                 parameters for initialization of the rtc peripheral
  7.                 members of the structure and the member values are shown as below:
  8.                   year: 0x0 - 0x99(BCD format)
  9.                   month: RTC_JAN, RTC_FEB, RTC_MAR, RTC_APR, RTC_MAY, RTC_JUN,
  10.                              RTC_JUL, RTC_AUG, RTC_SEP, RTC_OCT, RTC_NOV, RTC_DEC
  11.                   date: 0x1 - 0x31(BCD format)
  12.                   day_of_week: RTC_MONDAY, RTC_TUESDAY, RTC_WEDSDAY, RTC_THURSDAY
  13.                                    RTC_FRIDAY, RTC_SATURDAY, RTC_SUNDAY
  14.                   hour: 0x0 - 0x12(BCD format) or 0x0 - 0x23(BCD format) depending on the rtc_display_format chose
  15.                   minute: 0x0 - 0x59(BCD format)
  16.                   second: 0x0 - 0x59(BCD format)
  17.                   factor_asyn: 0x0 - 0x7F
  18.                   factor_syn: 0x0 - 0x7FFF
  19.                   am_pm: RTC_AM, RTC_PM
  20.                   display_format: RTC_24HOUR, RTC_12HOUR
  21.     \retval     none
  22. */
  23. void rtc_current_time_get(rtc_parameter_struct* rtc_initpara_struct)
  24. {
  25.     uint32_t temp_tr = 0U, temp_dr = 0U, temp_pscr = 0U, temp_ctlr = 0U;
  26.     temp_tr = (uint32_t)RTC_TIME;   
  27.     temp_dr = (uint32_t)RTC_DATE;
  28.     temp_pscr = (uint32_t)RTC_PSC;
  29.     temp_ctlr = (uint32_t)RTC_CTL;
  30.   
  31.     /* get current time and construct rtc_parameter_struct structure */
  32.     rtc_initpara_struct->year = (uint8_t)GET_DATE_YR(temp_dr);
  33.     rtc_initpara_struct->month = (uint8_t)GET_DATE_MON(temp_dr);
  34.     rtc_initpara_struct->date = (uint8_t)GET_DATE_DAY(temp_dr);
  35.     rtc_initpara_struct->day_of_week = (uint8_t)GET_DATE_DOW(temp_dr);  
  36.     rtc_initpara_struct->hour = (uint8_t)GET_TIME_HR(temp_tr);
  37.     rtc_initpara_struct->minute = (uint8_t)GET_TIME_MN(temp_tr);
  38.     rtc_initpara_struct->second = (uint8_t)GET_TIME_SC(temp_tr);
  39.     rtc_initpara_struct->factor_asyn = (uint16_t)GET_PSC_FACTOR_A(temp_pscr);
  40.     rtc_initpara_struct->factor_syn = (uint16_t)GET_PSC_FACTOR_S(temp_pscr);
  41.     rtc_initpara_struct->am_pm = (uint32_t)(temp_pscr & RTC_TIME_PM);
  42.     rtc_initpara_struct->display_format = (uint32_t)(temp_ctlr & RTC_CTL_CS);
  43. }
  44. void rtc_show_time(void)
  45. {
  46.     rtc_current_time_get(&rtc_initpara);  
  47. }
  48. //初始化时间设置
  49. void rtc_setup(void)
  50. {
  51.     /* setup RTC time value */
  52.     uint32_t tmp_hh = 0xFF, tmp_mm = 0xFF, tmp_ss = 0xFF;
  53.     rtc_initpara.factor_asyn = prescaler_a;
  54.     rtc_initpara.factor_syn = prescaler_s;
  55.     rtc_initpara.year = 0x16;//设置初始化时间:年
  56.     rtc_initpara.day_of_week = RTC_SATURDAY;
  57.     rtc_initpara.month = RTC_APR;//设置初始化时间:月
  58.     rtc_initpara.date = 0x30;//设置初始化时间:日
  59.     rtc_initpara.display_format = RTC_24HOUR;
  60.     rtc_initpara.am_pm = RTC_AM;
  61.         rtc_initpara.hour = 00; //设置初始化时间:时  
  62.         rtc_initpara.minute = 00;//设置初始化时间:分
  63.         rtc_initpara.second = 00;//设置初始化时间:秒
  64.    
  65.     /* RTC current time configuration */
  66.     if(ERROR == rtc_init(&rtc_initpara)){   
  67.     }else{
  68.         rtc_show_time();
  69.         RTC_BKP0 = BKP_VALUE;
  70.     }
  71. }
  72. uint8_t aShowTime[16] = "hh:ms:ss";//定义时分秒
  73. uint8_t aShowDate[16] = "dd-mm-yyyy";//定义年月日
  74. int main(void)
  75. {
  76.          systick_config();//配置系统主频168M,外部8M晶振,配置在#define __SYSTEM_CLOCK_168M_PLL_8M_HXTAL        (uint32_t)(168000000)
  77.          /* enable PMU clock */
  78.          rcu_periph_clock_enable(RCU_PMU);
  79.          /* enable the access of the RTC registers */
  80.          pmu_backup_write_enable();
  81.          rtc_pre_config();//配置RTC
  82.         rtc_setup(); //设置时间2016年4月30日,0点0分0秒
  83.    
  84.     while(1)
  85.                 {
  86.                 delay_1ms(500);//500ms等待
  87.                 rtc_show_time();//读取时间
  88.                 sprintf((char *)aShowTime, "%2x:%2x:%2x", rtc_initpara.hour, rtc_initpara.minute, rtc_initpara.second);
  89.                 sprintf((char *)aShowDate, "%2x-%2x-%2x", rtc_initpara.month, rtc_initpara.date, 0x2000 + rtc_initpara.year);
  90.          }
  91. }
复制代码
实行结果
时分秒变量会走秒,如下图所示,把aShowTime数组放入Memory查看窗口。

五.工程源代码下载

源码下载链接如下:
CSDN
六.小结

RTC 可以为嵌入式体系提供精确的时间基准,用于各种定时任务和事件。RTC 可以用于智能家居装备中的时间控制,如智能门锁、智能照明等。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

饭宝

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表