【电路笔记 STM32】RTC配置:晶振选择+闹钟Configuration+中断设置

本文详细讲解STM32 RTC模块的CubeMX配置流程,涵盖LSE/LSE晶振选择、闹钟A/B的严格/宽松匹配模式(含Alarm Mask与Date/Week Day Sel)、中断路由与引脚冲突处理;重点解析RTC校准机制,包括32秒周期下的CALP/CALM精密数字校准原理、ppm级频率补偿计算,以及温度漂移应对策略和外部高精度时钟替代方案。

  • STM32 的 RTC 是一个 独立于 CPU 主时钟的硬件计数器,它由自己的时钟源驱动,通常是 LSE 32.768kHz 晶振或 LSI。148 只要备份域有供电,RTC 就会一直计数,不会因为 CPU 在跑其他代码、处理串口中断、DMA 中断而停止。

CUBEMX RTC配置

晶振选择

在这里插入图片描述

板子情况推荐选择
板上有 32.768kHz 无源晶振Crystal/Ceramic Resonator
板上有 32.768kHz 有源时钟输出BYPASS Clock Source
没有低速外部时钟,只想凑合跑Disable,然后 RTC 用 LSI内部时钟
时钟源特点适用场景
LSE 32.768 kHz精度高、功耗低,典型 ±20 ppm需要长期可靠计时的首选
LSI 内部 RC温漂大,可能 ±1% 甚至更大只适合低成本或看门狗类应用
HSE 分频精度高,但主电掉电后无法维持不断电、对功耗不敏感时可用

RTC配置

在这里插入图片描述

闹钟Configuration

在这里插入图片描述

配置项作用触发方式
Alarm A闹钟A,可精确到年月日时分秒/星期,靠 Alarm Mask 决定比较哪些字段日历时间匹配时触发 ALRAF
Alarm B闹钟B,功能与A类似,可与A独立设置,实现两个不同闹钟日历时间匹配时触发 ALRBF
WakeUp周期唤醒计数器,按 WakeUpClock(如1Hz、ck_spre/16等)和 WakeUpCounter 计数计数到0触发 WUTF,可周期唤醒
  • 三个选项的含义
选项含义典型用途注意事项
Disable不启用该功能,不产生事件也不输出不用闹钟或不用周期唤醒对应功能的中断不会触发
Internal Alarm / Internal WakeUp事件只在芯片内部使用,通过中断(EXTI 线17/RTC_Alarm、RTC_WKUP)通知 CPU低功耗定时唤醒 MCU、内部定时任务需在 NVIC 打开对应中断,并写 HAL 回调
Routed to OUT / Routed to AF1把事件路由到 RTC 复用输出引脚(常见 PC13,部分型号有 RTC_AF2/PI8、PB2 等)驱动外部电路、唤醒外部芯片、给外部提供脉冲会占用该引脚,且多数芯片 AF1 只有一个,被占用后其他功能该选项会变灰

配置Internal Alarm

基础设置

在这里插入图片描述

闹钟设置

在这里插入图片描述

闹钟时间格式
  • 假设要表示时间:13点59分
格式数值显示(十六进制)说明
Binary (二进制)小时:0x0D 分钟:0x3B0x0D = 13, 0x3B = 59。需要转换才能看懂。
BCD (二-十进制)小时:0x13 分钟:0x590x13 看起来就是13,0x59 看起来就是59。所见即所得。
Alarm Mask Date Week Day

Alarm Mask Date Week Day 是一个全局屏蔽开关,用于控制“日期/星期”这一层是否参与闹钟匹配。

  • Disable(不屏蔽 / 严格匹配): 开启日期/星期的比较。必须同时满足你设定的“几号”或者“星期几”,闹钟才会响。此时,在 Alarm Date Week Day Sel 中选择 Date 或 Week Day 的设定才会生效。
  • Enable(屏蔽 / 忽略):完全跳过日期和星期的比较。 无论今天是几月几号、是星期几,只要时间(时、分、秒)对上,闹钟就会触发。每天闹钟。
Alarm Date Week Day Sel

Alarm Date Week Day Sel 是 RTC 闹钟的“日期匹配模式选择”,决定闹钟按“几号”还是“星期几”触发;但如果 Alarm Mask Date Week Day 设为 Enable,这一项会被完全屏蔽而不参与比较。

它有两个可选值:

选项含义Alarm Date Week Day 填什么
Date按“每月几号”匹配填 1~31,表示每月第几天
Week Day按“星期几”匹配填 **17**,表示周一周日

在这里插入图片描述

中断设置
  • 选 Routed to OUT 后,还要在 Configuration 里确认 Output Polarity(输出极性) 和 Output Type(推挽/开漏),否则外部可能看不到预期电平跳变。
  • 一般,输出引脚默认是 PC13,如果 PC13 被用作 Tamper 或按键,会冲突。
  • 闹钟A/B 常共用一个中断向量,需要在回调里判断是 A 还是 B 触发。
    在这里插入图片描述
  • 经过以上配置之后,直接生成代码,在中断函数中进行相关代码编写即可:
void RTC_Alarm_IRQHandler(void)
{
  /* USER CODE BEGIN RTC_Alarm_IRQn 0 */

  /* USER CODE END RTC_Alarm_IRQn 0 */
  HAL_RTC_AlarmIRQHandler(&hrtc);
  /* USER CODE BEGIN RTC_Alarm_IRQn 1 */

  /* USER CODE END RTC_Alarm_IRQn 1 */
}
  • 示例代码:
/* USER CODE BEGIN 1 */
RTC_TimeTypeDef sTime = {0};
RTC_DateTypeDef sDate = {0};
void RTC_GetCurrentTime(RTC_TimeTypeDef *pTime, RTC_DateTypeDef *pDate)
{
    /* 必须先读 Time,再Date */
    HAL_RTC_GetTime(&hrtc, pTime, RTC_FORMAT_BIN);
    HAL_RTC_GetDate(&hrtc, pDate, RTC_FORMAT_BIN);
}
/* USER CODE END 1 */

void RTC_Alarm_IRQHandler(void)
{
  /* USER CODE BEGIN RTC_Alarm_IRQn 0 */
	RTC_GetCurrentTime(&sTime, &sDate);
  /* USER CODE END RTC_Alarm_IRQn 0 */
    HAL_RTC_AlarmIRQHandler(&hrtc);
  /* USER CODE BEGIN RTC_Alarm_IRQn 1 */
  /* USER CODE END RTC_Alarm_IRQn 1 */
}
  • 想周期性唤醒用 WakeUp 更简单,想按具体日期时间唤醒用 Alarm。

相关寄存器说明

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

校准机制

  • STM32 的 RTC 校准本质上是在 32 秒校准周期内,对 RTCCLK 脉冲进行“加/减”微调,从而补偿 LSE 晶振频率偏差。它不是直接改时间,而是改“时钟走得快还是慢”。

  • 这个两个功能均需要额外的GPIO支持:
    在这里插入图片描述

机制寄存器作用
精密数字校准RTC_CALR每 32 秒周期内增减 RTCCLK 脉冲,长期补偿晶振偏差
时间平移同步RTC_SHIFTR一次性把 RTC 亚秒计数器前移/后移,用于对齐外部时间
参考时钟检测REFCKON用外部参考时钟同步 RTC 日历,但开启后不能写 RTC_SHIFTR

精密数字校准:CALP + CALM

  • CALP = 1:每 32 秒周期额外插入 512 个 RTCCLK 脉冲,相当于把 RTC 频率提高约 +488.5 ppm。
  • CALM[8:0]:在 32 秒周期内屏蔽 0–511 个 RTCCLK 脉冲,相当于把 RTC 频率降低最多约 -487.1 ppm。
  • 分辨率约 0.954 ppm。
  • 默认校准周期是 32 秒,也可配置为 16 秒或 8 秒,但精度会变差。

FCAL = FRTCCLK × [1 + (CALP × 512 − CALM) / (2²⁰ + CALM − CALP × 512)]

其中:

  • FRTCCLK:当前 RTC 输入时钟频率;
  • FCAL:期望校准后的频率;
  • CALP:0 或 1;
  • CALM:0–511。

LSE 晶振频率会随温度漂移,典型 ±20 ppm 只是在 25°C 附近。

  • 用 MCU 内部温度传感器或外部 NTC/数字温度传感器;
  • 事先标定不同温度下的 RTC 偏差;
  • 运行时根据温度查表或多项式计算,动态调整 RTC_CALR;
  • 或者直接改用 TCXO / 带温补的 RTC 模块,例如 DS3231、SiTime 等。
  • 改用 TCXO 32.768 kHz 作为 LSE 源;
  • 使用外部高精度 RTC 芯片;
  • 用 GNSS/PPS 作为主时间基准,STM32 RTC 只做本地保持。
  • 部分 STM32 系列可以通过 LSEDRV 调整 LSE 振荡器驱动强度。驱动太强:可能功耗偏高、起振波形过冲。驱动太弱:可能起振慢、易停振。
  • 或者,可以用一个高精度定时器测量 RTC 输出,例如把 RTC 512 Hz / 1 Hz 校准输出 接到定时器输入捕获,统计实际频率偏差,再反推 RTC_CALR 的 CALP/CALM。或者在应用层对时间戳做线性补偿。

CG

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值