matrixwell 发表于 2024-12-31 13:04

【求助】GD32L233CB RTC初始化失败

芯片型号:GD32L233CBT6,RTC功能测试了几天一直工作正常,今天突然出现无法初始化的问题,rtc设置不了,INITF始终不为1导致超时。使用官方的驱动,GD32L23x_Firmware_Library_V2.0.2,在此处判断INITF时候超时报错。




RTC初始化代码如下,前两天调试一直都正常的,没发现代码里面有什么问题,使用的内部32K时钟。
#define BIN_TO_BCD(x) ((((x) / 10) << 4) + ((x) % 10))
#define BCD_TO_BIN(x) (10 * ((x) >> 4) + ((x) & 0x0F))

#define RTC_IRC32K
//#define RTC_LXTAL

#ifdef RTC_IRC32K
#define PRESCALER_S         0x13F
#define PRESCALER_A         0x63
#endif
#ifdef RTC_LXTAL
#define PRESCALER_S         0xFF
#define PRESCALER_A         0x7F
#endif

struct tm calendar;
uint32_t RTCSRC_FLAG = 0;

void app_rtc_init()
{
        uint32_t RTCSRC_FLAG = 0;
        rcu_periph_clock_enable(RCU_PMU);
    rcu_periph_clock_enable(RCU_BKP);
       
#ifdef RTC_IRC32K
        rcu_osci_on(RCU_IRC32K);
    rcu_osci_stab_wait(RCU_IRC32K);
    rcu_rtc_clock_config(RCU_RTCSRC_IRC32K);
#endif
#ifdef RTC_LXTAL
        rcu_osci_on(RCU_LXTAL);
    rcu_osci_stab_wait(RCU_LXTAL);
    rcu_rtc_clock_config(RCU_RTCSRC_LXTAL);
#endif
    rcu_periph_clock_enable(RCU_RTC);
    rtc_register_sync_wait();
       
       /* detect the reset source */
//        if(RESET != rcu_flag_get(RCU_FLAG_PORRST)) {
//                printf("power on reset occurred....\n\r");
//        } else if(RESET != rcu_flag_get(RCU_FLAG_EPRST)) {
//                printf("external reset occurred....\n\r");
//        }
//        printf("no need to configure RTC....\n\r");
//        rcu_all_reset_flag_clear();

        pmu_backup_write_enable();
        RTCSRC_FLAG = GET_BITS(RCU_BDCTL, 8, 9);
        if(RTCSRC_FLAG == 0x00)
        {
                calendar.tm_year=YEAR_BASE+25;
                calendar.tm_mon=12;
                calendar.tm_mday=30;
                calendar.tm_hour=1;
                calendar.tm_min=0;
                calendar.tm_sec=40;
                rtc_set_time(&calendar);
        }

}

void rtc_set_time(struct tm *time_struct)
{
        rtc_parameter_struct rtc_initpara = {0};
        /* RTC时钟频率 = 32.768kHz / (255 + 1) / (127 + 1) = 1Hz */
    rtc_initpara.factor_asyn = PRESCALER_A;
    rtc_initpara.factor_syn = PRESCALER_S;
    rtc_initpara.display_format = RTC_24HOUR;
        rtc_initpara.year = BIN_TO_BCD(time_struct->tm_year - YEAR_BASE);
        rtc_initpara.month = BIN_TO_BCD(time_struct->tm_mon);
        rtc_initpara.date = BIN_TO_BCD(time_struct->tm_mday);
        rtc_initpara.hour = BIN_TO_BCD(time_struct->tm_hour);
        rtc_initpara.minute = BIN_TO_BCD(time_struct->tm_min);
        rtc_initpara.second = BIN_TO_BCD(time_struct->tm_sec);
        rtc_initpara.day_of_week = time_struct->tm_wday;
        rtc_init(&rtc_initpara);
}

Sam131208 发表于 2025-1-2 08:35

是不是pmu_backup_write_enable()得往前挪一下,放在rcu_periph_clock_enable(RCU_BKP)后面。

xionghaoyun 发表于 2025-1-2 10:08

例程都不行 要找FAE看看

laocuo1142 发表于 2025-1-6 14:00

检查电源和复位

classroom 发表于 2025-1-6 14:07

在初始化过程中,检查是否有任何步骤失败或返回错误代码。

elephant00 发表于 2025-1-6 14:13

更新固件和驱动库

elephant00 发表于 2025-1-6 14:16

硬件复位试试

flycamelaaa 发表于 2025-1-6 15:00

如果复位信号不稳定或持续时间不够长,可能会导致RTC模块无法正确初始化。

powerantone 发表于 2025-1-6 18:00

RTC时钟源配置是否正确

stormwind123 发表于 2025-1-6 19:00

如果使用LSE检查晶振是否连接正确,以及是否有足够的起振时间,如果使用LSI,请确保它已被正确启用。

probedog 发表于 2025-1-6 19:00

RTC寄存器配置可能不对

jcky001 发表于 2025-1-7 14:00

硬件故障

Sam131208 发表于 2025-1-13 11:06

发现同样问题,版本GD32L23x_Firmware_Library_V2.0.2。 手动调整日历,无法更新日历,修改RTC_INITM_TIMEOUT也无法解决。

陈吉Ch 发表于 2025-4-30 10:08

可以看看这篇帖子:GD32F4系列 RTC使用外部低速晶振配置时钟问题
https://bbs.21ic.com/icview-3197106-1-1.html?fromuser=%E9%99%88%E5%90%89Ch
(出处: 21ic电子技术开**坛)
页: [1]
查看完整版本: 【求助】GD32L233CB RTC初始化失败