stm32mini-学习笔记RTC实时时钟_备份区域原理

目录

RTC(Real Time Clock):实时时钟

RTC工作原理框图​

RTC时钟源框图

RTC相关寄存器

BKP备份寄存器

RTC控制寄存器高位(RTC_CRH) 

 RTC预分频装载寄存器(RTC_PRLH/RTC_PRLL)​

 RTC预分频器余数寄存器(RTC_DIVH / RTC_DIVL)​

RTC计数器寄存器 (RTC_CNTH / RTC_CNTL) 

RTC闹钟寄存器(RTC_ALRH/RTC_ALRL) ​

读RTC寄存器

配置RTC寄存器

配置过程

RTC相关库函数讲解

RTC配置一般步骤

RTC特征


RTC(Real Time Clock):实时时钟


        RTC是个独立的定时器。RTC模块拥有一个连续计数的计数器,在相应的软件配置下,可以提供时钟日历的功能。修改计数器的值可以重新设置当前时间和日期。
        RTC模块和时钟配置系统(RCC_BDCR寄存器)是在后备区域,即在系统复位或从待机模式唤醒后RTC的设置和时间维持不变。但是在系统复位后,会自动禁止访问后备寄存器和RTC,以防止对后备区域(BKP)的意外写操作。所以在要设置时间之前,先要取消备份区域(BKP)写保护。

RTC工作原理框图

RTC_PRL分频

RTC_DIV处理余数:由RTC直接控制,更精确

RTC_Overflow溢出,如果开启中断就会有溢出

RTC_Alarm闹钟

时钟源→分频器→计数器(RTC_Alarm不断比较)→产生中断

RTC时钟源框图

 stm32mini-学习笔记RTC实时时钟_备份区域原理_第1张图片RTC内核完全独立于APB1接口,软件通过APB1接口对RTC相关寄存器访问。但是相关寄存器只在RTCAPB1时钟进行重新同步的RTC时钟的上升沿被更新。所以软件必须先等待寄存器同步标志位(RTC_CRL的RSF位)被硬件置1才读。

RTC相关寄存器

BKP备份寄存器


① 备份寄存器是42 16位的寄存器。可用来存储84个字节数据。
② 它们处在备份区域,当VDD电源切断,仍然由VBat维持供电。
③当系统在待机模式下被唤醒,或者系统复位或者电源复位,它们也
不会复位。
④执行以下操作将使能对后备寄存器和RTC访问:

设置寄存器RCC_APB1ENR的PWREN和BKPEN位,使能电源和后备时钟。

设置寄存器PWR_CR的DBP位,使能对RTC和后备寄存器的访问。

RTC控制寄存器高位(RTC_CRH) 

stm32mini-学习笔记RTC实时时钟_备份区域原理_第2张图片RTC控制寄存器低位(RTC_CRL)stm32mini-学习笔记RTC实时时钟_备份区域原理_第3张图片

 stm32mini-学习笔记RTC实时时钟_备份区域原理_第4张图片

 RTC预分频装载寄存器(RTC_PRLH/RTC_PRLL)stm32mini-学习笔记RTC实时时钟_备份区域原理_第5张图片

stm32mini-学习笔记RTC实时时钟_备份区域原理_第6张图片

 RTC预分频器余数寄存器(RTC_DIVH / RTC_DIVL)stm32mini-学习笔记RTC实时时钟_备份区域原理_第7张图片

RTC计数器寄存器 (RTC_CNTH / RTC_CNTL) 

RTC核有一个32位可编程的计数器,可通过两个16位的寄存器访问。计数器以预分频器产生的 TR_CLK时间基准为参考进行计数。RTC_CNT寄存器用来存放计数器的计数值。他们受 RTC_CR 的 位 RTOFF 写保护,仅当 RTOFF 值 为 ’1’ 时,允许写操作。在高或低寄存器 (RTC_CNTH或RTC_CNTL)上的写操作,能够直接装载到相应的可编程计数器,并且重新装载 RTC预分频器。当进行读操作时,直接返回计数器内的计数值(系统时间)。stm32mini-学习笔记RTC实时时钟_备份区域原理_第8张图片

RTC闹钟寄存器(RTC_ALRH/RTC_ALRL) stm32mini-学习笔记RTC实时时钟_备份区域原理_第9张图片

读RTC寄存器

RTC核完全独立于RTC APB1接口。 软件通过APB1接口访问RTC的预分频值、计数器值和闹钟值。但是,相关的可读寄存器只在与 RTC APB1时钟进行重新同步的RTC时钟的上升沿被更新。RTC标志也是如此的。 这意味着,如果APB1接口曾经被关闭,而读操作又是在刚刚重新开启APB1之后,则在第一次 的内部寄存器更新之前,从APB1上读出的RTC寄存器数值可能被破坏了(通常读到0)。

下述几种 情况下能够发生这种情形:

● 发生系统复位或电源复位

● 系统刚从待机模式唤醒(参见第4.3 309/754 节:低功耗模式)。

● 系统刚从停机模式唤醒(参见第4.3节:低功耗模式)。 所有以上情况中,APB1接口被禁止时(复位、无时钟或断电)RTC核仍保持运行状态。 因此,若在读取RTC寄存器时,RTC的APB1接口曾经处于禁止状态,则软件首先必须等待 RTC_CRL寄存器中的RSF位(寄存器同步标志)被硬件置’1’。

注: RTC的 APB1接口不受WFI和WFE等低功耗模式的影响。

配置RTC寄存器


必须设置RTC_CRL寄存器中的CNF位,使RTC进入配置模式后,才能写入RTC_PRLRTC_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相关库函数讲解


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

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


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

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

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


同步函数:
 

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

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

FlagStatus RTC_GetFlagStatus(uint16_t RTC_FLAG) 
void RTC_ClearFlag(uint16_t RTC_FLAG);
ITStatus RTC_GetlTStatus(uint16_t RTC_IT);
void RTC_ClearlTPendingBit(uint16_t RTC_IT);


其他相关函数(BKP等)
 

PWR_BackupAccessCmd();//BKP后备区域访问使能
RCC_APB1PeriphClockCmd();//使能PWR和BKP时钟
RCC_LSEConfig();//开启LSE,RTC选择LSE作为时钟源

其他相关函数(BKP等)
 

PWR_BackupAccessCmd()://BKP后备区域访问使能
uint16_t BKP_ReadBackupRegister(uint16_t BKP_DR);//读BKP寄存器void BKP_WriteBackupRegister(uint16_t BKP_DR,uint16_t Data);//写BKP

RTC配置一般步骤


① 使能PWR和BKP时钟:RCC_APB1PeriphClockCmd(0;
②使能后备寄存器访问:PWR_BackupAccessCmd(0
③配置RTC时钟源,使能RTC时钟:
RCC_RTCCLKConfig(0;
RCC RTCCLKCmd0.
如果使用LSE,要打开LSE:RCC_LSEConfig(RCC_LSE_ON,
④设置RTC预分频系数:RTC_SetPrescaler();
⑤设置时间:RTC_SetCounter0;
⑥开启相关中断(如果需要):RTC_ITConfig()
⑦编写中断服务函数:RTC_IRQHandlerO;
⑧部分操作要等待写操作完成和同步。
RTC WaitForLastTask();//等待最近一次对RTC寄存器的写操作完成

RTC_WaitForSynchro();//等待RTC寄存器同步

RTC特征


可编程的预分频系数:分频系数最高为220
32位的可编程计数器,可用于较长时间段的测量。
2个分离的时钟:用于APB1接口的PCLK1和RTC时钟(RTC时钟的频率必须小于PCLK1时钟频率的四分之一以上)。
可以选择以下三种RTC的时钟源:
HSE时钟除以128:
LSE振荡器时钟;
LSI振荡器时钟(详见6.2.8节RTC时钟)。
2个独立的复位类型:
一 APB1接口由系统复位:
— RTC核心(预分频器、闹钟、计数器和分频器)只能由后备域复位(详见6.1.3节)。3个专门的可屏蔽中断:
一 闹钟中断,用来产生一个软件可编程的闹钟中断。
一 秒中断,用来产生一个可编程的周期性中断信号(最长可达1秒)。
一 溢出中断,指示内部可编程计数器溢出并回转为0的状态。

你可能感兴趣的:(stm32,单片机)