12695|9

1366

帖子

6

TA的资源

版主

楼主
 

GD32F350--体验之三(RTC) [复制链接]

本帖最后由 RCSN 于 2018-8-29 23:50 编辑

     由于本次比赛的项目需要用到RTC。故套鼓下这个外设,GD32的RTC很好用,库函数方面用起来也比较方便。记录下这个RTC,方便之后的坛友不掉坑。
  使用RTC,部分代码也是参考官方的代码,借助参考手册,更能加深对此外设的了解。
  第一步,如何初始化RTC
  ①RTC需要一直上电维持时间走时,故需要电源管理单元,也就是当电源VDD关闭的时候,可以由电源切换器将电池备份域的电源切换到Vbat引脚,这里也就是纽扣电池引脚输入。以下是官方说明

     如何使用起来这个电池备份域,那就需要使能电源管理单元时钟,以及使能此备份域写使能,关于为什么要使能此备份域写使能,下面会讲解其应用。

    使能以上操作之后,我们再来看RTC部分,RTC需要时钟源维持,在GD32F350里面,有三种独立的时钟源可选择,内部晶振40K、外部高速晶振32分频后的时钟以及为外部低速晶振。板子上并没有外部等晶振,这里我们还是使用内部晶振40K,也就是IRC40K。
  之后需要判断此选择的时钟源是否就绪完毕,若就绪完毕则将其配置给RTC为时钟源,再配置其一些需要的预分频系数,再使能RTC外设时钟,等待时钟就绪完毕即可完成RTC的初始化工作
。若前面的时钟源没就绪完毕则返回错误。这里我写的初始化函数返回有参数,若初始化成功返回SUCCESS,错误返回ERROR。可以在初始化的时候做些判断,比如打印log通知用户。以下是代码截图





此帖出自GD32 MCU论坛

最新回复

请问可以发一份你的源码吗 我想学习一下   详情 回复 发表于 2020-2-16 21:59
点赞 关注(1)
个人签名

1084534438 欢迎交流  [加油,一切皆有可能]

 

回复
举报

13

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
PDF 有链接吗?
感谢
此帖出自GD32 MCU论坛

点评

所有资料官方网站都有,去官网下把。资料其实很多。我上传附件。  详情 回复 发表于 2018-8-30 00:13
 
 
 

回复

1366

帖子

6

TA的资源

版主

板凳
 
第二步,如何进行配置RTC的日期和时间。 在配置之前先了解下GD32F350的RTC模块,官方的简介如下:


其优势在于提供了亚秒的功能,但需要注意的是,除了亚秒是二进制的,其他的时间和日期都是BCD码形式,不管读写都要以此形式来读写,所以在使用的时候,需要做下适当的转换。

提供了三种中断源,丰富了一些应用需求,比如闹钟的使用,这些官方都有相对于的例子可以参考。更重要的是在于有5个32位的通用备份寄存器,一共20个字节。这样可以在一些需求的应用上保存数据,比如我第一次配置了RTC,写入个标志到其中的一个备份寄存器,那么复位的时候,上电初始化判断下其备份寄存器的值就可以避免再次配置寄存器。
在初始化的时候配置,断电重新上电的需要上位机下发配置指令的时候,都需要往相对应的寄存器去进行操作,比如时间寄存器等,但是由于寄存器稍微是有点多,进行寄存器操作对于不熟悉的确是有点麻烦,官方也在此提供了简单的函数接口对其封装,只需要执行一些封装好的结构体进行赋值,然后传参即可完成操作。在读取时间上,也做了相关的封装接口,函数原型位void rtc_current_time_get(rtc_parameter_struct* rtc_initpara_struct)。

    而此结构体也就是rtc_parameter_struct,函数接口即是ErrStatus rtc_init(rtc_parameter_struct* rtc_initpara_struct)。
   结构体原型如下:注释相对也很清晰,减少了初学者的上手时间。需要注意的是有些是需要传入的是BCD码。
  
那么我在这里是进行配置的时候是使用串口来进行交互。依次输入年月日等信息。之后注册成功的话即在串口显示当前时间,并且把标志位写入备份寄存器0,在这里5个备份寄存器我只使用了一个,当然后续的应用中也会再使用。以下是代码部分
  1. //RTC配置接口函数
  2. void RtcSetup(void)
  3. {
  4.         uint32_t tmp_ye = 0xFF, tmp_month = 0xFF, tmp_date = 0xFF;
  5.     uint32_t tmp_hh = 0xFF, tmp_mm = 0xFF, tmp_ss = 0xFF;       
  6.     rtc_initpara.rtc_factor_asyn = prescaler_a;
  7.     rtc_initpara.rtc_factor_syn = prescaler_s;
  8.     rtc_initpara.rtc_year = 0x18;
  9.     rtc_initpara.rtc_day_of_week = RTC_SATURDAY;
  10.     rtc_initpara.rtc_month = RTC_AUG;
  11.     rtc_initpara.rtc_date = 0x29;
  12.     rtc_initpara.rtc_display_format = RTC_24HOUR;
  13.     rtc_initpara.rtc_am_pm = RTC_AM;

  14.     printf("=======RTC时间配置========\n\r");
  15.        
  16.     printf("  请输入年:\n\r");
  17.     while (tmp_ye == 0xFF)
  18.         {   
  19.         tmp_ye = usart_input_threshold(99); //小时输入的不能大于99
  20.         rtc_initpara.rtc_year = tmp_ye;
  21.     }
  22.     printf("  %0.2x\n\r", tmp_ye); //显示年
  23.        
  24.     printf("  请输入月:\n\r");
  25.     while (tmp_month == 0xFF)
  26.         {   
  27.         tmp_month = usart_input_threshold(12); //月输入的不能大于12
  28.         rtc_initpara.rtc_month = tmp_month;
  29.     }
  30.     printf("  %0.2x\n\r", tmp_month); //显示月
  31.                
  32.     printf("  请输入日:\n\r");
  33.        
  34.     while (tmp_date == 0xFF)
  35.         {   
  36.         tmp_date = usart_input_threshold(31); //日输入的不能大于31
  37.         rtc_initpara.rtc_date = tmp_date;
  38.     }
  39.     printf("  %0.2x\n\r", tmp_date); //显示日
  40.                
  41.     printf("  请输入小时:\n\r");
  42.     while (tmp_hh == 0xFF)
  43.         {   
  44.         tmp_hh = usart_input_threshold(23); //小时输入的不能大于23
  45.         rtc_initpara.rtc_hour = tmp_hh;
  46.     }
  47.     printf("  %0.2x\n\r", tmp_hh); //显示小时
  48.    
  49.     printf("  请输入分钟:\n\r");
  50.     while (tmp_mm == 0xFF){   
  51.         tmp_mm = usart_input_threshold(59); //分钟输入不能大于59
  52.         rtc_initpara.rtc_minute = tmp_mm;
  53.     }
  54.     printf("  %0.2x\n\r", tmp_mm);

  55.     printf("  请输入秒:\n\r");
  56.     while (tmp_ss == 0xFF){
  57.         tmp_ss = usart_input_threshold(59); //秒输入不能大于59
  58.         rtc_initpara.rtc_second = tmp_ss;
  59.     }
  60.     printf("  %0.2x\n\r", tmp_ss);

  61.     if(ERROR == rtc_init(&rtc_initpara)) //RTC时钟配置错了
  62.         {   
  63.         printf("\n\r** RTC time configuration failed! **\n\r");
  64.     }
  65.         else //正确
  66.         {
  67.         printf("\n\r** RTC time configuration success! **\n\r");
  68.         rtc_show_time();
  69.         RTC_BKP0 = BKP_VALUE;
  70.     }
  71.     rtc_show_time();//显示时间
  72. }
复制代码



此帖出自GD32 MCU论坛
 
个人签名

1084534438 欢迎交流  [加油,一切皆有可能]

 
 

回复

1366

帖子

6

TA的资源

版主

4
 
CallMe2Hao 发表于 2018-8-30 00:03
PDF 有链接吗?
感谢

  所有资料官方网站都有,去官网下把。资料其实很多。我上传附件。

GD32F3x0_User_Manual_CN_v1.0.pdf

12.53 MB, 阅读权限: 5, 下载次数: 75

此帖出自GD32 MCU论坛
 
个人签名

1084534438 欢迎交流  [加油,一切皆有可能]

 
 

回复

13

帖子

0

TA的资源

一粒金砂(初级)

5
 
RCSN 发表于 2018-8-30 00:13
所有资料官方网站都有,去官网下把。资料其实很多。我上传附件。

感谢感谢,,
我下载 了个英文版的
看起来 太费劲了
此帖出自GD32 MCU论坛

点评

想玩的开心,就得先找好资料  详情 回复 发表于 2018-8-30 00:21
 
 
 

回复

1366

帖子

6

TA的资源

版主

6
 
  第三步,如何获取当前时间,官方上也提供了同样的接口函数void rtc_current_time_get(rtc_parameter_struct* rtc_initpara_struct)。但是在应用的时候需要主要BCD码和10进制的区别和转换。在这里我比较简单的显示出来。
     main里面我主要实现的是,按下板子一次按键,就在串口显示一次时间。

   在初始化的时候,如果备份寄存器0没被写入标志位则进行配置,否则不需要再配置。这里还可以根据RCU的状态寄存器来判断为何引起复位。以此这个状态可以判断复位的原因。






此帖出自GD32 MCU论坛
 
个人签名

1084534438 欢迎交流  [加油,一切皆有可能]

 
 

回复

1366

帖子

6

TA的资源

版主

7
 
CallMe2Hao 发表于 2018-8-30 00:19
感谢感谢,,
我下载 了个英文版的
看起来 太费劲了

想玩的开心,就得先找好资料
此帖出自GD32 MCU论坛
 
个人签名

1084534438 欢迎交流  [加油,一切皆有可能]

 
 

回复

1366

帖子

6

TA的资源

版主

8
 
那么接下来就是效果了。

此帖出自GD32 MCU论坛
 
个人签名

1084534438 欢迎交流  [加油,一切皆有可能]

 
 

回复

1366

帖子

6

TA的资源

版主

9
 
下一步得外设---串口。发送使用DMA,接收使用接收+空闲中断。另外GD32F350有接收FIFO,可以玩玩。
此帖出自GD32 MCU论坛
 
个人签名

1084534438 欢迎交流  [加油,一切皆有可能]

 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

10
 

请问可以发一份你的源码吗 我想学习一下

此帖出自GD32 MCU论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表