文章目录
- BKP简介
- 相关引脚
- BKP基本结构
- RTC简介
- RTC框图
- 三种时钟源
- RTC基本结构
- 硬件电路
- RTC操作注意事项
BKP简介
- BKP(Backup Registers)备份寄存器
- BKP可用于存储用户应用程序数据。当VDD(2.0~ 3.6V)电源被切断,他们仍然由VBAT(1.8~ 3.6V)维持供电。当系统在待机模式下被唤醒,或系统复位或电源复位时,他们也不会被复位
- TAMPER引脚产生的侵入事件将所有备份寄存器内容清除 RTC引脚输出RTC校准时钟、RTC闹钟脉冲或者秒脉冲 存储RTC时钟校准寄存器
- 用户数据存储容量: 20字节(中容量和小容量)/ 84字节(大容量和互联型)
相关引脚
TAMPER引脚产生的侵入事件:可以由此引脚外接一个上拉或下拉电阻,当有人触发了拆开设备等事件使TAMPER引脚产生上升沿或下降沿,使STM32检测到侵入事件,清空BKP的所有内容并申请中断,在中断中配置其他保护操作
BKP基本结构
橙色部分为后备区域,即主电源断电后还可以继续由VBAT供电工作
RTC简介
- RTC(Real Time Clock)实时时钟 RTC是一个独立的定时器,可为系统提供时钟和日历的功能
- RTC和时钟配置系统处于后备区域,系统复位时数据不清零,VDD(2.0~ 3.6V)断电后可借助VBAT(1.8~ 3.6V)供电继续走时
- 32位的可编程计数器,可对应Unix时间戳的秒计数器 20位的可编程预分频器,可适配不同频率的输入时钟
- 可选择三种RTC时钟源:
HSE时钟除以128(通常为8MHz/128)
LSE振荡器时钟(通常为32.768KHz)
LSI振荡器时钟(40KHz)
RTC框图
下图深色部分为主电源掉电或可以使用VBAT备用电源继续工作的部分
- RTCCLK:RTC晶振
- RTC_PRL:重装寄存器,RTC预分频重载值,相当于分频值,由于包含0,则给9就相当于10分频
- RTC_DIV:余数寄存器,接收RTC晶振,设置初值为RTC_PRL,每次接收晶振自减1,溢出产生上升沿,以此分频。例如RTC_PRL=32767,RTCCLK=32768,则需自减32768次,最后输出的频率就为32768-32767+1=0,以此得到1Hz的频率
- RTC_CNT:相当于32位Unix事件戳秒计数器,可通过time.h库函数来进行时间转换,因为使用的秒计数器,所以需要把RTCCLK分频为1Hz给秒计数器
- RTC_ALR:闹钟寄存器,设置闹钟时间,唤醒RTC计时,平时处于待机模式以省电
- WKUP pin:用于唤醒设备
- RTC_Second:每秒进入一次中断
- RTC_Overflow:计数器溢出中断
- RTC_Alarm:闹钟中断
三种时钟源
参考RCC时钟树
图中三种时钟源分别对应:
- HSE时钟除以128(通常为8MHz/128):主晶振,主要作为系统主时钟,一般8MHz
- LSE振荡器时钟(通常为32.768KHz):专用于RTC,可以在主电源断电时继续产生频率,而且32768为2的15次方,在经过一个15为分频器自动溢出即可得到1Hz的频率
- LSI振荡器时钟(40KHz):内部低俗晶振,精度没有外部时钟高,一般用于看门狗,只做备选方案
RTC基本结构
RTC主要流程简化图
硬件电路
注意:在VDD上升阶段(tRSTTEMPO)或者探测到PDR(掉电复位)之后,VBAT和VDD之间的电源开关仍会保持连接在VBAT。在VDD上升阶段,如果VDD在小于tRSTTEMPO的时间内达到稳定状态(关于tRSTTEMPO数值可参考数据手册中的相关部分),且VDD > VBAT + 0.6V时,电流可能通过VDD和VBAT之间的内部二极管注入到VBAT。如果与VBAT连接的电源或者电池不能承受这样的注入电流,强烈建议在外部VBAT和电源之间连接一个低压降二极管。如果在应用中没有外部电池,建议VBAT在外部连接到VDD并连接一个100nF的陶瓷滤波电容
对于CL1和CL2,建议使用高质量的5pF~15pF之间的瓷介电容器,并挑选符合要求的晶体或谐振器
RTC操作注意事项
- 执行以下操作将使能对BKP和RTC的访问:
设置RCC_APB1ENR的PWREN和BKPEN,使能PWR和BKP时钟
设置PWR_CR的DBP,使能对BKP和RTC的访问 - 若在读取RTC寄存器时,RTC的APB1接口曾经处于禁止状态,则软件首先必须等待RTC_CRL寄存器中的RSF位(寄存器同步标志)被硬件置1(由于外设时钟频率远快于RTC时钟,所以要等待RTC时钟,将寄存器的值同步到APB1总线上)
- 必须设置RTC_CRL寄存器中的CNF位,使RTC进入配置模式后,才能写入RTC_PRL、RTC_CNT、RTC_ALR寄存器对RTC任何寄存器的写操作,都必须在前一次写操作结束后进行。
- 可以通过查询RTC_CR寄存器中的RTOFF状态位,判断RTC寄存器是否处于更新中。仅当RTOFF状态位是1时,才可以写入RTC寄存器