GD32F4系列 RTC使用外部低速晶振配置时钟问题

[复制链接]
 楼主| 紫气东升 发表于 2022-2-9 15:46 | 显示全部楼层 |阅读模式
参照官方例程配置RTC时钟如下,使用外部32.768KHZ晶振,在自己的板子上仿真发现,程序在rtc_register_sync_wait();时钟同步这一步出现问题,无法同步。导致后面设置RTC时间失败。但是我将程序烧录到demo板上测试是没问题的,有哪位大佬知道这是什么问题?
void rtc_pre_config(void)
{
    /* enable access to RTC registers in backup domain */
    rcu_periph_clock_enable(RCU_PMU);  //使能PMU电源管理单元时钟
    pmu_backup_write_enable();  //使能电源备份源,RTC需要此备份域
    rcu_osci_on(RCU_LXTAL);  //使用外部晶振32.768K
    rcu_osci_stab_wait(RCU_LXTAL);
    rcu_rtc_clock_config(RCU_RTCSRC_LXTAL);  //配置RTC时钟源为外部晶振32.768K
    prescaler_a = 0x7F;  //ck_apre频率 = RTC_CLOCK/(prescaler_a+1) = 32768/(127+1)=256HZ
    prescaler_s = 0xFF;  //ck_spre频率 = ck_apre/(prescaler_s+1) = 256/(255+1)=1HZ
    rcu_periph_clock_enable(RCU_RTC);  //使能RTC外设时钟
    rtc_register_sync_wait();
}
sonicll 发表于 2022-2-10 19:23 | 显示全部楼层
仿真状态下无法同步的时候,看下LXTAL起振了没,看下RCU_BDCTL寄存器的LXTALSTB位,再检查一下RTCSRC的值是不是01
 楼主| 紫气东升 发表于 2022-2-12 11:45 | 显示全部楼层
本帖最后由 紫气东升 于 2022-2-14 08:49 编辑
sonicll 发表于 2022-2-10 19:23
仿真状态下无法同步的时候,看下LXTAL起振了没,看下RCU_BDCTL寄存器的LXTALSTB位,再检查一下RTCSRC的值是 ...

用示波器看是有波形的,晶振已经起振了。LXTALSTB位打勾了,RTCSRC的值是0x02
sonicll 发表于 2022-2-14 09:33 | 显示全部楼层
紫气东升 发表于 2022-2-12 11:45
用示波器看是有波形的,晶振已经起振了。LXTALSTB位打勾了,RTCSRC的值是0x02
...

RTCSRC值是0x02,就说明当前时钟源是IRC32K,而不是LXTAL,RTCSRC一但配置过了以后,只能复位备份域才能做修改,你的代码是不是在执行rtc_pre_config函数之前,就已经配置过一次RTCSRC,所以你第二遍的配置是不生效的,必须复位BKP才能重新配置
 楼主| 紫气东升 发表于 2022-2-14 11:06 | 显示全部楼层
本帖最后由 紫气东升 于 2022-2-14 11:11 编辑
sonicll 发表于 2022-2-14 09:33
RTCSRC值是0x02,就说明当前时钟源是IRC32K,而不是LXTAL,RTCSRC一但配置过了以后,只能复位备份域才能 ...

在执行rtc_pre_config函数之前,没有配置RTCSRC呀。我整个工程代码也就配置这个RTC功能
int main(void)
{
    nvic_priority_group_set(NVIC_PRIGROUP_PRE4_SUB0);
    systick_config();
   
    rtc_pre_config();
    rtc_setup();
   
    gd_eval_led_init(LED2);
    while(1)
    {
        
    }
}
整件事情开头这样的,一开始是用内部的IRC32K配置的,但是发现时间不准确,所以就改成了用外部LXTAL32.768K配置,然后,就遇到了这种问题。


 楼主| 紫气东升 发表于 2022-2-14 14:50 | 显示全部楼层
sonicll 发表于 2022-2-14 09:33
RTCSRC值是0x02,就说明当前时钟源是IRC32K,而不是LXTAL,RTCSRC一但配置过了以后,只能复位备份域才能 ...

按照你的方法又试一遍,执行rtc_pre_config函数之前,先执行rcu_bkp_reset_enable();复位BKP。不过结果依然是无效。难搞咯
sonicll 发表于 2022-2-14 15:03 | 显示全部楼层
紫气东升 发表于 2022-2-14 14:50
按照你的方法又试一遍,执行rtc_pre_config函数之前,先执行rcu_bkp_reset_enable();复位BKP。不过结果依 ...

你把rtc_pre_config函数开头改成这样:

rcu_periph_clock_enable(RCU_PMU);
pmu_backup_write_enable();
rcu_bkp_reset_enable();
rcu_bkp_reset_disable();
rcu_osci_on(RCU_LXTAL);
rcu_osci_stab_wait(RCU_LXTAL);
rcu_rtc_clock_config(RCU_RTCSRC_LXTAL);
....

或者代码可以不改,你把你的开发板完全断电,包括VBAT上接的电池也拆掉,让备份域断电复位,然后重新上电,应该就可以,

评论

大佬666,调了一下午了,数据手册读烂了都没找到解决方法,按照你的方法来一下就解决了  发表于 2025-7-4 15:44
mark! 非常感谢,今日我调试GD32L233也是遇到相同,通过此方法解决。  发表于 2024-8-8 10:44

评分

参与人数 1威望 +3 收起 理由
紫气东升 + 3

查看全部评分

 楼主| 紫气东升 发表于 2022-2-14 19:04 | 显示全部楼层
sonicll 发表于 2022-2-14 15:03
你把rtc_pre_config函数开头改成这样:

rcu_periph_clock_enable(RCU_PMU);

按你这样写可以哦,我一开始只是添加了rcu_bkp_reset_enable();这句,现在增加rcu_bkp_reset_disable();这句就行了,没问题了,同步没问题,接下来的设置时间也没问题。大哥厉害啊,牛X!
嗯嗯,接下来就需要验证一下用外部晶振时间准不准的事了。
tfqi 发表于 2022-3-1 15:50 | 显示全部楼层
32768的那个时钟
gwsan 发表于 2022-3-1 15:57 | 显示全部楼层
有一定的应用限制
zljiu 发表于 2022-3-1 16:05 | 显示全部楼层
应该是可以这样的
nawu 发表于 2022-3-1 16:20 | 显示全部楼层
修改了一下使能信号
aoyi 发表于 2022-3-1 16:28 | 显示全部楼层
都是什么外设可以用这个时钟呢
风来吴山 发表于 2022-3-12 14:41 | 显示全部楼层
本帖最后由 风来吴山 于 2022-3-12 15:06 编辑

请问晶振用示波器看起振了,但是一直在卡rcu_osci_stab_wait函数中,请问是什么情况呢?
  1. /* wait IRC40K stable */
  2.     case RCU_IRC40K:
  3.         while((RESET == osci_stat) && (OSC_STARTUP_TIMEOUT != stb_cnt)){
  4.             osci_stat = rcu_flag_get(RCU_FLAG_IRC40KSTB);
  5.             stb_cnt++;
  6.         }

  7.         /* check whether flag is set or not */
  8.         if(RESET != rcu_flag_get(RCU_FLAG_IRC40KSTB)){
  9.             reval = SUCCESS;
  10.         }
  11.         break;
初始化如下:
  1. rcu_periph_clock_enable(RCU_BKPI);
  2.     rcu_periph_clock_enable(RCU_PMU);
  3.     pmu_backup_write_enable();
  4.     bkp_deinit();
  5.     rcu_osci_on(RCU_LXTAL);
  6.     rcu_osci_stab_wait(RCU_LXTAL);
  7.     rcu_rtc_clock_config(RCU_RTCSRC_LXTAL);
  8.     rcu_periph_clock_enable(RCU_RTC);
  9.     rtc_register_sync_wait();


捕获.PNG
山中老羊 发表于 2022-6-24 17:53 | 显示全部楼层
问下你们解决了吗?? 我现在也是卡在这里
qn7a12 发表于 2024-8-31 11:11 | 显示全部楼层
错误的负载电容会导致晶振频率不稳定或无法启动。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

97

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部

17

主题

97

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部