芯片的供电引脚
引脚表橙色的是芯片的供电引脚,其中VSS/VDD是芯片内部数字部分的供电,VSSA/VDDA是芯片内部模拟部分的供电,这4组以VDD开头的供电都是系统的主电源,正常使用时,全部都要接3.3V的电源上,VBAT是备用电池的引脚,如果要使用STM32的BKP和RTC,这个引脚就必须接备用电池,用来维持BKP和RTC主电源掉电后的供电,VBAT只有一根电源正,接的时候GND要与VDD共地。如果没有外部电池,参考手册建议VBAT引脚接到VDD并接一个100nf的滤波电容。
BKP简介
1、BKP(Backup Registers)备份寄存器
2、BKP可用于存储用户应用程序数据。当VDD(2.0~3.6V)电源被切断,他们仍然由VBAT(1.8~3.6V)维持供电。当系统在待机模式下被唤醒,或系统复位或电源复位时,他们也不会被复位。当VDD和VBAT都没电时,BKP就会清空数据,因为BKP本质是RAM存储器,没有掉电不丢失的特性。
3、TAMPER引脚产生的侵入事件将所有备份寄存器内容清除(TAMPER引脚产生上升沿/下降沿就清空数据),注意PC13、TAMPER引脚、RTC输出在一个引脚上,只能分时复用
4、RTC引脚输出RTC校准时钟、RTC闹钟脉冲或者秒脉冲
5、存储RTC时钟校准寄存器(可配合上面输出RTC校准时钟的功能对RTC时钟进行校准)
6、用户数据存储容量:20字节(中容量和小容量)/ 84字节(大容量和互联型)
BKP的基本结构
上图中的橙色部分位于后备区域,BKP和RTC都位于后备区域。后备区域供电的特性:当VDD主电源掉电时,切换至VBAT供电,当VDD上电时,供电由主电源VDD提供,这样可以节省VBAT备用电池的电量。
RTC简介
1、RTC(Real Time Clock)实时时钟
2、RTC是一个独立的定时器,可为系统提供时钟和日历的功能
3、RTC和时钟配置系统处于后备区域,系统复位时数据不清零,VDD(2.0~3.6V)断电后可借助VBAT(1.8~3.6V)供电继续走时
4、32位的可编程计数器,可对应Unix时间戳的秒计数器
5、20位的可编程预分频器,可适配不同频率的输入时钟
6、可选择三种RTC时钟源:
HSE时钟除以128(通常为8MHz/128)
LSE振荡器时钟(通常为32.768KHz)
LSI振荡器时钟(40KHz)
RTC的时钟大多是32.768kHz的原因
32.768kHz==32768Hz
32768=2^15,经过一个15位分频器的自然溢出,就可以得到1Hz的频率。
自然溢出:设计一个15位的计数器,该计数器没有计数目标,直接从0记到最大值32767,记满后自然溢出,这个信号就是1Hz的。没有计数目标,也不需要比较,可以简化电路设计。
RTC的框图
1、框图分为4个部分,上面是APB1总线读写部分(RTC是APB1总线上的设备),左边是核心的分频,计数计时部分,右边是中断输出使能和NVIC部分,下边是与PWR有关的部分(RTC的闹钟可以唤醒设备,退出待机状态),图中灰色部分在主电源VDD掉电后,可由VBAT维持供电,继续工作。
2、RTCCLK是RTC的时钟源选择,共有3中选择。
RTC_PRL寄存器的值是n就是n+1倍分频,比如n=6就是7分频。(n就是计数目标)
RTC_DIV计数器是一个自减计数器,来一个脉冲计数器减1,计数值减至0后再来一个脉冲溢出时由PRL重装载设定值。比如:DIV可以保持初始值为0,首次来一个脉冲,计数值溢出重载为32767,之后来一个脉冲减1,一直减至0,再来一个脉冲计数值重载,反复循环,详细看下图。两个秒脉冲的间隔就是32768个RTCCLK单位时间间隔。
3、当RTC_CNT和RTC_ALR的值相等时,这时就会产生RTC_Alarm信号,一路通向中断,可以在中断中执行一些操作,另一路通向待机部分,可以让单片机退出待机模式(WK_UP也可以使设备退出待机模式)。右边3个中断分别是秒中断,溢出中断和闹钟中断。F结尾的是中断标志位,IE结尾的是中断使能。
RTC的基本结构
RTC操作注意事项
1、执行以下操作将使能对BKP和RTC的访问:
设置RCC_APB1ENR的PWREN和BKPEN,使能PWR和BKP时钟
设置PWR_CR的DBP,使能对BKP和RTC的访问
2、若在读取RTC寄存器时,RTC的APB1接口曾经处于禁止状态,则软件首先必须等待RTC_CRL寄存器中的RSF位(寄存器同步标志)被硬件置1。(为保证RTC掉电继续工作,RTC的寄存器由RTCCLK驱动。故用APB1总线访问RTC寄存器时,有时钟不同步的问题(一个36M,一个大约32k),只有在RTCCLK来一个上升沿RTC寄存器的值才能同步到APB1总线上,等待RSF标志位置1后,实质上就是等待RTC寄存器的值同步到APB1总线上,再由APB1总线获取RTC的值)
3、必须设置RTC_CRL寄存器中的CNF位,使RTC进入配置模式后,才能写入RTC_PRL、RTC_CNT、RTC_ALR寄存器(使用库函数时,自动加上了该操作)
4、对RTC任何寄存器的写操作,都必须在前一次写操作结束后进行。可以通过查询RTC_CR寄存器中的RTOFF状态位,判断RTC寄存器是否处于更新中。仅当RTOFF状态位是1时,才可以写入RTC寄存器。(实质上还是由于时钟不同步的原因)