RTC时钟原理
单片机内部有一块断电不丢失的寄存器(由额外电池一般是纽扣电池供电),每隔1s加1,然后记录的是与1970年1月1日0时的秒差。
工作原理细解
RTC模块的一些配置是被一个叫做后备区域保护着(禁止写),所以设置之前要先取消后备区域写保护。
首先RTC CLK有三个来源。最主要的是外部低速晶振。其他两个来源我懒得打了,可以参考时钟讲解。
RTC_DIV会随着预装载得值减到0然后产生一个脉冲。也就是预分频啦,将TR_CLK搞成1s的周期,同时重装载。
RTC_CNT就是记录目前离1970年的秒数。
旁边的三个依次是:秒中断,溢出中断,闹钟中断。
注意:RTC的寄存器是一个很独立的寄存器,我们可以通过APB1去访问它。但是访问回来的值只有在RTC和APB1时钟同步的情况下才是准确的。
BKP备份寄存器
里面有42个寄存器存放一些数据,这些数据不丢失(因为不断电)。
你可以往里面放一下校正值什么的,类似于储物柜。
相关寄存器
RTC控制寄存器 (RTC_CRH, RTC_CRL)
①修改CRH/CRL寄存器,必须先判断RSF位,确定已经与APB1同步。
②修改CNT,ALR,PRL的时候,必须先配置CNF位进入配置模式,修改完之后,设置CNF位为0退出配置模式
③同时在对RTC相关寄存器写操作之前,必须判断上一次写操作已经结束,也就是判断RTOFF位是否置位。
RTC预分频装载寄存器 (RTC_PRLH, RTC_PRLL)
RTC预分频余数寄存器 (RTC_DIVH, RTC_DIVL)
RTC计数器寄存器 (RTC_CNTH, RTC_CNTL)
RTC闹钟寄存器 (RTC_ALRH ,RTC_ALRL)
配置流程
第一次配置
//代码就不贴啦
- 使能RCC时钟(电源,后备区域)
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); //使能PWR和BKP外设时钟
- 获得后备区访问权限
PWR_BackupAccessCmd(ENABLE); //使能后备寄存器访问
- 设置RTC时钟源
u8 temp=0;
if (BKP_ReadBackupRegister(BKP_DR1) != 0x5050) //从指定的后备寄存器中读出数据:读出了与写入的指定数据不相乎
{
BKP_DeInit(); //复位备份区域