RTC时钟
RTC时钟模块和RCC时钟控制器
RTC(Real-Time Clock)实时时钟:
RTC 实时时钟是一个独立的定时器,一般拿来做时钟和日历。
RTC 处在BKP区(后备区域),可实现VDD断电后,备用电源VBAT供电,数据不丢失。
RTC 本身是个定时器,可以配置成特定时间产生中断,或者产生事件唤醒MCU。
RTC和时钟配置系统处于后备区域,系统复位时数据不清零,VDD(2.0~3.6V)断电后可借助VBAT(1.8~3.6V)供电继续走时。
RTC具有
32位 的 计数器,可对应Unix时间戳的秒计数器。
20位 的 预分频器,可适配不同频率的输入时钟。
系统复位后,禁止访问BKP。所以设置RTC的寄存器之前, 先要取消BKP写保护。
系统VDD上电前,RTC 依靠LSI内部晶振提供时钟,上电后,依靠LSE外部晶振提供时钟。
虽然 RTC 挂载在APB1总线上,由APB1总线控制使能,但是RTC没有使用APB1提供的时钟源,而是使用 LSI 或者 LSE。同时需要通过总线访问RTC的寄存器。
且LSE晶振需要配合起振电容(负载电容)来确保晶振能够正常启动和稳定工作。
起振电容的作用:震荡频率,调整负载电容、帮助快速启动。
RCC(Reset and Clock Control)时钟控制器:
RCC,复位和时钟控制模块。RCC用于系统时钟和各种外设时钟的启用和时钟源配置。
RCC的时钟来源包括HSE、LSE、HSI、LSI、PLL等。
HSE(16MHz)、LSE(32.768KHz)、HSI(8MHz)、LSI(40KHz)
此处PLL锁相环的作用是倍频,对于STM32来说,其系统时钟不超过72MHz;而时钟源的时钟频率最多也就16MHz,无法达到芯片的要求,此时就需要倍频器将外部时钟频率进行倍频,再传给系统时钟;
RCC_CFGR可配置PLL的倍频系数、输入时钟源、PLL预分频器的分频因子。
STM32 的系统时钟 SYSCLK 为整个芯片提供时序信号。系统时钟信号来源分别为:HSE、HSI以及经过分频器的输出信号;AHB、APB1、APB2、内核时钟等时钟通过系统时钟分频得到。
RCC的备份区域控制寄存器BDCR
RCC时钟源的选择及是能设置都是通过备份控制寄存器BDCR实现的,,所以我们在 RTC 操作之前先要通过这个寄存器选择 RTC 的时钟源。
RTC相关寄存器
RTC 内核完全独立于 RTC APB1 接口,而软件是通过 APB1 接口访问 RTC 的预分频值、计
数器值和闹钟值的。读取RTC寄存器必须等待 CRL 寄存器的寄存器同步标志位RSF被硬件置 1。
注意,STM32F4的RTC寄存器和F1的有区别。这里只讲F1
控制寄存器 CRH、CRL
RTC 总共有 2 个控制寄存器 CRH 和 CRL,两个都是 16 位的。
CRH 的低 3 位分别是溢出中断、闹钟中断、秒中断的中断使能。
CRL 的低 6 位分别是 操作完成(last task off)、配置模式、寄存器同步的标志位和溢出、闹钟、秒中断的中断标志位。
溢出中断:CNT溢出
闹钟中断:CNT达到ALR寄存器设定值。
闹钟中断可以在RTC_ITConfig(RTC_IT_ALR, ENABLE);使能并在RTC_IRQHandler中读取闹钟中断的标志位来执行内部中断。也可以通过EXTI线17触发EXTI4中断服务函数(EXTI虽然有16个中断线,但只有7个中断服务函数)(PVD也可走外部中断EXTI3线)
秒中断:预分频装载寄存器PRL溢出时,秒中断产生,CNT加1。
RTC 内核完全独立于 APB1 接口,而软件需要通过 APB1 接口访问 RTC 的寄存器。但是RTC相关寄存器只在 APB1 时钟进行重新同步的 时钟上升沿 被更新。因此,读取RTC寄存器必须等待 CRL 寄存器的 寄存器同步标志位RSF 被硬件置 1。
预分频装载寄存器PRLH、PRLL
PRLH低4位存放预分频值的19~16位,PRLL存放前15~0位。
共20位的预分频值PRL。
一般RTC时钟源配置为LSE=32.768KHz的情况下,PRL配置为32767,该寄存器自减,用来保存还需要多少时钟周期获得一个秒信号。在一次秒钟更新后,由硬件重新装载。
预分频余数寄存器DIVH、DIVL
预分频余数寄存器用来获得比秒钟更为准确的时钟,如0.1s、0.01s。比如0.1s就把DIV设置成10,DIV溢出PRL-1。
该寄存器自减,溢出后PRL-1。同样是共20位的预分频值DIV。
计数器CNTH、CNTL
该寄存器由 2 个 16 位的寄存器组成 RTC_CNTH 和 RTC_CNTL,总共 32 位,一般用来记录秒钟值。注意修改这个寄存器时要先进入配置模式。
闹钟寄存器ALRH、ALRL
该寄存器也是由 2 个 16 为的寄存器组成 RTC_ALRH 和 RTC_ALRL。总共也是 32 位,如果 RTC_CNT 的值与 RTC_ALR 的值相等,并使能了中断的话,会产生一个闹钟中断。该寄存器的修改也要进入配置模式才能进行。
时间戳
Unix时间戳介绍
Unix时间戳以秒为单位从1970年1月1日00:00:00 UTC(协调世界时间)开始计算。这个时间点被称为“Unix纪元”(Unix Epoch)。Unix时间戳表示从这个起始时间点到指定时间点的秒数。Unix时间戳与时区无关。无论在世界的哪个地方,Unix时间戳都是相同的。
UTC/GMT
UTC格林尼治时间(协调世界时)和GMT格林威治时间
精确度:UTC比GMT更精确,因为UTC基于原子时并定期调整以对齐地球自转,而GMT基于天文学的平均太阳时间。
调整:UTC会根据需要添加闰秒,而GMT不做这样的调整。
C语言time.h
注意C语言标准库提供的时间是从1900开始计算的
time_t time(time_t*); | 获取系统时钟 |
struct tm* localtime(const time_t*); | 秒计数器转换为日期时间(当地时间) |
BKP备份寄存器
BKP备份寄存器是 42 个 16 位的寄存器。使用备份寄存器其实就是向BKP_DR写数据。
备份寄存器处在备份域里,当 VDD 电源被切断,他们仍然由 VBAT 维持供电。即使系统在待机模式下被唤醒,或系统复位或电源复位时,他们也不会被复位。此外,BKP 控制寄存器用来管理侵入检测和 RTC 校准功能。一般用 BKP 来存储 RTC 的校验值或者记录一些重要的数据。
复位后,对备份寄存器和 RTC 的访问被禁止,并且备份域被保护以防止可能存在的意外的写操作。执行以下操作可以使能对备份寄存器和 RTC 的访问:
1)通过APB1外设时钟使能寄存器 RCC_APB1ENR 的 打开电源和后备区域的时钟
2)PWR_CR 来对 BKP 和 RTC 使能访问权限。
PWR_BackupAccessCmd()使能备份寄存器访问使能,设置PWR_CR的DPB位,失能写保护,Disable Protect Backup
PWR
PWR(Power Control)电源控制
PWR负责管理STM32内部的电源供电部分,可以实现可编程电压监测器和低功耗模式的功能
可编程电压监测器(PVD)可以监控VDD电源电压,当VDD下降到PVD阀值以下或上升到PVD阀值之上时(边沿触发),PVD会触发外部中断PVD,用于执行紧急关闭任务
低功耗模式包括睡眠模式(Sleep)、停机模式(Stop)和待机模式(Standby),可在系统空闲时,降低STM32的功耗,延长设备使用时间
整个PWR可以分为3部分,后备供电区、电压调节器(1.2V区域)、VDD供电区
后备供电区将备用电源连接到 VBAT 引脚上,当 VDD 断电,可用来保持 BKP 的内容和 RTC 的功能。同时 VBAT 也为 SRAM 和 LSE 振荡器供电。
电压调节器为备份域和待机电路以外的所有数字电路供电。电压调节区输出电压约为1.2V,有两个外部电容连接到专用引脚 Vcap1 和 Vcap2。激活电压调节器就将这俩专用引脚接到 VDD/VSS。电压调节器有运转、停止、待机三种模式。运转模式下,电压调节器为内核、内存、外设供电;停止模式下,为备份域和SRAM供电;待机模式下,仅为备份域供电。
VDD供电区指的是参考电压和A/D转换器的独立电源。
主要寄存器
控制寄存器 CR:
用来设置低功耗睡眠、低功耗运行模式,使能备份域写保护,清除待机标志,使能PVD,设置PVD阈值电平
控制状态寄存器 CSR:
用来指示唤醒事件状态、待机状态、启用唤醒引脚
**睡眠模式**不需要启用 `RCC_APB1Periph_PWR` 时钟,因为它不涉及到电源管理的复杂操作,只是将处理器置于低功耗状态。
而**停止模式**和**待机模式**涉及到更复杂的电源管理,需要启用 PWR 时钟来正确配置和管理这些模式下的电源状态。
上电复位POR/掉电复位PDR:VDD小于阈值POR/PDR时,触发复位信号
欠压复位BOR:VDD小于阈值时复位
可编程电压检测器PVD :PVD可以指定阈值,并设置大于或小于触发外部中断。EXTI3。
低功耗模式
低功耗模式包括睡眠、停机、待机三种情况。
睡眠模式,CPU时钟关闭,其他时钟和ADC时钟开着。可设置WFI/WFE,由任一中断/事件唤醒。
停机模式,所有时钟关闭。VDD保持供电,所以寄存器和内存信息可以保留。停止模式下,如果电压调节器关了,会有一段启动延时,如果PWR停机模式下电压调节器开着启动延时会变短。可有WFI/WFE唤醒。
待机模式,在内核深睡眠模式下关闭电压调节器,可以进入待机模式。除备份域(RTC寄存器,RTC备份寄存器,备份SRAM)和待机电路中的寄存器外,SRAM 和其他寄存器内容都将丢失。退出待机模式可以用WKUP引脚的上升沿、RTC闹钟事件外部中断引脚上升沿、复位引脚、IWDG复位。
待机模式功耗最低。