问答

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

21ic问答首页 - GD32H757ZMT6 RTC 问题

RTC 电池 电源 mt GD32H757 运行

GD32H757ZMT6 RTC 问题

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

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


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

回答 +关注 1
931人浏览 13人回答问题 分享 举报
13 个回答
  • 已确认PDR_ON引脚(第143脚)已经使用10K电阻上拉到VDD3.3V
  • PDR_ON 必须上拉到 VDD;如果拉 GND:
    • 内部 POR/PDR/BOR 全关
    • VBAT 功能直接禁用,掉电后备份域直接掉电,晶振必停

    检查:PDR_ON 是否 接 3.3V,不是 GND,不是悬空。
  • EEWORD那个程序尝试移植了一下,问题依旧,上电晶振起振,断电停振。
    至于上面提到的RTC_WPK位,在官方函数rtc_init(&rtc_initpara)中有调用,我们应当不用关心
    uint8_t rtc_set_time(uint8_t year, uint8_t month, uint8_t date,uint8_t hour, uint8_t min, uint8_t sec, uint8_t week)
    {
        ErrStatus error_status = ERROR;

        rtc_initpara.year        = rtc_dec2bcd(year);      
        rtc_initpara.month       = rtc_dec2bcd(month);      
        rtc_initpara.date        = rtc_dec2bcd(date);      
        rtc_initpara.day_of_week = (week & 0X07);
      
        rtc_initpara.hour   = rtc_dec2bcd(hour);      
        rtc_initpara.minute = rtc_dec2bcd(min);      
        rtc_initpara.second = rtc_dec2bcd(sec);      
       // rtc_initpara.am_pm  = ((uint32_t)ampm & 0X01);
       
        error_status = rtc_init(&rtc_initpara);   /* 根据参数初始化RTC寄存器 */
       
        if (ERROR == error_status)
        {
         printf("\n\r** RTC time configuration failed! **\n\r");
         return 1;
        }
        else
        {
         printf("\n\r** RTC time configuration success! **\n\r");
         rtc_show_time();
         RTC_BKP0 = RTC_BKP_DATA;
        return 0;  
        }
    }


    /*!
        \brief      initialize RTC registers
        \param[in]  rtc_initpara_struct: pointer to a rtc_parameter_struct structure which contains
                    parameters for initialization of the RTC peripheral
                    members of the structure and the member values are shown as below:
                      year: 0x0 - 0x99(BCD format)
                      month: RTC_JAN, RTC_FEB, RTC_MAR, RTC_APR, RTC_MAY, RTC_JUN,
                                 RTC_JUL, RTC_AUG, RTC_SEP, RTC_OCT, RTC_NOV, RTC_DEC
                      date: 0x1 - 0x31(BCD format)
                      day_of_week: RTC_MONDAY, RTC_TUESDAY, RTC_WEDNESDAY, RTC_THURSDAY
                                       RTC_FRIDAY, RTC_SATURDAY, RTC_SUNDAY
                      hour: 0x0 - 0x12(BCD format) or 0x0 - 0x23(BCD format) depending on the RTC display_format chose
                      minute: 0x0 - 0x59(BCD format)
                      second: 0x0 - 0x59(BCD format)
                      factor_asyn: 0x0 - 0x7F
                      factor_syn: 0x0 - 0x7FFF
                      am_pm: RTC_AM, RTC_PM
                      display_format: RTC_24HOUR, RTC_12HOUR
        \param[out] none
        \retval     ErrStatus: ERROR or SUCCESS
    */
    ErrStatus rtc_init(rtc_parameter_struct *rtc_initpara_struct)
    {
        ErrStatus error_status = ERROR;
        uint32_t reg_time = 0U, reg_date = 0U;

        reg_date = (DATE_YR(rtc_initpara_struct->year) | \
                    DATE_DOW(rtc_initpara_struct->day_of_week) | \
                    DATE_MON(rtc_initpara_struct->month) | \
                    DATE_DAY(rtc_initpara_struct->date));

        reg_time = (rtc_initpara_struct->am_pm | \
                    TIME_HR(rtc_initpara_struct->hour)  | \
                    TIME_MN(rtc_initpara_struct->minute) | \
                    TIME_SC(rtc_initpara_struct->second));

        /* 1st: disable the write protection */
        RTC_WPK = RTC_UNLOCK_KEY1;
        RTC_WPK = RTC_UNLOCK_KEY2;

        /* 2nd: enter init mode */
        error_status = rtc_init_mode_enter();

        if(ERROR != error_status) {
            RTC_PSC = (uint32_t)(PSC_FACTOR_A(rtc_initpara_struct->factor_asyn) | \
                                 PSC_FACTOR_S(rtc_initpara_struct->factor_syn));

            RTC_TIME = (uint32_t)reg_time;
            RTC_DATE = (uint32_t)reg_date;

            RTC_CTL &= (uint32_t)(~RTC_CTL_CS);
            RTC_CTL |=  rtc_initpara_struct->display_format;

            /* 3rd: exit init mode */
            rtc_init_mode_exit();

            /* 4th: wait the RSYNF flag to set */
            error_status = rtc_register_sync_wait();
        }

        /* 5th: enable the write protection */
        RTC_WPK = RTC_LOCK_KEY;

        return error_status;
    }
    dffzh 2026-5-25 09:36 回复TA
    好的呢 
  • 本帖最后由 dffzh 于 2026-5-22 15:10 编辑
    mackyming 发表于 2026-5-22 13:03
    上面代码贴出来了,这个库函数就是操作的上面的寄存器
    void pmu_backup_voltage_stabilizer_enable(void)

    这个没配置会有影响吗?你看看:

    1.png
    2.png

    然后下面这个帖子资料,你对照看下是否有帮助?
    https://bbs.**/thread-1286337-1-1.html

    1.png
  • 本帖最后由 mackyming 于 2026-5-22 13:08 编辑
    dffzh 发表于 2026-5-22 09:40
    感觉还是VDD掉电后,VBAT没有进入正常供电,你有读过这几个标志位看看是多少吗?
    另外,VDD掉电后,RTC的时 ...

    上面代码贴出来了,这个库函数就是操作的上面的寄存器
    void pmu_backup_voltage_stabilizer_enable(void)
    {
        PMU_CTL1 |= PMU_CTL1_BKPVSEN;
        while(RESET == (PMU_CTL1 & PMU_CTL1_BKPVSRF)) {
        }
    }

    初始化过程按下面的顺序也试过了
        pmu_deinit();
      
        rcu_periph_clock_enable(RCU_PMU);                   /* 使能电源接口时钟 */

        rcu_periph_clock_enable(RCU_BKPSRAM);

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

        pmu_backup_voltage_stabilizer_enable();

        pmu_lvd_select(PMU_LVDT_6) ;

        pmu_lvd_enable();

        pmu_cvd_enable();

        pmu_usb_voltage_detector_enable();

        pmu_vbat_temp_moniter_disable();

        pmu_vbat_charging_disable();

    VBATHF/VBATLF没关注,后面我看一下
    dffzh 2026-5-22 13:33 回复TA
    好的 
  • 感觉还是VDD掉电后,VBAT没有进入正常供电,你有读过这几个标志位看看是多少吗?
    另外,VDD掉电后,RTC的时钟源只能是外部低速晶振32.768KHZ,但没有正常起振,是不是也说明VBAT供电异常?


    1.png

    2.png
    3.png

  • dffzh 发表于 2026-5-21 10:09
    按照下面方法排查一下:
    1、硬件上,用两个示波器探头同时抓取一下在外部电源断电时,VDD引脚和VBAT引脚的 ...

    1 用示波器测试过VBAT脚在VDD掉电时的波形,没有明显跌落,保持在3V左右
    2 程序中有串口打印BKP寄存器保存的标志位数据printf("\r\n BKPFLAG1:%x %d!!\r\n",bkpflag,RTCSRC_FLAG);,重新上电寄存器标志位数据没有丢失
    3 已经在这个问题上耗费几天时间了,示波器能查看的外部条件都看过了,晶振玻璃封装的换金属封装的,更换负载匹配电容,尝试PMU的各种配置,没有结果。
    dffzh 2026-5-22 08:57 回复TA
    我今天有空帮你看下。 
  • 怎么样解决了吗,解决办法分享一下
  • 按照下面方法排查一下:
    1、硬件上,用两个示波器探头同时抓取一下在外部电源断电时,VDD引脚和VBAT引脚的波形,看看VBAT供电是否正常?
    2、软件上,在重新上电后通过仿真查看一下备份域的相关寄存器或者标志位的值,比如RTC_BKP0等寄存器,来看下相关情况。
    遇到问题的时候,要通过使用工具等方式来排查和消除你的疑问,空想没有用。
12下一页

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