GD32450i-EVAL学习笔记 10 - RTC

目录

 

1 时钟源

1.1 IRC32K

 1.2 LXTAL

2 使能RCU

3 寄存器和时钟同步

3.1 RTC_CTL的位5 BPSHAD,如果是1则不需要同步

3.2 写保护钥匙寄存器 (RTC_WPK)

3.3 清除寄存器同步标志并等待硬件置位

4 预分频寄存器 (RTC_PSC)

4.1 时钟源为IRC32K

4.2 时钟源为LXTAL

5 初始化

5.1 进入初始化状态

5.2 时间寄存器RTC_TIME

5.3 日期寄存器RTC_DATE

5.4 时间格式

5.5 退出初始化状态


1 时钟源

RTC 单元有三个可选的独立时钟源:LXTAL、IRC32K和HXTAL的2-31(由 RCU_CFG 寄存器配置)分频后的时钟。

其中使用最多的是LXTAL,LXTAL由一个外部的32.768KHZ的晶振提供,精度高,稳定,RTC首选。IRC32K是芯片内部的32KHZ RC振荡器,精度较低,会有温漂,一般不建议使用。HXTAL由HSE分频得到,最高是4M,使用的也较少。

1.1 IRC32K

rcu_osci_on(RCU_IRC32K);
rcu_osci_stab_wait(RCU_IRC32K);
rcu_rtc_clock_config(RCU_RTCSRC_IRC32K);

前面2句对应寄存器RCU_RSTSCK

第三句配置RTC的源为IRC32K,对应寄存器RCU_BDCTL

 1.2 LXTAL

rcu_osci_on(RCU_LXTAL);
rcu_osci_stab_wait(RCU_LXTAL);
rcu_rtc_clock_config(RCU_RTCSRC_LXTAL);

前面2句对应备份域控制寄存器 (RCU_BDCTL)

第三句配置RTC的源为LXTAL,对应寄存器RCU_RSTSCK.

注意:寄存器RCU_BDCTL需要在电源控制寄存器(PMU_CTL)中的BKPWEN位置1后才能写入

2 使能RCU

rcu_periph_clock_enable(RCU_RTC);

3 寄存器和时钟同步

调用API函数rtc_register_sync_wait等待寄存器和时钟的同步

ErrStatus rtc_register_sync_wait(void)

等待寄存器RTC_TIME和RTC_DATE与APB时钟同步,并且更新了影子寄存器(部分寄存器不是直接读写的,是通过对应的影子寄存器操作的)。

3.1 RTC_CTL的位5 BPSHAD,如果是1则不需要同步

3.2 写保护钥匙寄存器 (RTC_WPK)

#define RTC_UNLOCK_KEY1                    ((uint8_t)0xCAU)                           /*!< RTC unlock key1 */
#define RTC_UNLOCK_KEY2                    ((uint8_t)0x53U)                           /*!< RTC unlock key2 */
#define RTC_LOCK_KEY                       ((uint8_t)0xFFU)                           /*!< RTC lock key */

\写入0xCA和0x53解锁写保护,写入0xFF恢复写保护

3.3 清除寄存器同步标志并等待硬件置位

清除状态寄存器 (RTC_STAT)的位5

完成后RTC_WPK写入0xFF恢复写保护

4 预分频寄存器 (RTC_PSC)

预分频器由7位的异步预分频器APRE和15位的同步预分频器SPRE组成。

异步预分频器时钟CK_APRE用于为二进制 RTC_SSR 亚秒递减计数器提供时钟,同步预分频器时钟CK_SPRE用于更新日历。

CK_SPRE是1Hz的频率,而RTCCLK是前面时钟源选择的。FACTOR_A取值最大值为0x7F(127),这个值应该尽可能的大以节约能耗。

4.1 时钟源为IRC32K

RTCCLK=32KHz,FACTOR_A取0x63,则CK_APRE = 32KHz / 100 = 320Hz。

FACTOR_S取0x13F,CK_SPRE = 320 / 320 = 1Hz。

4.2 时钟源为LXTAL

RTCCLK=32.768KHz,FACTOR_A取0x7F, 则CK_APRE = 32.768K / 128 = 256Hz。

FACTOR_S取0xFF,CK_SPRE = 256/ 256 = 1Hz。

5 初始化

5.1 进入初始化状态

状态寄存器 (RTC_STAT)的位6,位7

RTC_STAT |= RTC_STAT_INITM;
do{
    flag_status = RTC_STAT & RTC_STAT_INITF;
}while((--time_index > 0U) && ((uint32_t)RESET == flag_status));

5.2 时间寄存器RTC_TIME

5.3 日期寄存器RTC_DATE

5.4 时间格式

对应控制寄存器 (RTC_CTL)位6.

5.5 退出初始化状态

RTC_STAT &= (uint32_t)(~RTC_STAT_INITM);

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值