打印

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

[复制链接]
3459|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
参照官方例程配置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才能重新配置

使用特权

评论回复
5
紫气东升|  楼主 | 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配置,然后,就遇到了这种问题。


使用特权

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

按照你的方法又试一遍,执行rtc_pre_config函数之前,先执行rcu_bkp_reset_enable();复位BKP。不过结果依然是无效。难搞咯

使用特权

评论回复
7
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上接的电池也拆掉,让备份域断电复位,然后重新上电,应该就可以,

使用特权

评论回复
评论
陈吉Ch 2024-8-8 10:44 回复TA
mark! 非常感谢,今日我调试GD32L233也是遇到相同,通过此方法解决。 
评分
参与人数 1威望 +3 收起 理由
紫气东升 + 3
8
紫气东升|  楼主 | 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!
嗯嗯,接下来就需要验证一下用外部晶振时间准不准的事了。

使用特权

评论回复
9
tfqi| | 2022-3-1 15:50 | 只看该作者
32768的那个时钟

使用特权

评论回复
10
gwsan| | 2022-3-1 15:57 | 只看该作者
有一定的应用限制

使用特权

评论回复
11
zljiu| | 2022-3-1 16:05 | 只看该作者
应该是可以这样的

使用特权

评论回复
12
nawu| | 2022-3-1 16:20 | 只看该作者
修改了一下使能信号

使用特权

评论回复
13
aoyi| | 2022-3-1 16:28 | 只看该作者
都是什么外设可以用这个时钟呢

使用特权

评论回复
14
风来吴山| | 2022-3-12 14:41 | 只看该作者
本帖最后由 风来吴山 于 2022-3-12 15:06 编辑

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

        /* check whether flag is set or not */
        if(RESET != rcu_flag_get(RCU_FLAG_IRC40KSTB)){
            reval = SUCCESS;
        }
        break;
初始化如下:
rcu_periph_clock_enable(RCU_BKPI);
    rcu_periph_clock_enable(RCU_PMU);
    pmu_backup_write_enable();
    bkp_deinit();
    rcu_osci_on(RCU_LXTAL);
    rcu_osci_stab_wait(RCU_LXTAL);
    rcu_rtc_clock_config(RCU_RTCSRC_LXTAL);
    rcu_periph_clock_enable(RCU_RTC);
    rtc_register_sync_wait();


捕获.PNG (11.31 KB )

捕获.PNG

使用特权

评论回复
15
山中老羊| | 2022-6-24 17:53 | 只看该作者
问下你们解决了吗?? 我现在也是卡在这里

使用特权

评论回复
16
qn7a12| | 2024-8-31 11:11 | 只看该作者
错误的负载电容会导致晶振频率不稳定或无法启动。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

97

帖子

0

粉丝