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-20
赞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);
这个部分看到过了,实际上已经添加了上述配置,还是没有用 ,外部电源供电断开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
赞0
帮你扒了扒手册 找到些线索,理论上不会有问题的,GD的技术大概率是不会回复你的
评论
2026-05-20
您需要登录后才可以回复 登录 | 注册