12.1 概述
实时时钟Real TimeClock(简称RTC),实时时钟芯片是日常生活中应用最为广泛的消费类电子产品之一。它为人们提供精确的实时时间,或者为电子系统提供精确的时间基准,目前实时时钟芯片大多采用精度较高的晶体振荡器作为时钟源。有些时钟芯片为了在主电源掉电时,还可以工作,需要外加电池供电。
现在的ARM体系处理器基本都会内置RTC模块,STM32也不例外。STM32内部RTC结构如下图所示。
RTC主要有两个部分组成,第一部分的APB1接口用来和APB1总线相连,此单元还包含一组16位寄存器,可通过APB1总线对其进行读写操作。另一部分由一组可编程计数器组成,分成两个主要模块。第一个模块是RTC的预分频模块,它可编程产生最长为1秒的RTC时间基准TR_CLK。RTC的预分频模块包含了一个20位的可编程分频器。如果在RTC_CR寄存器中设置了相应的允许位,则在每个TR_CLK周期中RTC产生一个中断。第二个模块是一个32位的可编程计数器,可被初始化为当前的系统时间。系统时间按TR_CLK周期累加并与存储在RTC_ALR寄存器中的可编程时间相比较,如果RTC_CR控制寄存器中设置了相应允许位,比较匹配时将产生一个闹钟中断。
RTC模块和时钟配置系统是在后备区域,即在系统复位或从待机模式唤醒后RTC的设置和时间维持不变。但是在系统复位后,会自动禁止访问后备寄存器和RTC,以防止对后备区域的意外写操作。所以在要设置时间之前,先要取消备份区域写保护。
12.2 相关寄存器
12.2.1 控制寄存器1:RTC_CRH
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
- | OWIE | ALRIE | SECIE |
Bit 2:允许溢出中断位
0:屏蔽溢出中断
1:允许溢出中断
Bit 1:允许闹钟中断
0:屏蔽闹钟中断
1:允许闹钟中断
Bit 0:允许秒中断
0:屏蔽秒中断
1:允许秒中断
12.2.2 控制寄存器2:RTC_CRL
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
- | RTOFF | CNF | RSF | OWF | ALRF | SECF |
Bit 5:RTC操作关闭
0:写操作未完成
1:操作已完成
Bit 4:配置标志
0:退出配置模式
1:进入配置模式
Bit 3:RTC同步标志
RTC_CNT寄存器和RTC_DIV寄存器由软件更新或清0时,此位由硬件置1。在APB1复位后,或APB1时钟停止后,此位必须由软件清0。要进行任何的读操作之前,用户程序必须等待这位被硬件置1
0:寄存器尚未被同步
1:寄存器已经被同步
Bit 2:溢出标志
当32位可编程计数器溢出时,此位由硬件置1。此位只能由软件清0
0:无溢出
1:32位可编程计数器溢出
Bit 1:闹钟标志
当32位可编程计数器达到RTC_ALR寄存器所设置的预定值,此位由硬件置1。此位只能由软件清0。
0:无闹钟
1:有闹钟
Bit 0:秒标志
当32位可编程预分频器溢出时,此位由硬件置1,同时RTC计数器加1。此位只能由软件清除。
0:秒标志条件不成立
1:秒标志条件成立
12.2.3 预分频装载寄存器1:RTC_PRLH
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
- | PRL[19:16] |
Bit 3~Bit 0:RTC预分频装载值高位
12.2.4 预分频装载寄存器2:RTC_PRLL
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
PRL[15:0] |
Bit 15~Bit 0:RTC预分频装载值低位
注:RTC时钟频率根据预分频寄存器的值有如下计算公式。
其中RTCCLK代表的RTC的输入时钟,一般默认32.768kHz。
12.3 实验例程
功能:读取RTC的日期显示在LCD上面。
(1)创建rtc.h文件输入以下代码。
/*********************************************************************************************************
RTC 驱 动 文 件
*********************************************************************************************************/
#ifndef _RTC_H_
#define _RTC_H_
#include "sys.h"
/*********************************************************************************************************
数 据 结 构
*********************************************************************************************************/
typedef struct
{
u8 year; //年
u8 month; //月
u8 date; //日
u8 hour; //时
u8 minute; //分
u8 second; //秒
}RTC_Data;
extern RTC_Data RTC_Time;
/*********************************************************************************************************
函 数 列 表
*********************************************************************************************************/
void RTC_Init( void ) ; //RTC初始化
void RTC_Set_Time( u8 year, u8 month, u8 date, u8 hour, u8 minute, u8 second ) ; //设置时间
void RTC_Get_Time( void ) ; //获取时间
#endif