查看: 3442|回复: 0

基于GD32F450的RTC时钟

[复制链接]
  • TA的每日心情
    奋斗
    2023-5-10 20:09
  • 签到天数: 1742 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    发表于 2017-5-2 09:10:40 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 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. }
    复制代码
    图片15.png

    要得到图示的计时效果,主函数的代码如下:
    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. }
    复制代码
    回复

    使用道具 举报

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

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-5-20 07:49 , Processed in 0.121231 second(s), 16 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.