· BKP(Backup Registers)备份寄存器
· BKP可用于存储用户应用程序数据。当VDD(2.0~3.6V)电源被切断,他们仍然由VBAT(备用 电池电源 1.8~3.6V)维持供电。当系统在待机模式下被唤醒,或系统复位或电源复位时,他们也不会被复位
(如果VDD断电,VBAT也没电,BKP里的数据就会清零)
· TAMPER引脚产生的侵入事件将所有备份寄存器内容清除 (PC13-TAMPER-RTC共用一个引脚)
(STM32把以下RTC的功能放在BKP里了)
· RTC引脚输出RTC校准时钟、RTC闹钟脉冲或者秒脉冲 (PC13-TAMPER-RTC共用一个引脚)
· 存储RTC时钟校准寄存器(可配合RTC校准时钟,结合一些测量方法,对RTC进行校准)
· 用户数据存储容量:
20字节(中容量和小容量)/ 84字节(大容量和互联型)(STM32C8T6为中容量,也就是20字节)
注1:
TAMPER引脚是一个安全保障设计,有侵入检测功能。
设计电路时,TAMPER引脚可以先加一个默认的上拉或者下拉电阻,然后引一根线,到你的设备外壳防拆开关或触点,别人一拆开你的设备,触发开关,就会在TAMPER引脚产生上升沿或者下降沿,这样STM32就检测到侵入事件了。这时BKP的数据会自动清零,并且申请中断。
在中断里还可以继续保护设备,比如清除其他存储器数据,然后设备锁死,来保证设备安全。主电源断电后,侵入检测仍然有效。
注2:
引脚定义图中,标红色的部分是供电引脚,VDD_1,2,3和VSS_1,2,3为内部数字部分电路的供电;VDDA和VSSA为内部模拟部分数字的供电。这四组供电都是系统的主电源,全要接到3.3V电源上。VBAT为备用电池供电引脚,接电池时,电池正极接到VBAT,电池负极和主电源的负极接在一起共地。
STM32参考手册里建议,如果没有外部电池,VBAT引脚接到VDD,即和主电源接到一起,并且再连接一个100nF的滤波电容。
BKP处于后备区域,当VDD主电源掉电时,后备区域仍然可以由VBAT的备用电池供电。当VDD主电源上电时,后备区域供电会由VBAT切换到VDD。也就是主电源有电时,VBAT不会用到,可以节省电池电量。
BKP里主要有数据寄存器、控制寄存器、状态寄存器和RTC时钟校准寄存器
· 数据寄存器,中容量有10个,每个16位即2字节,共20个字节。
· 入侵检测 触发TAMPER引脚,产生上升沿或者下降沿,TM32检测到侵入事件,BKP的数据会自动清零,并且申请中断。
· 时钟输出 把RTC的相关时钟,从PC13位置的RTC引脚输出出去,供外部使用。其中输出校准时钟时,配合校准寄存器,可以对RTC的误差进行校准。
· RTC(Real Time Clock)实时时钟
· RTC是一个独立的定时器,可为系统提供时钟和日历的功能
· RTC和时钟配置系统处于后备区域,系统复位时数据不清零,VDD(2.0~3.6V)断电后可借助VBAT(1.8~3.6V)供电继续走时
· 32位的可编程计数器,可对应Unix时间戳的秒计数器
· 20位的可编程预分频器,给RTCCLK降频率,保证分频器输出给计数器的频率为1Hz,可以选择对输入时钟进行1~2^20范围的分频,可适配不同频率的输入时钟
· 可选择三种RTC时钟源:
HSE时钟除以128(主要作为系统主时钟,备选RTC时钟,高速外部时钟信号,通常为8MHz/128)
LSE振荡器时钟(RTC最常用,低速外部时钟信号,通常为32.768KHz,2^15次方,只有这个时钟可以通过VBAT备用电池供电)
LSI振荡器时钟(主要作为看门狗时钟,备选RTC时钟,低速内部时钟信号,40KHz)
选择其中一个接入到RTCCLK
左为核心的、分频和计数计时部分,右为中断输出使能和NVIC部分,上为APB1总线读写部分,下为和PWR关联的部分,即RTC的闹钟可以唤醒设备,退出待机模式。
有灰色填充部分都为后备区域。
先由RTC预分频器进行分频。RTC_PRL为重装载寄存器,RTC_DIV为余数寄存器。
RTC_PRL写入一个计数目标值,用来配置是几分频。重装值写入6为7分频,写入9为10分频。
RTC_DIV每个时钟计一个数,为自减寄存器,每来一个输入时钟,DIV的值就自减一次,自减到0时,再来一个输入时钟,DIV输出一个脉冲,产生溢出信号,同时DIV从PRL获取重装值,回到重装值继续自减。
例:
如RTCCLK输入时钟为32.768KHz,即32768Hz,为了分频之后得到1Hz,PRL就要给32767,这个数值是始终不变的。
DIV初始值为0,第一个输入时钟到来时,DIV立即溢出,产生溢出信号给后续电路,同时,DIV变为重装值32767。
第二个输入时钟,DIV自减变为32766。
第三个时钟,DIV变为32765。
DIV来一个输入时钟自减一次,直到变为0,然后再来一个输入时钟,就会产生一个溢出信号,同时DIV回到32767,以此往复循环。
每来32768个输入脉冲,计数器溢出一次,产生一个输出脉冲。
这就是32768分频,分频输出后时钟频率为1Hz,提供给后续的秒寄存器。
CNT 32位计数器,一秒自增一次。
RTC_ALR为32位寄存器,可设置闹钟。
中断部分,有三个信号可以触发中断。
RTC_Second,秒中断,来源为CNT的输入时钟。如果开启这个中断,程序就会每秒进一次RTC中断。
RTC_Overflow,溢出中断,当CNT32位计数器计满溢出,会触发一次中断,2106年才会溢出。
RTC_Alarm,闹钟中断,当CNT的值跟ALR设定的闹钟值一样时,产生RTC_Alarm闹钟信号,通往右边的中断系统。闹钟信号还能让STM32退出待机模式。
中断标志位和中断输出控制 F(Flag)结尾的是对应的中断标志位,IE(Interrupt Enable)结尾的是中断使能。最后三个信号通过一个或门,汇聚到NVIC中断控制器。
APB1总线和APB1接口,为程序读写寄存器的地方。
WKUP(Weak Up)引脚也可以唤醒设备(PA0-WKUP)
配置数据选择器,选择时钟来源;
配置重装寄存器,选择分频系数;
配置32位计数器,进行日期时间的读写;
需要闹钟则配置32位闹钟值;
需要中断则先允许中断,再配置NVIC。
VBAT 备用电池供电推荐连接: 电池和主电源都加一个二极管,防止电流倒灌,VBAT加一个0.1uF的电源滤波电容,如果没有备用电池,就是3V3的主电源供电,如果接了备用电池,3V3没电时,就是备用电池供电。
外部低速晶振 X1为RTC晶振,两端分别接在OSC32两个引脚上,晶振两端分别接一个起振电容,到GND
备用电池一般用3V纽扣电池CR2032
执行以下操作将使能对BKP和RTC的访问:
设置RCC_APB1ENR的PWREN和BKPEN,使能PWR和BKP时钟
设置PWR_CR的DBP,使能对BKP和RTC的访问
若在读取RTC寄存器时,RTC的APB1接口曾经处于禁止状态,则软件首先必须等待RTC_CRL寄存器中的RSF位(寄存器同步标志)被硬件置1
必须设置RTC_CRL寄存器中的CNF位,使RTC进入配置模式后,才能写入RTC_PRL、RTC_CNT、RTC_ALR寄存器
对RTC任何寄存器的写操作,都必须在前一次写操作结束后进行。可以通过查询RTC_CR寄存器中的RTOFF状态位,判断RTC寄存器是否处于更新中。仅当RTOFF状态位是1时,才可以写入RTC寄存器