目录
3.1 RTC_CTL的位5 BPSHAD,如果是1则不需要同步
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);