|
第二步,如何进行配置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个备份寄存器我只使用了一个,当然后续的应用中也会再使用。以下是代码部分- //RTC配置接口函数
- void RtcSetup(void)
- {
- uint32_t tmp_ye = 0xFF, tmp_month = 0xFF, tmp_date = 0xFF;
- uint32_t tmp_hh = 0xFF, tmp_mm = 0xFF, tmp_ss = 0xFF;
- rtc_initpara.rtc_factor_asyn = prescaler_a;
- rtc_initpara.rtc_factor_syn = prescaler_s;
- rtc_initpara.rtc_year = 0x18;
- rtc_initpara.rtc_day_of_week = RTC_SATURDAY;
- rtc_initpara.rtc_month = RTC_AUG;
- rtc_initpara.rtc_date = 0x29;
- rtc_initpara.rtc_display_format = RTC_24HOUR;
- rtc_initpara.rtc_am_pm = RTC_AM;
- printf("=======RTC时间配置========\n\r");
-
- printf(" 请输入年:\n\r");
- while (tmp_ye == 0xFF)
- {
- tmp_ye = usart_input_threshold(99); //小时输入的不能大于99
- rtc_initpara.rtc_year = tmp_ye;
- }
- printf(" %0.2x\n\r", tmp_ye); //显示年
-
- printf(" 请输入月:\n\r");
- while (tmp_month == 0xFF)
- {
- tmp_month = usart_input_threshold(12); //月输入的不能大于12
- rtc_initpara.rtc_month = tmp_month;
- }
- printf(" %0.2x\n\r", tmp_month); //显示月
-
- printf(" 请输入日:\n\r");
-
- while (tmp_date == 0xFF)
- {
- tmp_date = usart_input_threshold(31); //日输入的不能大于31
- rtc_initpara.rtc_date = tmp_date;
- }
- printf(" %0.2x\n\r", tmp_date); //显示日
-
- printf(" 请输入小时:\n\r");
- while (tmp_hh == 0xFF)
- {
- tmp_hh = usart_input_threshold(23); //小时输入的不能大于23
- rtc_initpara.rtc_hour = tmp_hh;
- }
- printf(" %0.2x\n\r", tmp_hh); //显示小时
-
- printf(" 请输入分钟:\n\r");
- while (tmp_mm == 0xFF){
- tmp_mm = usart_input_threshold(59); //分钟输入不能大于59
- rtc_initpara.rtc_minute = tmp_mm;
- }
- printf(" %0.2x\n\r", tmp_mm);
- printf(" 请输入秒:\n\r");
- while (tmp_ss == 0xFF){
- tmp_ss = usart_input_threshold(59); //秒输入不能大于59
- rtc_initpara.rtc_second = tmp_ss;
- }
- printf(" %0.2x\n\r", tmp_ss);
- if(ERROR == rtc_init(&rtc_initpara)) //RTC时钟配置错了
- {
- printf("\n\r** RTC time configuration failed! **\n\r");
- }
- else //正确
- {
- printf("\n\r** RTC time configuration success! **\n\r");
- rtc_show_time();
- RTC_BKP0 = BKP_VALUE;
- }
- rtc_show_time();//显示时间
- }
复制代码
|
|