GigaDevice GD32 MCU
直播中

jinglixixi

8年用户 1550经验值
擅长:嵌入式技术 光电显示 接口/总线/驱动 控制/MCU
私信 关注

【我是电子发烧友】基于GD32F450的RTC时钟

本帖最后由 jinglixixi 于 2017-5-12 10:51 编辑

    在“基于GD32F450开发板的LCD5110屏显示”一帖中为大家介绍了GD32F450开发板配置LCD5110显示屏的用法,在此基础上,充分利用MCU内部的RTC则可实现RTC计时控制等。
    要完成RTC时钟,需要用到这样几个函数,即RTC配置函数rtc_pre_config()、RTC初值设置函数rtc_setup()、RTC显示函数rtc_show_time()、RTC限值显示函数rtc_show_alarm()等。
为与LCD5110显示函数相配合,修改后的相关函数如下:

  1. void rtc_show_time(void)
  2. {
  3.       uint32_t time_subsecond = 0;
  4.       uint8_t subsecond_ss = 0,subsecond_ts = 0,subsecond_hs = 0;
  5.       rtc_current_time_get(&rtc_initpara);  
  6.       /* get the subsecond value of current time, and convert it into fractional format */
  7.       time_subsecond = rtc_subsecond_get();
  8.           LCD_set_XY(32,2);
  9.           LCD_write_char(rtc_initpara.year/16+'0',0);
  10.           LCD_write_char(rtc_initpara.year%16+'0',0);
  11.           LCD_write_char(':',0);
  12.           LCD_write_char(rtc_initpara.month/16+'0',0);
  13.           LCD_write_char(rtc_initpara.month%16+'0',0);
  14.           LCD_write_char(':',0);
  15.           LCD_write_char(rtc_initpara.date/16+'0',0);
  16.           LCD_write_char(rtc_initpara.date%16+'0',0);
  17.           LCD_set_XY(32,4);
  18.           LCD_write_char(rtc_initpara.hour/16+'0',0);
  19.           LCD_write_char(rtc_initpara.hour%16+'0',0);
  20.           LCD_write_char(':',0);
  21.           LCD_write_char(rtc_initpara.minute/16+'0',0);
  22.           LCD_write_char(rtc_initpara.minute%16+'0',0);
  23.           LCD_write_char(':',0);
  24.           LCD_write_char(rtc_initpara.second/16+'0',0);         
  25.       LCD_write_char(rtc_initpara.second%16+'0',0);
  26. }
      在程序中之所以使用/16或%16,是由于GD32F450的RTC是采用的BCD码,而非十进制或十六进制,所以要按半个字节来处理。
限定值的显示函数如下:
  1. void rtc_show_alarm(void)
  2. {
  3.       rtc_alarm_get(RTC_ALARM0,&rtc_alarm);
  4.             LCD_set_XY(32,5);
  5.           LCD_write_char(rtc_alarm.alarm_hour/16+'0',0);
  6.           LCD_write_char(rtc_alarm.alarm_hour%16+'0',0);//(subsecond_hs%10+'0',0);
  7.           LCD_write_char(':',0);
  8.           LCD_write_char(rtc_alarm.alarm_minute/16+'0',0);//(subsecond_ts/10+'0',0);
  9.           LCD_write_char(rtc_alarm.alarm_minute%16+'2',0);
  10.           LCD_write_char(':',0);
  11.           LCD_write_char(rtc_alarm.alarm_second/16+'0',0);//(subsecond_ss/10+'0',0);
  12.           LCD_write_char(rtc_alarm.alarm_second%16+'0',0);
  13. }
    通过该函数的使用,使用者便于进行验证和判别。
图片15.png
    要得到图示的计时效果,则主函数的代码如下:


为了便于时间限值的设置,可利用板上的3个用户键来实现数值的设置,其中以一个键来调整数值,以一个键来移动数值的位置,以一个键来确认设置。此外,为了实现计时控制,可分配一个GPIO引脚与光隔继电器相连接,进而实现电器的控制。
相应的中断处理函数如下:
  1. void RTC_Alarm_IRQHandler(void)
  2. {
  3. if(RESET != rtc_flag_get(RTC_STAT_ALRM0F))
  4. {
  5.         rtc_flag_clear(RTC_STAT_ALRM0F);
  6.         exti_flag_clear(EXTI_17);
  7.         GPIO_BOP(GPIOD) = GPIO_PIN_7;    //改用其他引脚与继电器配合来控制相应得电器
  8.     }
  9. }



回帖(9)

jf_ed1027433

2017-5-2 13:39:08
只要前面带有前缀【我是电子发烧友】就可以参加活动了,所以技术贴可以发到相对应的技术板块,我在后台都是可以看到的。
举报

jinglixixi

2017-5-3 18:15:11
引用: ElecFans王岑 发表于 2017-5-2 13:39
只要前面带有前缀【我是电子发烧友】就可以参加活动了,所以技术贴可以发到相对应的技术板块,我在后台都是可以看到的。

感谢,知道了!
举报

jinglixixi

2017-5-4 09:24:04
主函数那部分,格式出现问题,重编辑后也没解决,只好将其附在此处了!

int main(void)
{
          uint8_t i=0;
//  u16 color=0;
    systick_config();
       
         SPI_CONFIG();
         LCD_init();
         LCD_write_english_string(0,0,"GD32 Colibri-",0);
         LCD_write_english_string(0,1," - F450VE",0);
         LCD_write_english_string(0,3,"ARM Cortex-M4",0);
         LCD_write_english_string(0,5,"  2017.4.20",0);
       
   delay_1ms(1000);
         LCD_clear();
         LCD_write_english_string(0,0,"  RTC  Clock",0);
         LCD_write_english_string(0,2,"DATE: ",0);
         LCD_write_english_string(0,4,"TIME:",0);
         //LCD_set_XY(36,0);
         //LCD_write_char(Set_V[0]/10+'0',0);
   led_init();

        /* enable PMU clock */
    rcu_periph_clock_enable(RCU_PMU);
    /* enable the access of the RTC registers */
    pmu_backup_write_enable();
    rtc_pre_config();

    if (BKP_VALUE != RTC_BKP0){   
        rtc_setup();
                }else{
                       
                        if (RESET != rcu_flag_get(RCU_FLAG_PORRST))
                                {
       //    Gui_DrawFont_GBK16(30, 40, RED, GRAY0,"power on");
        }else if (RESET != rcu_flag_get(RCU_FLAG_EPRST)){
           // printf("external reset occurred....nr");
        }
       // printf("no need to configure RTC....nr");
                               
        rtc_flag_clear(RTC_STAT_ALRM0F);
        exti_flag_clear(EXTI_17);

        rtc_show_time();
        rtc_show_alarm();
    }
               
    rcu_all_reset_flag_clear();
                /* RTC alarm interrupt configuration */
    exti_init(EXTI_17,EXTI_INTERRUPT,EXTI_TRIG_RISING);
    nvic_irq_enable(RTC_Alarm_IRQn,0,0);

  while(1)
  {     
                GPIO_TG(GPIOB) = GPIO_PIN_3;
                delay_1ms(500);
                i++;
                if(i==10) i=0;
                rtc_show_time();
   }

}
举报

lee_st

2017-5-4 09:50:29
进来看看国产的了,
举报

更多回帖

发帖
×
20
完善资料,
赚取积分