与非网论坛

标题: 基于GD32F450的RTC时钟 [打印本页]

作者: jinglixixi    时间: 2017-5-2 09:10
标题: 基于GD32F450的RTC时钟
本帖最后由 jinglixixi 于 2017-5-2 09:12 编辑

    为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. }
复制代码
  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. }
复制代码
(, 下载次数: 34)

要得到图示的计时效果,主函数的代码如下:
  1. int main(void)
  2. {
  3.          uint8_t i=0;
  4.      systick_config();
  5.          SPI_CONFIG();
  6.          LCD_init();
  7.          LCD_write_english_string(0,0,"GD32 Colibri-",0);
  8.          LCD_write_english_string(0,1," - F450VE",0);
  9.          LCD_write_english_string(0,3,"ARM Cortex-M4",0);
  10.          LCD_write_english_string(0,5,"  2017.4.20",0);
  11.      delay_1ms(1000);
  12.          LCD_clear();
  13.          LCD_write_english_string(0,0,"  RTC  Clock",0);
  14.          LCD_write_english_string(0,2,"DATE: ",0);
  15.          LCD_write_english_string(0,4,"TIME:",0);
  16.      led_init();
  17.          /* enable PMU clock */
  18.      rcu_periph_clock_enable(RCU_PMU);
  19.      /* enable the access of the RTC registers */
  20.      pmu_backup_write_enable();
  21.      rtc_pre_config();
  22.      if (BKP_VALUE != RTC_BKP0)
  23. {   
  24.         rtc_setup();
  25.          }
  26.      else
  27.      {
  28.         rtc_flag_clear(RTC_STAT_ALRM0F);
  29.         exti_flag_clear(EXTI_17);
  30.         rtc_show_time();
  31.         rtc_show_alarm();
  32.     }
  33.     rcu_all_reset_flag_clear();
  34.         /* RTC alarm interrupt configuration */
  35.     exti_init(EXTI_17,EXTI_INTERRUPT,EXTI_TRIG_RISING);
  36.     nvic_irq_enable(RTC_Alarm_IRQn,0,0);
  37.     while(1)
  38.     {     
  39.                 GPIO_TG(GPIOB) = GPIO_PIN_3;  //  产生秒闪烁效果
  40.                 delay_1ms(500);
  41.                 i++;
  42.                 if(i==10) i=0;
  43.                 rtc_show_time();
  44.     }
  45. }
复制代码
为了便于时间限值的设置,可利用板上的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. }
复制代码





欢迎光临 与非网论坛 (https://www.eefocus.com/forum/) Powered by Discuz! X3.5