当前位置: 首页 > article >正文

【STM32(HAL库) RTC】(实时时钟)配置

1. RTC简介

RTC(Real-Time Clock) 是STM32内部的一个独立定时器,用于提供精确的日历和时间信息,即使在主电源关闭时(通过备用电池供电)仍可继续运行。其主要特性包括:

  • 支持年月日、时分秒的计时

  • 可编程的闹钟周期性唤醒功能

  • 独立供电域(由 VBAT 引脚供电)

  • 使用外部低速晶振(LSE,通常为32.768kHz)或内部低速RC振荡器(LSI,约32kHz)作为时钟源

2. RTC配置步骤(基于HAL库)
2.1 硬件配置
  • 连接外部32.768kHz晶振(LSE)到STM32的 OSC32_IN 和 OSC32_OUT 引脚。

  • 确保备用电池(VBAT)已连接(如CR2032纽扣电池)。

2.2 代码配置

以下为HAL库中的核心配置步骤:

(1) 初始化RTC时钟源
// 使能LSE时钟(外部低速晶振)
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSE;
RCC_OscInitStruct.LSEState = RCC_LSE_ON;  // 启用LSE
HAL_RCC_OscConfig(&RCC_OscInitStruct);

// 配置RTC时钟源为LSE
RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_RTC;
PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSE; // 选择LSE
HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);
(2) 初始化RTC
// 使能RTC时钟访问
__HAL_RCC_RTC_ENABLE();

// 配置RTC参数
RTC_TimeTypeDef sTime = {0};
RTC_DateTypeDef sDate = {0};

hrtc.Instance = RTC;  // RTC实例
hrtc.Init.HourFormat = RTC_HOURFORMAT_24;  // 24小时制
hrtc.Init.AsynchPrediv = 0x7F;    // 异步预分频(LSE为32768Hz时,设置为127)
hrtc.Init.SynchPrediv = 0xFF;     // 同步预分频(32768/(127+1)/(255+1) = 1Hz)
hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
HAL_RTC_Init(&hrtc);
(3) 设置初始时间和日期
// 设置时间(例如12:30:45)
sTime.Hours = 12;
sTime.Minutes = 30;
sTime.Seconds = 45;
HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN);

// 设置日期(例如2023年10月1日,星期日)
sDate.WeekDay = RTC_WEEKDAY_SUNDAY;  // 周日
sDate.Month = RTC_MONTH_OCTOBER;     // 10月
sDate.Date = 1;                      // 1号
sDate.Year = 23;                     // 2023年
HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN);
(4) 读取时间和日期
RTC_TimeTypeDef currentTime;
RTC_DateTypeDef currentDate;

// 读取当前时间
HAL_RTC_GetTime(&hrtc, &currentTime, RTC_FORMAT_BIN);
// 读取当前日期
HAL_RTC_GetDate(&hrtc, &currentDate, RTC_FORMAT_BIN);
3. 闹钟与唤醒配置

RTC支持闹钟中断和周期性唤醒(如每秒唤醒一次):

// 配置闹钟(在12:30:50触发)
RTC_AlarmTypeDef sAlarm = {0};
sAlarm.AlarmTime.Hours = 12;
sAlarm.AlarmTime.Minutes = 30;
sAlarm.AlarmTime.Seconds = 50;
sAlarm.AlarmMask = RTC_ALARMMASK_NONE;  // 不屏蔽任何字段
sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_NONE;
sAlarm.Alarm = RTC_ALARM_A;            // 使用Alarm A
HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN);

// 启用RTC全局中断
HAL_NVIC_SetPriority(RTC_Alarm_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(RTC_Alarm_IRQn);
4. 关键注意事项
  1. 写保护
    RTC寄存器默认有写保护,修改前需调用 HAL_RTC_WriteProtection_Disable(),修改后重新启用。

  2. 备份域访问
    RTC属于备份域,操作前需使能备份域时钟和访问权限:

    __HAL_RCC_PWR_CLK_ENABLE();
    HAL_PWR_EnableBkUpAccess();
  3. 晶振问题
    若LSE无法起振,检查硬件连接或尝试调整负载电容(通常需6pF)。

  4. 时间精度
    使用外部LSE时精度较高(约±5ppm),LSI精度较差(约±500ppm)。

5. 常见问题
  • Q:RTC时间不更新?
    A:检查LSE是否正常起振,或尝试使用LSI作为时钟源。

  • Q:断电后时间丢失?
    A:确保VBAT引脚已连接备用电池,且电池电压正常。

  • Q:HAL_RTC_Init()卡死?
    A:可能未正确关闭写保护,或时钟源配置错误。


通过以上配置,您可以在STM32中实现精确的实时时钟功能,适用于数据记录、定时任务等场景。


http://www.kler.cn/a/567684.html

相关文章:

  • 【力扣】2619. 数组原型对象的最后一个元素——认识原型与原型链
  • java23种设计模式-观察者模式
  • OpenHarmony应用间跳转
  • 在docker中运行R容器,并在Windows下的vscode中使用该R
  • 卷积神经网络(Convolutional Neural Network,CNN)详细解释(带示例)
  • nexus如何上传自己的依赖包
  • 工程化与框架系列(12)--响应式框架原理
  • 16.2 LangChain 表达式语言设计哲学:重新定义大模型应用开发范式
  • 4.3MISC流量分析练习-wireshark-https
  • 哈工大信息管理与信息系统本科,有C++和Python基础,如何选择就业方向?
  • taoCMS v3.0.2 任意文件读取漏洞(CVE-2022-23316)
  • 如何保证 Redis 缓存和数据库的一致性?
  • Vue3:Vue Router的学习(四)
  • 民安智库:物业满意度调查的数据分析经验分享
  • 011 rocketmq过滤消息
  • JavaWeb——HTML
  • 工程化与框架系列(13)--虚拟DOM实现
  • XML 编辑器:全面指南与最佳实践
  • 基于vue3和spring boot实现大文件上传
  • 20250225-代码笔记03-class CVRPModel AND other class