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

文章目录

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 分钟:0x3B 0x0D = 13, 0x3B = 59。需要转换才能看懂。
BCD (二-十进制) 小时:0x13 分钟:0x59 0x13 看起来就是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 触发。
  • 经过以上配置之后,直接生成代码,在中断函数中进行相关代码编写即可:
c 复制代码
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 */
}
  • 示例代码:
c 复制代码
/* 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。
  • CALM8: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

相关推荐
迪康coolmu14 分钟前
企业U盘管控落地实战:基于迪康端点安全一体化管理系统的移动存储安全实践
运维·人工智能·经验分享·笔记·安全·电脑
Dev_XH37 分钟前
【成品设计】基于物联网的配电箱智能防护系统设计
stm32·单片机·嵌入式硬件·物联网
Dev_XH2 小时前
【成品设计】基于单片机的工厂设备能耗监控与优化系统
stm32·单片机·嵌入式硬件·物联网
不脱发的程序猿3 小时前
STM32制作单手鼠标键盘
stm32·嵌入式硬件·计算机外设·usb·qmk
Z21-X3 小时前
云原生运维学习笔记:容器技术的演进、底层原理与 Docker 全生命周期管理
运维·笔记·学习·云原生
Rabitebla11 小时前
【Linux 底层原理】进程(十):进程等待详解---从僵尸进程到 wait、waitpid 与 status
linux·c++·笔记·学习·visual studio
小lu飞12 小时前
2026小红书小工具怎么制作:纯前端 ZIP 打包、沙箱限制与笔记挂载流程
前端·笔记·ai·ai编程
无心水16 小时前
24、系统架构师论文写作专题 核心考点与学习笔记
笔记·学习·系统架构·架构师·安全架构·软考架构师·软考系统架构设计师
蒸蒸yyyyzwd16 小时前
邓明 Agent 系统面试-意图识别学习笔记
笔记·学习