1. RTC基础配置与时间读取

RTC基础配置与时间读取 学习卡片

任务说明

本案例基于STM32L0系列MCU(以STM32L071为例),完成内部RTC模块的基础配置:设置初始时间(2026年1月1日 00:00:00),随后读取当前RTC时间并通过串口打印。目标是通过串口输出确认RTC走时正确,为后续低功耗与看门狗联动案例提供时间基准。

硬件连接

STM32L071 LQFP48 PA9 (USART1_TX) PA10 (USART1_RX) PC14 (OSC32_IN) PC15 (OSC32_OUT) VDD / VSS 32.768 kHz 晶振 + 2×6.8pF PC14 PC15 USB-TTL CH340 RX TX GND PA9→RX PA10→TX 3.3V 电源 VDD→3.3V GND 共地 PC 串口助手 115200-8-N-1

代码实现

使用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(),否则日期可能不更新。

验证方法

操作步骤:

  1. 按上述电路连接硬件,编译并烧录程序。
  2. 打开PC串口助手,配置115200-8-N-1。
  3. 观察串口输出,应首先看到初始化提示,随后每秒打印一次当前时间。

判定标准:

  • 串口首行输出: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波形)。