RTC实时时钟知识

一、RTC工作原理框图

 

 二、RTC时钟源

 

三、 RTC相关寄存器

  • RTC控制寄存器 (RTC_CRH, RTC_CRL)
  • RTC预分频装载寄存器 (RTC_PRLH, RTC_PRLL)
  • RTC预分频余数寄存器 (RTC_DIVH, RTC_DIVL)
  • RTC计数器寄存器 (RTC_CNTH, RTC_CNTL)
  • RTC闹钟寄存器 (RTC_ALRH ,RTC_ALRL)

 

必须设置RTC_CRL寄存器中的CNF位,使RTC进入配置模式后,才能写入RTC_PRL、RTC_CNT、RTC_ALR寄存器。

另外,对RTC任何寄存器的写操作,都必须在前一次写操作结束后进行。可以通过查询RTC_CR寄存器中的RTOFF状态位,判断RTC寄存器是否处于更新中。仅当RTOFF状态位是’1’时,才可以写入RTC寄存器。

配置过程:

  1. 查询RTOFF位,直到RTOFF的值变为’1’
  2. 置CNF值为1,进入配置模式
  3. 对一个或多个RTC寄存器进行写操作
  4. 清除CNF标志位,退出配置模式
  5. 查询RTOFF,直至RTOFF位变为’1’以确认写操作已经完成。

仅当CNF标志位被清除时,写操作才能进行,这个过程至少需要3个RTCCLK周期。

三、 RTC相关库函数讲解

1.RTC时钟源和时钟操作函数:

  • void RCC_RTCCLKConfig(uint32_t CLKSource);//时钟源选择
  • void RCC_RTCCLKCmd(FunctionalState NewState)//时钟使能 

2.RTC配置函数(预分频,计数值): 

  • oid RTC_SetPrescaler(uint32_t PrescalerValue);//预分频配置:PRLH/PRLL
  • void RTC_SetCounter(uint32_t CounterValue);//设置计数器值:CNTH/CNTL
  • void RTC_SetAlarm(uint32_t AlarmValue);//闹钟设置:ALRH/ALRL

3.RTC中断设置函数:

  • void RTC_ITConfig(uint16_t RTC_IT, FunctionalState NewState);//CRH
  • RTC允许配置和退出配置函数: 
  • void RTC_EnterConfigMode(void);//允许RTC配置 :CRL位 CNF
  • void RTC_ExitConfigMode(void);//退出配置模式:CRL位 CNF 

4.同步函数:

  • void RTC_WaitForLastTask(void);//等待上次操作完成:CRL位RTOFF
  • void RTC_WaitForSynchro(void);//等待时钟同步:CRL位RSF

5.相关状态位获取清除函数: 

  • FlagStatus RTC_GetFlagStatus(uint16_t RTC_FLAG);
  • void RTC_ClearFlag(uint16_t RTC_FLAG);
  • ITStatus RTC_GetITStatus(uint16_t RTC_IT);
  • void RTC_ClearITPendingBit(uint16_t RTC_IT);

6.其他相关函数(BKP等)

  • PWR_BackupAccessCmd();//BKP后备区域访问使能
  • RCC_APB1PeriphClockCmd();//使能PWR和BKP时钟
  • RCC_LSEConfig();//开启LSE,RTC选择LSE作为时钟源
  • PWR_BackupAccessCmd();//BKP后备区域访问使能
  • uint16_t BKP_ReadBackupRegister(uint16_t BKP_DR);//读BKP寄存器
  • void BKP_WriteBackupRegister(uint16_t BKP_DR, uint16_t Data);//写BKP

四、 RTC配置一般步骤

  1. 使能PWR和BKP时钟:RCC_APB1PeriphClockCmd(); ② 使能后备寄存器访问: PWR_BackupAccessCmd();
  2. 配置RTC时钟源,使能RTC时钟: RCC_RTCCLKConfig(); RCC_RTCCLKCmd(); 如果使用LSE,要打开LSE:RCC_LSEConfig(RCC_LSE_ON);
  3. 设置RTC预分频系数:RTC_SetPrescaler();
  4. 设置时间:RTC_SetCounter();
  5. 开启相关中断(如果需要):RTC_ITConfig();
  6. 编写中断服务函数:RTC_IRQHandler();
  7. 部分操作要等待写操作完成和同步。 RTC_WaitForLastTask();//等待最近一次对RTC寄存器的写操作完成 RTC_WaitForSynchro(); //等待RTC寄存器同步
  • 24
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值