1. RTC基础配置与时间读取
任务说明
本案例基于STM32L0系列MCU(以STM32L071为例),完成内部RTC模块的基础配置:设置初始时间(2026年1月1日 00:00:00),随后读取当前RTC时间并通过串口打印。目标是通过串口输出确认RTC走时正确,为后续低功耗与看门狗联动案例提供时间基准。
硬件连接
代码实现
使用STM32CubeIDE + HAL库,完整代码如下:
// main.c 核心代码(已省略芯片初始化部分)
#include "stm32l0xx_hal.h"
RTC_HandleTypeDef hrtc;
// 串口发送字符串
void UART_Print(const char* str) {
HAL_UART_Transmit(&huart1, (uint8_t*)str, strlen(str), 1000);
}
// RTC初始化:设置初始时间 2026-01-01 00:00:00
void RTC_Init(void) {
__HAL_RCC_RTC_ENABLE();
hrtc.Instance = RTC;
hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
hrtc.Init.AsynchPrediv = 127; // 异步分频
hrtc.Init.SynchPrediv = 255; // 同步分频,得到1Hz
hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;
HAL_RTC_Init(&hrtc);
// 设置初始时间
RTC_DateTypeDef sDate = {0};
RTC_TimeTypeDef sTime = {0};
sDate.Year = 26; // 2026年
sDate.Month = 1;
sDate.Date = 1;
sDate.WeekDay = 4; // 2026-01-01 是周四
sTime.Hours = 0;
sTime.Minutes = 0;
sTime.Seconds = 0;
sTime.TimeFormat = RTC_HOURFORMAT24;
sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
sTime.StoreOperation = RTC_STOREOPERATION_RESET;
HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN);
HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN);
}
// 读取并打印当前时间
void RTC_PrintTime(void) {
RTC_DateTypeDef sDate = {0};
RTC_TimeTypeDef sTime = {0};
char buf[64];
HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BIN);
HAL_RTC_GetDate(&hrtc, &sDate, RTC_FORMAT_BIN);
sprintf(buf, "20%02d-%02d-%02d %02d:%02d:%02d\r\n",
sDate.Year, sDate.Month, sDate.Date,
sTime.Hours, sTime.Minutes, sTime.Seconds);
UART_Print(buf);
}
int main(void) {
HAL_Init();
SystemClock_Config(); // 配置系统时钟(默认MSI 2.1MHz)
MX_GPIO_Init();
MX_USART1_UART_Init(); // 115200-8-N-1
RTC_Init();
UART_Print("RTC initialized: 2026-01-01 00:00:00\r\n");
while (1) {
RTC_PrintTime(); // 每秒打印一次
HAL_Delay(1000);
}
}
关键配置说明
- 时钟源:RTC使用外部32.768kHz晶振(LSE),经异步127分频+同步255分频后得到1Hz计数时钟。
- 时间格式:使用BCD格式存储,但HAL库的
RTC_FORMAT_BIN参数自动完成二进制与BCD转换。 - 读取顺序:必须先调用
HAL_RTC_GetTime()再调用HAL_RTC_GetDate(),否则日期可能不更新。
验证方法
操作步骤:
- 按上述电路连接硬件,编译并烧录程序。
- 打开PC串口助手,配置115200-8-N-1。
- 观察串口输出,应首先看到初始化提示,随后每秒打印一次当前时间。
判定标准:
- 串口首行输出:
RTC initialized: 2026-01-01 00:00:00 - 后续每秒输出时间递增1秒,格式为
2026-01-01 00:00:01、00:00:02…… - 等待至少60秒,确认分钟进位正确;等待1小时后确认小时进位正确。
- 断电重启后,若VBAT引脚接有备用电池,时间应保持;若无备用电池,时间复位为初始值属正常现象。
预期输出示例(与代码逻辑严格一致):
RTC initialized: 2026-01-01 00:00:00
2026-01-01 00:00:01
2026-01-01 00:00:02
2026-01-01 00:00:03
...
若串口无输出,请检查USART1引脚连接、波特率设置以及晶振是否起振(可用示波器测量PC14引脚应有32.768kHz波形)。