问答

汇集网友智慧,解决技术难题

21ic问答首页 - GD32H757ZMT6 RTC 问题

RTC 电池 电源 mt GD32H757 运行

GD32H757ZMT6 RTC 问题

mackyming2026-05-19
GD32H757ZMT6采用外部供电的情况下,RTC运行正常,外部32.768KHz晶振测量波形正常,也可以配置时间。在有后备电池,电池电压3.0V情况下,断开外部电源,32.768KHz晶振停止震荡,重新上电时间丢失。

现在怀疑是外部电源掉电芯片没能正常切换RTC电源到VBAT,


如果在有后备电池的情况下RTC不能掉电正常运行,RTC就没有用了。GD的技术支持能否答疑一下

回答 +关注 0
76人浏览 3人回答问题 分享 举报
3 个回答
  • 好问题
  • 这个BKP_only模式需要怎么设置呢?

        rcu_periph_clock_enable(RCU_PMU);                   /* 使能电源接口时钟 */

        rcu_periph_clock_enable(RCU_BKPSRAM);

        pmu_backup_write_enable();                          /* 备份域写使能 */

        //pmu_deinit();

        pmu_lvd_select(PMU_LVDT_6) ;

        pmu_lvd_enable();

        pmu_cvd_enable();

        pmu_vbat_charging_disable();

        pmu_backup_voltage_stabilizer_enable();

      
        bkpflag = RTC_BKP0;                                 /* 读取BKP0的值 */
        rcu_osci_on(RCU_LXTAL);   

      这个部分看到过了,实际上已经添加了上述配置,还是没有用  ,外部电源供电断开32.768KHz晶振就停震了         

    /**
    * @brief       RTC初始化
    * @NOTE
    *              默认尝试使用LSE,当LSE启动失败后,切换为LSI.
    *              通过BKP寄存器0的值,可以判断RTC使用的是LSE/LSI:
    *              当BKP0==0X7050时,使用的是LSE
    *              当BKP0==0X7051时,使用的是LSI
    *              注意:切换LSI/LSE将导致时间/日期丢失,切换后需重新设置.
    *
    * @param       无
    * @retval      0,成功
    *              1,开启时钟失败
    */
    uint8_t rtc_config(void)
    {
        uint16_t prescaler_a = 0;                           /* RTC异步分频值 */
        uint16_t prescaler_s  = 0;                          /* RTC同步分频值 */
        uint16_t bkpflag = 0;
      
        rcu_periph_clock_enable(RCU_PMU);                   /* 使能电源接口时钟 */

        rcu_periph_clock_enable(RCU_BKPSRAM);

        pmu_backup_write_enable();                          /* 备份域写使能 */

        //pmu_deinit();

        pmu_lvd_select(PMU_LVDT_6) ;

        pmu_lvd_enable();

        pmu_cvd_enable();

        pmu_vbat_charging_disable();

        pmu_backup_voltage_stabilizer_enable();

      
        bkpflag = RTC_BKP0;                                 /* 读取BKP0的值 */
        rcu_osci_on(RCU_LXTAL);                             /* 打开外部低速晶振 */
                   
        if ((rcu_osci_stab_wait(RCU_LXTAL) == ERROR))       /* 开启CK_LXTAL失败? */
        {
            rcu_osci_on(RCU_IRC32K);                        /* 打开CK_IRC32K时钟 */     
          
            if ((rcu_osci_stab_wait(RCU_IRC32K) == ERROR))  /* 开启CK_IRC32K失败? */
            {
                printf("\r\n 开启RTC时钟失败!!");
                return 1;                                   /* 开启RTC时钟源失败 */
                
            }
            
            rcu_rtc_clock_config(RCU_RTCSRC_IRC32K);        /* 选择 CK_IRC32K时钟作为RTC的时钟源 */
            prescaler_s = 0x13F;                            /* RTC同步分频值(0~7FFF) */
            prescaler_a = 0x63;                             /* RTC异步分频值(0~0X7F) */
            RTC_BKP0 = 0X7051;                              /* 标记RTC使用LSI */
        }       
        else
        {  
            printf("\r\n 开启外部RTC时钟!!");
            rcu_rtc_clock_config(RCU_RTCSRC_LXTAL);         /* 选择RCU_LXTAL时钟作为RTC的时钟源 */
            prescaler_s = 0xFF;
            prescaler_a = 0x7F;
            RTC_BKP0 = 0XA5;                                /* 标记RTC使用LSE */
        }
       
        rcu_periph_clock_enable(RCU_RTC);                   /* 使能RTC时钟 */
        rtc_register_sync_wait();                           /* 等待同步 */                  
        RTCSRC_FLAG = GET_BITS(RCU_BDCTL, 8, 9);            /* 获取RTC时钟源选择 */
                                    printf("\r\n BKPFLAG1:%x %d!!\r\n",bkpflag,RTCSRC_FLAG);
       
        /* BKP0的内容既不是0X7050,也不是0X7051,说明是第一次配置,或者RTC时钟源没有配置,需要设置时间日期. */
        if(((bkpflag != 0xA5) && (bkpflag != 0x7051)) || (0x00 == RTCSRC_FLAG))   
        {
            printf("\r\n BKPFLAG2:%x %d!!\r\n",bkpflag,RTCSRC_FLAG);
            rtc_initpara.factor_asyn = prescaler_a;         /* 设置RTC异步分频系数 */
            rtc_initpara.factor_syn = prescaler_s;          /* 设置RTC同步分频系数 */
            rtc_initpara.display_format = RTC_24HOUR;       /* RTC时间格式为24小时格式 */
    //        rtc_set_time(23, 59, 50, 0);                    /* 设置时间 */
    //        rtc_set_date(24, 7, 13, 6);                     /* 设置日期 */
       
        }  

        return 0;   
    }


    /**
    * @brief 检查并配置RTC
    * @param tm:用于读取RTC时间的结构体指针
    * @note  无
    * @retval 无
    */
    void RTC_CheckAndConfig(void)
    {
        uint8_t a;
               /*在启动时检查备份寄存器RCU_BDCTL,如果内容不是0xA5,
              则需重新配置时间并询问用户调整时间*/   
        a = RTC_BKP0;
        printf(" RTC_BKP0为:%x\n\r",a);
        a = RTCSRC_FLAG;
        printf(" RTCSRC_FLAG:%x\n\r",a);
    //    if((RTC_BKP_DATA != RTC_BKP0))
    //    if((RTC_BKP_DATA != RTC_BKP0) && (0x01 != RTCSRC_FLAG))
        if((RTC_BKP_DATA != RTC_BKP0) || (0x00 == RTCSRC_FLAG))
            {
            
            printf("\r\n\r\n RTC尚未配置,RTC配置....\n\r");
            RTC_BKP0 = RTC_BKP_DATA;
            }
            else
            {
                    /*检查是否掉电重启*/
            if(RESET != rcu_flag_get(RCU_FLAG_PORRST))
                    {
                        printf("\r\n\r\n 上电复位....\n\r");
                    }
                    /*检查是否Reset复位*/
                    else if(RESET != rcu_flag_get(RCU_FLAG_EPRST))
                    {
                            printf("\r\n\r\n 外部复位....\n\r");
                    }
           
                    printf("\r\n 不需要配置RTC....\n\r");
            }

        /* 清除复位标志 flags */
        rcu_all_reset_flag_clear();
       
        /* RTC tamper 中断配置 */
    //    exti_flag_clear(EXTI_18);
    //    exti_init(EXTI_18, EXTI_INTERRUPT, EXTI_TRIG_RISING);
    //    nvic_irq_enable(DEBUG_RTC_IRQ, 0U, 0U);
        pmu_backup_write_disable();
    }
  • 2026-05-20_095710.jpg

    帮你扒了扒手册 找到些线索,理论上不会有问题的,GD的技术大概率是不会回复你的

您需要登录后才可以回复 登录 | 注册