21ic问答首页 - GD32H757ZMT6 RTC 问题
GD32H757ZMT6 RTC 问题
GD32H757ZMT6采用外部供电的情况下,RTC运行正常,外部32.768KHz晶振测量波形正常,也可以配置时间。在有后备电池,电池电压3.0V情况下,断开外部电源,32.768KHz晶振停止震荡,重新上电时间丢失。
现在怀疑是外部电源掉电芯片没能正常切换RTC电源到VBAT,
如果在有后备电池的情况下RTC不能掉电正常运行,RTC就没有用了。GD的技术支持能否答疑一下
现在怀疑是外部电源掉电芯片没能正常切换RTC电源到VBAT,
如果在有后备电池的情况下RTC不能掉电正常运行,RTC就没有用了。GD的技术支持能否答疑一下

问答
赞0
评论
2026-05-27
赞0
检查:PDR_ON 是否 接 3.3V,不是 GND,不是悬空。
评论
2026-05-26
赞0
至于上面提到的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;
}
评论
2026-05-22
好的呢
赞0
这个没配置会有影响吗?你看看:
然后下面这个帖子资料,你对照看下是否有帮助?
https://bbs.**/thread-1286337-1-1.html
评论
2026-05-22
赞0
上面代码贴出来了,这个库函数就是操作的上面的寄存器
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没关注,后面我看一下
评论
2026-05-22
好的
赞0
另外,VDD掉电后,RTC的时钟源只能是外部低速晶振32.768KHZ,但没有正常起振,是不是也说明VBAT供电异常?
评论
2026-05-22
赞0
1 用示波器测试过VBAT脚在VDD掉电时的波形,没有明显跌落,保持在3V左右
2 程序中有串口打印BKP寄存器保存的标志位数据printf("\r\n BKPFLAG1:%x %d!!\r\n",bkpflag,RTCSRC_FLAG);,重新上电寄存器标志位数据没有丢失
3 已经在这个问题上耗费几天时间了,示波器能查看的外部条件都看过了,晶振玻璃封装的换金属封装的,更换负载匹配电容,尝试PMU的各种配置,没有结果。
评论
2026-05-21
我今天有空帮你看下。
赞0
评论
2026-05-21
赞0
1、硬件上,用两个示波器探头同时抓取一下在外部电源断电时,VDD引脚和VBAT引脚的波形,看看VBAT供电是否正常?
2、软件上,在重新上电后通过仿真查看一下备份域的相关寄存器或者标志位的值,比如RTC_BKP0等寄存器,来看下相关情况。
遇到问题的时候,要通过使用工具等方式来排查和消除你的疑问,空想没有用。
评论
2026-05-21
您需要登录后才可以回复 登录 | 注册