一、什么是 RTC?
RTC,即实时时钟,是一个独立于主系统时钟的计时器模块。它的主要功能是保持当前时间和日期,即使在系统断电的情况下,只要有备用电源供电,RTC 也能继续工作。RTC 模块通过一个连续计数的计数器来记录时间,提供年、月、日、小时、分钟和秒的计时功能。
RTC 的工作原理
RTC 的核心是一个32位的计数器,支持二进码十进数(BCD)格式,能够记录秒、分钟、小时(支持 12 小时或 24 小时制)、星期几、日期、月份和年份。此外,RTC 还能够处理月份的天数,包括闰年。为了提供更高的精度,RTC 还可以记录亚秒值。系统可以通过修改 RTC 的计数器来设置当前时间。
低功耗和独立运行
RTC 模块的一个显著特点是低功耗运行。在主系统掉电后,只要备用电源(通常是电池或超级电容)仍在供电,RTC 就能继续计时。这使得 RTC 成为实现低功耗应用的理想选择,例如在待机模式下的定时唤醒功能。
RTC 在 STM32 中的实现
STM32 微控制器内置了 RTC 模块,通常通过低速外部晶振(LSE,32.768 kHz)驱动,提供高精度的时间信息。RTC 模块的时钟源可以通过多种方式配置,包括 HSE 分频时钟、LSI 振荡器时钟和 LSE 振荡器时钟。
RTC 的配置
在 STM32 中配置 RTC 通常通过 ST 提供的 CubeMX 工具来完成。配置步骤包括:
-
选择时钟源:通常选择 LSE 作为时钟源,因为其稳定性和低功耗特性。
-
设置时间和日期:初始化 RTC 的时间和日期寄存器,选择 12 小时或 24 小时制。
-
配置中断:RTC 提供三种可屏蔽中断:闹钟中断、秒中断和溢出中断。可以根据应用需求进行配置。
-
启用备用电源:确保在系统掉电时,RTC 模块仍能通过备用电源保持运行。
RTC 的应用
RTC 在嵌入式系统中有广泛的应用,包括:
- 定时唤醒:在低功耗应用中,RTC 可以配置为定时唤醒系统执行任务。
- 时间戳记录:RTC 提供的精确时间戳在数据记录和日志管理中非常有用。
- 时间同步:多个系统之间的时间同步可以通过 RTC 实现,确保事件的顺序性和一致性。
二、CubeMX配置
SYS 打开调试
RCC配置 选择外部高速低速晶振
RTC配置
- Activate Clock Source 激活时钟源
- Activate calendar激活日历
-
RTC_OUT: Not RTC_OUT
Tamper:
第一个是是否使能 tamper(PC13)引脚上输出校正的秒脉冲时钟,第二个: RTC入侵检测校验功能
RTC校验功能,使能侵入检测功能。RTC时钟经64分频输出到侵入检测引脚TAMPER上
当 TAMPER引脚上的信号从 0变成1或者从 1变成 0(取决于备份控制寄存器BKP_CR的 TPAL位),会产生一个侵入检测事件。侵入检测事件将所有数据备份寄存器内容清除。 - RTC全局中断RTC_IRQHandler()
- 闹钟中断函数RTCAlarm_IRQHandler()
日期时间配置
使能串口3选择异步通信
配置时钟树
生成工程
三、Keil代码
main.c
串口重定向
#include "stdio.h"
int fputc(int ch,FILE *f)
{
HAL_UART_Transmit(&huart3,(uint8_t*)&ch,1,0xFFFF);
return ch;
}
定义结构体获取日期和时间
RTC_DateTypeDef GetData; //获取日期结构体
RTC_TimeTypeDef GetTime; //获取时间结构体
while循环打印
/* 获取当前实时时间 */
HAL_RTC_GetTime(&hrtc, &GetTime, RTC_FORMAT_BIN);
/* 获取当前实时日期 */
HAL_RTC_GetDate(&hrtc, &GetData, RTC_FORMAT_BIN);
/* 显示日期格式 : yy/mm/dd */
printf("%02d/%02d/%02d\r\n",2000 + GetData.Year, GetData.Month, GetData.Date);
/* 显示时间格式 : hh:mm:ss */
printf("%02d:%02d:%02d\r\n",GetTime.Hours, GetTime.Minutes, GetTime.Seconds);
printf("\r\n");
HAL_Delay(100);//100ms