这个编译错误是因为编译器找不到 RTC_WAKEUPCLOCK_CK_SPRE 这个标识符的定义。在较新版本的 STM32 HAL 库中,这个用于选择唤醒定时器时钟源的宏已经被重命名了。

你需要根据你使用的具体STM32系列,将代码中的 RTC_WAKEUPCLOCK_CK_SPRE 替换为对应的新宏定义。

解决方案

请根据你的芯片系列,选择对应的正确宏:

芯片系列 正确的宏定义 (选择1Hz时钟) 说明
STM32F4系列 RTC_WAKEUPCLOCK_CK_SPRE_16BITS  使能16位唤醒定时器,计数器范围 0x0-0xFFFF,最长约18小时 。
STM32F0, F2, F3, F7, L4, L0 等系列 RTC_WAKEUPCLOCK_CK_SPRE  直接选择 ck_spre (通常为1Hz) 时钟。部分系列可能对应LL层驱动中的 LL_RTC_WAKEUPCLOCK_CKSPRE 。

根据你代码中原来的写法,你很可能是STM32F4系列。请尝试将你的代码行修改为:

c

// 对于 STM32F4 系列
HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, 30, RTC_WAKEUPCLOCK_CK_SPRE_16BITS);

// 对于其他大部分系列
// HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, 30, RTC_WAKEUPCLOCK_CK_SPRE);

深入了解:为什么会有不同的宏?

这一切都源于对RTC唤醒定时器硬件设计的理解和HAL库的封装方式。

  1. 时钟源的本质 (ck_spre)ck_spre 是RTC产生的一个稳定时钟,通常为1Hz(每秒一次)。这是实现以“秒”为基本单位唤醒的理想时钟源 。

  2. 唤醒定时器的工作原理:唤醒定时器本质上是一个递减计数器。当它从你设置的初值(如30)减到0时,就会触发唤醒。其唤醒间隔的计算公式为:唤醒时间 = 计数器初值 / 时钟频率。因此,若使用1Hz的 ck_spre,设置计数器为30,理想情况就是30秒唤醒一次。

  3. 计数器的两种模式(F4系列的特殊之处):STM32F4系列的唤醒定时器非常灵活,其16位的计数器(最大65535)可以通过硬件扩展成17位。为了在库函数层面清晰地区分这两种模式,HAL库提供了两个不同的宏 :

    • RTC_WAKEUPCLOCK_CK_SPRE_16BITS:对应 WUCKSEL[2:1] = 10 的配置。它告诉硬件,就使用标准的16位计数器。计数值从 0 到 65535,提供1秒到约18小时的唤醒范围。

    • RTC_WAKEUPCLOCK_CK_SPRE_17BITS:对应 WUCKSEL[2:1] = 11 的配置。它的底层计数器仍然是16位的,但硬件会在你设置的计数值基础上自动加上 0x10000 (65536) 作为实际的初始值。这样,实际计数值范围就变成了 65536 到 131071,从而将唤醒时间范围扩展到了约18到36小时 。

因此,对于F4系列,RTC_WAKEUPCLOCK_CK_SPRE_16BITS 这个宏的名称明确地指出了所选模式,即使用标准的、未扩展的16位计数器。

验证方法

修改代码后,重新编译。如果问题解决,你应该还能在编译输出信息中看到所使用的正确宏定义及其数值。例如,在编译日志中可能会看到类似这样的信息:

c

#define RTC_WAKEUPCLOCK_CK_SPRE_16BITS RTC_CR_WUCKSEL_2

这行信息会确认 RTC_WAKEUPCLOCK_CK_SPRE_16BITS 已经被正确定义,并且其底层值就是控制寄存器需要的 RTC_CR_WUCKSEL_2

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐