STM32F1之RTC

1.RTC是什么

RTC,英文全称:Real-time clock,中文名称:实时时钟,是指可以像时钟一様输出实际时间的电子设备,一般会是集成电路,因此也称为时钟芯片。

很多CPU中都已集成RTC系统,且有许多独立的外接RTC芯片可用于实现RTC功能。

总之,RTC只是个能靠电池维持运行的32位定时器,并不像实时时钟芯片,读出来就是年月日。

实际上,RTC就只一个定时器而已,掉电之后所有信息都会丢失,因此我们需要找一个地方来存储这些信息,于是就找到了备份寄存器。因为它掉电后仍然可以通过纽扣电池供电,所以能时刻保存这些数据。

2.RTC的优缺点

RTC的作用是:可以提供稳定的时钟信号给后续电路用。主要功能有:时钟,日历,闹钟,周期性中断输出,32KHz时钟输出。

具有功耗低的优点,不能直接读出具体时间,只能读出秒数,根据秒数计算出当前时间。

主要性能指标

控制方式:二线制,三线,四线制。

晶振:分内置晶振和外置晶振。

耗流,时间微调范围,时间精度以及是否有TTF功能

3.RTC使用方法

RTC只是一个时钟,但与RTC相连的有两个系统时钟,一个是APB1接口的PCLK1另一个是RTC时钟。这样,RTC功能也就分为两个部分:第一部分,APB1接口部分,与APB1总线相连,MCU也就是通过这条总线对其进行读写操作。另一部分,RTC核,由一系列可编程计数器组成,这部分又再细分为两个组件:预分频模块与32位可编程计数器。预分频模块用来产生最长为1秒的RTC时间基准,而32位的可编程的计数器可被初始化为当前的系统时间。

STM32F1之RTC_第1张图片

RTC核心模块

第一模块:预分频模块(可编程产生1S的RTC时间基准TR_CLK)20位的预分频器,在RTC_CR中设置相应允许位,会在TR_CLK周期中产生一个秒中断。

第二模块:32位计数器(可初始化当前系统时间)

闹钟寄存器

系统按TR_CLK周期累加并与存储在RTC_ALR寄存器中的可编程时间比较,如果RTC_CR控制寄存器中设置了相应允许位,比较匹配时将产生一个闹钟中断。


由于RTC内核完全独立与APB1接口,软件只能通过APB1的接口访问RTC的预分频值、计数器值和闹钟值,相关的寄存器值是在APB1时钟进行重新同步的RTC上升沿被更新,所以在读取RTC寄存器曾经被禁止的APB1接口前,必须等待RTC_CRL寄存器的PSF位被置1


RTC控制寄存器(控制中断用,秒中断)

RTC_CRL:

0位:进入秒中断后,可判断该位为1决定发生了中断,必须写0清除

3位:寄存器同步标志位,没有同步之前,不被允许修改RTC_CRT/CRL的值,必须先判断该位为1时,同步了。

4位:在修改RTC_CNT/RTC_ALR/RTC_PRL的值前,必须置该位为1,进入配置模式。

5位:RTC操作位,由硬件操作,软件只读,判断该位为1时,表示上一次操作已经完成,才可进行下一次操作。

RTC_CRH:0-3位置1,允许溢出中断、闹钟中断、秒中断。

RTC预分频装在寄存器

他俩是配置RTC时钟分频系数的。

TRC_PRLH:低4位有效,存放PRL的19-16位

TRC_PRLL:存放PRL的前16位


RTC计数器寄存器RTC_CNT(2个16位寄存器组成,共32位RTC_CNTH、RTC_CNTL:用来存放秒钟值)


RTC闹钟寄存器:(2个16位寄存器组成,共32位)

RTC_ALRH、RTC_ALRL:

用来记录闹钟产生的时间,当RTC_CNT与RTC_ALR的值相等时,则产生闹钟中断,条件是使能了中断且进入了寄存器的配置模式了。

备份寄存器(存储RTC相关信息,待机模式被唤醒等操作备份区域不会被复位)

执行如下操作对备份寄存器和RTC进行访问

1)设置寄存器RCC_APB1ENR的PWREN和BKPEN位打开电源和后备时钟

2)电源后备寄存器(PWR_CR)的DBP位使能对后备寄存器和RTC的访问。

4.使用步骤:

1)因为RTC模块和时钟配置系统处于后备区域,这样做的好处是系统复位或从待机模式唤醒后,RTC的设置和时间维持不变。所以首先需要判断备份区域是否为第一次设置,如果是,则进行RCC相关寄存器的设置,如果不是,则不需要配置。

如何判断是否为第一次,那就在配置完成的最下面,向备份区域随便写一个数据,在开始配置的时候,去读一下备份区域的这个字节,如果存在,则已经配置了,如果不存在,则需要相关配置。

接口函数BKP_ReadBackupRegister(uint16_t BKP_DR),入参函数可以是随便的BKP_DR其中一个寄存器,等到写的时候,也是写在这个寄存器中。

2)执行如下操作对备份寄存器和RTC进行访问

a.设置寄存器RCC_APB1ENR的PWREN和BKPEN位打开电源和后备时钟

RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP|RCC_APB1ENR_PWREN,ENABLE);

b.电源后备寄存器(PWR_CR)的DBP位使能对后备寄存器和RTC的访问。

后备区域可以维持系统复位或从待机模式唤醒后RTC的设置和时间不变在设置时间之前,需要取消备份区域写保护,以防止对备份区域意外写操作。

PWR_BackupAccessCmd(ENABLE);

3)在取消备份区域写保护之后,可以先对这个区域复位,以清除前面的设置。

BKP_DeInit();

4)备份区域控制寄存器RCC_BDCR

作用:RTC的时钟选择及使能设置。所以在操作RTC之前先应通过此寄存器选择RTC的时钟源。选择LSE时钟,因为LSE为外部低速时钟,比内部时钟稳定。

RCC_LSEConfig(RCC_LSE_ON);

可以通过while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)接口判断晶振是否正常运行。

5)开启RCC时钟

RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);

6)使能RTC时钟

RCC_RTCCLKCmd(ENABLE);

7)等待最近一次对 RTC 寄存器的写操作完成与RTC 寄存器同步完成(每对RTC寄存器进行一次操作,都要调用这些接口)

RTC_WaitForLastTask();

RTC_WaitForSynchro();

8)使能 RTC 秒中断

RTC_ITConfig(RTC_IT_SEC,ENABLE);

9)设置 RTC 预分频的值

RTC_SetPrescaler(32767);  

关于STM32定时器怎么计算重装值和预分频
分频值是是指你将系统时钟的频率减小,假设时钟频率是72Mhz,然后分频值是7199,现在你的定时器值就是10kHz,

表示每计一个数,然后过了1/(10^4)秒,然后你的重装值就是你的时间了,如果值是9999,就表示定时时间为1s。   

10)编写函数,设置想要让RTC从何时开始的时间,如2016年7月12日18点28分,要把这个时间从1970年1月1日0时0分0秒开始到此时的总的秒数计算出来。然后通过RTC_SetCounter();接口设置初始时间。

11)然后在RTC中断处理函数中,通过判断RTC中断类型,RTC_GetITStatus(RTC_IT_SEC)!=RESET,还要记得清除标志位RTC_ClearITPendingBit(RTC_IT_SEC);。在此中断函数中调用一个获取当前时间的接口(自己写),在此接口中调用RTC_GetCounter()官方接口,获取当前的总秒数,在把秒数计算出当前的时间。总的来说就是每秒进一次中断,中断中获取一次当前从寄存器中读出的秒数,再根据秒数把秒数计算出当前时间。





















你可能感兴趣的:(STM32)