STM32 RTC实时时钟详解与HAL库实战教程

摘要:本文深入讲解STM32的RTC(Real-Time Clock)模块,涵盖原理分析、CubeMX配置、HAL库编程实现,并提供完整的闹钟设置与时间校准例程代码。通过本文,您将掌握RTC在低功耗场景下的核心应用技巧。


1. RTC模块概述

RTC(实时时钟)是STM32内部独立运行的定时器模块,主要特点:

  • 独立供电:通过VBAT引脚连接备用电池(3V纽扣电池)

  • 32位计数器:可记录秒级时间(配合预分频器)

  • 闹钟中断:支持多种唤醒事件

  • 日历功能:自动处理月、年、闰年计算

  • 低功耗:在待机模式下仍可运行


2. 硬件设计要点

2.1 硬件连接

  • VBAT引脚:连接3V纽扣电池(CR2032)

  • 32.768kHz晶振:建议外接低速晶振(LSE)

  • 备用电源电路

    复制代码
    VDD -> 3.3V主电源
    VBAT -> 电池正极
    GND -> 共地

3. CubeMX配置步骤

3.1 时钟配置

  1. 激活RTC时钟源:LSE(外部低速晶振)

  2. 启用日历功能

  3. 配置预分频器:

    • Asynchronous Prescaler: 127

    • Synchronous Prescaler: 255

      (得到1Hz时钟:(32768/(127+1)*(255+1)) = 1Hz)

3.2 NVIC设置

  • 使能RTC全局中断

  • 使能闹钟中断(Alarm A)


4. HAL库代码实现

4.1 RTC初始化

复制代码
void MX_RTC_Init(void)
{
  RTC_TimeTypeDef sTime = {0};
  RTC_DateTypeDef sDate = {0};

  hrtc.Instance = RTC;
  hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
  hrtc.Init.AsynchPrediv = 127;
  hrtc.Init.SynchPrediv = 255;
  hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
  hrtc.Init.OutPutPolar = RTC_OUTPUT_POLARITY_HIGH;
  HAL_RTC_Init(&hrtc);

  // 设置初始时间
  sTime.Hours = 12;
  sTime.Minutes = 0;
  sTime.Seconds = 0;
  HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN);

  // 设置初始日期
  sDate.WeekDay = RTC_WEEKDAY_MONDAY;
  sDate.Month = RTC_MONTH_JANUARY;
  sDate.Date = 1;
  sDate.Year = 24; // 2024年
  HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN);
}

4.2 读取当前时间

复制代码
void Get_TimeDate(RTC_TimeTypeDef *sTime, RTC_DateTypeDef *sDate)
{
  HAL_RTC_GetTime(&hrtc, sTime, RTC_FORMAT_BIN);
  HAL_RTC_GetDate(&hrtc, sDate, RTC_FORMAT_BIN);
}

4.3 设置闹钟(30秒后触发)

复制代码
void Set_Alarm(void)
{
  RTC_AlarmTypeDef sAlarm = {0};
  
  sAlarm.AlarmTime.Hours = 0;
  sAlarm.AlarmTime.Minutes = 0;
  sAlarm.AlarmTime.Seconds = 30; // 30秒后触发
  sAlarm.AlarmMask = RTC_ALARMMASK_NONE;
  sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_NONE;
  sAlarm.Alarm = RTC_ALARM_A;
  HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN);
}

4.4 中断回调函数

复制代码
void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
{
  HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); // 翻转LED
  Set_Alarm(); // 重新设置下一次闹钟
}

5. 关键API说明

函数 功能描述
HAL_RTC_SetTime() 设置RTC当前时间
HAL_RTC_GetTime() 读取当前时间
HAL_RTC_SetAlarm_IT() 设置带中断的闹钟
HAL_RTCEx_SetWakeUpTimer() 配置唤醒定时器

6. 常见问题排查

  1. RTC不保存时间

    • 检查VBAT电池连接

    • 确认RTC时钟源配置正确

  2. 时间误差较大

    • 校准LSE晶振负载电容

    • 使用更高精度的温补晶振

  3. 闹钟不触发

    • 检查NVIC中断使能状态

    • 确认未屏蔽AlarmMask


通过本教程,您应该能够快速掌握STM32 RTC模块的核心应用技巧。在实际项目中,建议结合备份寄存器(BKP)实现关键数据的掉电保存功能。

相关推荐
FakeOccupational9 小时前
【电路笔记 STM32】Cortex-M7 内核上的数据缓存(D-Cache)结构+MPU+DMA&Cache+STM32CubeMX配置
笔记·stm32·缓存
殷忆枫10 小时前
基于K210与STM32的智能垃圾分类与物联网监管系统
stm32·物联网·分类
周洲083010 小时前
STM32 GPIO 外部中断深度解析:边沿触发 / 电平触发、NVIC 优先级配置、中断嵌套实战
stm32·单片机·嵌入式硬件
LCG元10 小时前
STM32F103 CAN 总线通信实战:标准库双机通信与过滤器配置精讲
stm32·单片机·嵌入式硬件
zlinear数据采集卡11 小时前
D223的PWM电机控制:6路独立脉冲+加减速算法深度解析
arm开发·stm32·嵌入式硬件·算法·fpga开发·架构
z203483152012 小时前
STM32单片机控制无源蜂鸣器播放《晴天》
stm32·单片机·嵌入式硬件
国科安芯14 小时前
详解ADC 规则组外部触发:CH2、CH3 与 TRGO2
运维·网络·单片机·嵌入式硬件·mcu·系统架构
ACP广源盛1392462567314 小时前
WAIC2026 国产算力浪潮@ACP#YLB3118 在算力矩阵中的存储定位与落地场景
大数据·人工智能·分布式·单片机·嵌入式硬件
Dr.kangder15 小时前
嵌入式面试总结(十四)——中断处理
单片机·面试·职场和发展·架构·硬件架构·嵌入式
振南的单片机世界15 小时前
硬核菊花链:3个GPIO+无限74HC595=端口扩展“无限套娃”
arm开发·stm32·单片机·嵌入式硬件