GD32F103 RTC

[复制链接]
58|0
 楼主 | 2019-7-11 14:10 | 显示全部楼层 |阅读模式
一、GD的RTC:只有GD32F405、GD32F407和GD32F450带完整的时间和日历功能,而其他系列只带时间功能,即其他系列只能读取并转换时分秒,而不能读取并转换年月日;


二、GD32f103时分秒仅支持BCD码格式;


三、RTC配置程序
  1. void rtc_config(void)
  2. {
  3.             /* 使能 PMU 和 BKPI 时钟 */
  4.     rcu_periph_clock_enable(RCU_BKPI);
  5.     rcu_periph_clock_enable(RCU_PMU);
  6.     /* 允许后备存储管理 */
  7.     pmu_backup_write_enable();

  8.    
  9.     bkp_deinit();

  10.     /* 使能外部低速时钟 */
  11.     rcu_osci_on(RCU_LXTAL);
  12.     /* 等待外部低速时钟稳定 */
  13.     rcu_osci_stab_wait(RCU_LXTAL);
  14.    
  15.     /* 选取外部低速时钟为RTC时钟源 */
  16.     rcu_rtc_clock_config(RCU_RTCSRC_LXTAL);

  17.     /* 使能RTC时钟 */
  18.     rcu_periph_clock_enable(RCU_RTC);

  19.    
  20.     rtc_register_sync_wait();

  21.    
  22.     rtc_lwoff_wait();

  23.     /* 使能秒中断和闹铃中断*/
  24.     rtc_interrupt_enable(RTC_INT_SECOND);
  25.     rtc_interrupt_enable(RTC_INT_ALARM);
  26.         nvic_irq_enable(RTC_IRQn,2,1);
  27.    
  28.     rtc_lwoff_wait();

  29.     /* 设置时钟分频1Hz */
  30.     rtc_prescaler_set(32767);

  31.    
  32.     rtc_lwoff_wait();
  33.                
  34. }
复制代码


四、设置RTC计数寄存器的值
  1. u32 time_regulate(u32 h,u32 m,u32 s)
  2. {
  3.     u32 tmp_hh = 0xFF, tmp_mm = 0xFF, tmp_ss = 0xFF;   
  4.     tmp_hh = h;   
  5.     tmp_mm = m;
  6.     tmp_ss = s;


  7.     /* 返回存储在RTC计数寄存器上的值 */
  8.     return((tmp_hh*3600 + tmp_mm*60 + tmp_ss));
  9. }
复制代码


五、设置时间
  1. void time_adjust(u32 h,u32 m,u32 s)
  2. {
  3.    
  4.     rtc_lwoff_wait();
  5.     /* 改变当前时间 */
  6.     rtc_counter_set(time_regulate(h,m,s));
  7.    
  8.     rtc_lwoff_wait();
  9. }
复制代码


六、显示时间
  1. void time_display(void)
  2. {
  3.     uint32_t thh = 0, tmm = 0, tss = 0,timevar=rtc_counter_get();

  4.     /* 计算小时 */
  5.     thh = timevar / 3600;
  6.     /* 计算分钟 */
  7.     tmm = (timevar % 3600) / 60;
  8.     /* 计算秒 */
  9.     tss = (timevar % 3600) % 60;

  10.     printf(" 时间: %0.2d:%0.2d:%0.2d\r\n", thh, tmm, tss);
  11. }
复制代码
七、主函数
  1. #include "bitband.h"
  2. #include "delay.h"
  3. #include "usart.h"
  4. #include "led.h"

  5. #include "rtc.h"



  6. int main(void)
  7. {
  8.        
  9.         u16 i=0;
  10.        
  11.         delay_init(96);
  12.         nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2);
  13.         usart0_init(115200);
  14.        
  15.         led_config();
  16.        
  17.         printf( "\r\n This is a RTC demo...... \r\n" );

  18.     if (bkp_data_read(BKP_DATA_0) != 0x5a5a){
  19.         
  20.         printf("\r\nThis is a RTC demo!\r\n");
  21.         printf("\r\n\n RTC not yet configured....");

  22.         
  23.         rtc_config();

  24.         printf("\r\n RTC configured....");

  25.         
  26.         time_adjust(11,49,00);

  27.         bkp_data_write(BKP_DATA_0, 0x5a5a);
  28.     }else{
  29.         
  30.         if (rcu_flag_get(RCU_FLAG_PORRST) != RESET){
  31.             printf("\r\n\n Power On Reset occurred....");
  32.         }else if (rcu_flag_get(RCU_FLAG_SWRST) != RESET){
  33.             
  34.             printf("\r\n\n External Reset occurred....");
  35.         }
  36.         
  37.         
  38.         rcu_periph_clock_enable(RCU_PMU);
  39.         pmu_backup_write_enable();
  40.         
  41.         printf("\r\n No need to configure RTC....");
  42.         
  43.         rtc_register_sync_wait();

  44.         
  45.         rtc_interrupt_enable(RTC_INT_SECOND);

  46.         
  47.         rtc_lwoff_wait();
  48.     }

  49. #ifdef RTCCLOCKOUTPUT_ENABLE
  50.    
  51.     rcu_periph_clock_enable(RCU_BKPI);
  52.     rcu_periph_clock_enable(RCU_PMU);
  53.    
  54.     pmu_backup_write_enable();

  55.    
  56.     bkp_tamper_detection_disable();

  57.    
  58.     bkp_rtc_calibration_output_enable();
  59. #endif

  60.    
  61.     rcu_all_reset_flag_clear();

  62.    
  63.    

  64.         while(1)
  65.         {
  66.                 i++;
  67.                 if(i%50==0)
  68.                 {
  69.                         led1=!led1;       
  70.                         time_display();
  71.                 }
  72.                 delay_nms(20);
  73.         }
  74. }
复制代码
八、结果
410545d26d2bed3b88.png

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

在线客服 快速回复 返回顶部 返回列表