【求助】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);
}
是不是pmu_backup_write_enable()得往前挪一下,放在rcu_periph_clock_enable(RCU_BKP)后面。 例程都不行 要找FAE看看 检查电源和复位 在初始化过程中,检查是否有任何步骤失败或返回错误代码。 更新固件和驱动库 硬件复位试试 如果复位信号不稳定或持续时间不够长,可能会导致RTC模块无法正确初始化。 RTC时钟源配置是否正确 如果使用LSE检查晶振是否连接正确,以及是否有足够的起振时间,如果使用LSI,请确保它已被正确启用。 RTC寄存器配置可能不对 硬件故障 发现同样问题,版本GD32L23x_Firmware_Library_V2.0.2。 手动调整日历,无法更新日历,修改RTC_INITM_TIMEOUT也无法解决。 可以看看这篇帖子:GD32F4系列 RTC使用外部低速晶振配置时钟问题
https://bbs.21ic.com/icview-3197106-1-1.html?fromuser=%E9%99%88%E5%90%89Ch
(出处: 21ic电子技术开**坛)
页:
[1]