打印
[开发工具]

STM32CubeMX RTC实时时钟

[复制链接]
598|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
一、什么是 RTC?
RTC,即实时时钟,是一个独立于主系统时钟的计时器模块。它的主要功能是保持当前时间和日期,即使在系统断电的情况下,只要有备用电源供电,RTC 也能继续工作。RTC 模块通过一个连续计数的计数器来记录时间,提供年、月、日、小时、分钟和秒的计时功能。

RTC 的工作原理
RTC 的核心是一个32位的计数器,支持二进码十进数(BCD)格式,能够记录秒、分钟、小时(支持 12 小时或 24 小时制)、星期几、日期、月份和年份。此外,RTC 还能够处理月份的天数,包括闰年。为了提供更高的精度,RTC 还可以记录亚秒值。系统可以通过修改 RTC 的计数器来设置当前时间。

低功耗和独立运行
RTC 模块的一个显著特点是低功耗运行。在主系统掉电后,只要备用电源(通常是电池或超级电容)仍在供电,RTC 就能继续计时。这使得 RTC 成为实现低功耗应用的理想选择,例如在待机模式下的定时唤醒功能。

RTC 在 STM32 中的实现
STM32 微控制器内置了 RTC 模块,通常通过低速外部晶振(LSE,32.768 kHz)驱动,提供高精度的时间信息。RTC 模块的时钟源可以通过多种方式配置,包括 HSE 分频时钟、LSI 振荡器时钟和 LSE 振荡器时钟。

RTC 的配置
在 STM32 中配置 RTC 通常通过 ST 提供的 CubeMX 工具来完成。配置步骤包括:

选择时钟源:通常选择 LSE 作为时钟源,因为其稳定性和低功耗特性。

设置时间和日期:初始化 RTC 的时间和日期寄存器,选择 12 小时或 24 小时制。

配置中断:RTC 提供三种可屏蔽中断:闹钟中断、秒中断和溢出中断。可以根据应用需求进行配置。

启用备用电源:确保在系统掉电时,RTC 模块仍能通过备用电源保持运行。

RTC 的应用
RTC 在嵌入式系统中有广泛的应用,包括:

定时唤醒:在低功耗应用中,RTC 可以配置为定时唤醒系统执行任务。
时间戳记录:RTC 提供的精确时间戳在数据记录和日志管理中非常有用。
时间同步:多个系统之间的时间同步可以通过 RTC 实现,确保事件的顺序性和一致性。
二、CubeMX配置
SYS 打开调试



RCC配置 选择外部高速低速晶振



RTC配置

Activate Clock Source 激活时钟源
Activate calendar激活日历
RTC_OUT: Not RTC_OUT
Tamper:
第一个是是否使能 tamper(PC13)引脚上输出校正的秒脉冲时钟,

第二个: RTC入侵检测校验功能

RTC校验功能,使能侵入检测功能。RTC时钟经64分频输出到侵入检测引脚TAMPER上
当 TAMPER引脚上的信号从 0变成1或者从 1变成 0(取决于备份控制寄存器BKP_CR的 TPAL位),会产生一个侵入检测事件。侵入检测事件将所有数据备份寄存器内容清除。

RTC全局中断RTC_IRQHandler()
闹钟中断函数RTCAlarm_IRQHandler()


日期时间配置



使能串口3选择异步通信



配置时钟树



生成工程



三、Keil代码
main.c

串口重定向

#include "stdio.h"

int fputc(int ch,FILE *f)
{
    HAL_UART_Transmit(&huart3,(uint8_t*)&ch,1,0xFFFF);
    return ch;
}
定义结构体获取日期和时间

RTC_DateTypeDef GetData;  //获取日期结构体

RTC_TimeTypeDef GetTime;   //获取时间结构体
while循环打印

          /* 获取当前实时时间 */
          HAL_RTC_GetTime(&hrtc, &GetTime, RTC_FORMAT_BIN);
      /* 获取当前实时日期 */
      HAL_RTC_GetDate(&hrtc, &GetData, RTC_FORMAT_BIN);

      /* 显示日期格式 : yy/mm/dd */
      printf("%02d/%02d/%02d\r\n",2000 + GetData.Year, GetData.Month, GetData.Date);
      /* 显示时间格式 : hh:mm:ss */
      printf("%02d:%02d:%02d\r\n",GetTime.Hours, GetTime.Minutes, GetTime.Seconds);

      printf("\r\n");

      HAL_Delay(100);//100ms
效果



其他函数


1. 设置系统时间

HAL_StatusTypeDef HAL_RTC_SetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format)
功能: 设置 RTC 的当前时间。
参数:
hrtc: RTC 句柄,指向 RTC 的结构体,用于管理 RTC 的操作。
sTime: 要设置的时间结构体,包含时、分、秒等时间信息。
Format: 时间格式,可以是二进制 (RTC_FORMAT_BIN) 或 BCD 码 (RTC_FORMAT_BCD)。
返回值: HAL_StatusTypeDef 表示操作的结果,通常是 HAL_OK 表示成功。
2. 读取系统时间

HAL_StatusTypeDef HAL_RTC_GetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format)
功能: 获取 RTC 的当前时间。
参数:
hrtc: RTC 句柄。
sTime: 存储当前时间的结构体。
Format: 时间格式,可以是 RTC_FORMAT_BIN 或 RTC_FORMAT_BCD。
返回值: HAL_StatusTypeDef 表示操作的结果,通常是 HAL_OK 表示成功。
3. 设置系统日期

HAL_StatusTypeDef HAL_RTC_SetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format)
功能: 设置 RTC 的当前日期。
参数:
hrtc: RTC 句柄。
sDate: 要设置的日期结构体,包含年、月、日等日期信息。
Format: 日期格式,可以是 RTC_FORMAT_BIN 或 RTC_FORMAT_BCD。
返回值: HAL_StatusTypeDef 表示操作的结果,通常是 HAL_OK 表示成功。
4. 读取系统日期

HAL_StatusTypeDef HAL_RTC_GetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format)
功能: 获取 RTC 的当前日期。
参数:
hrtc: RTC 句柄。
sDate: 存储当前日期的结构体。
Format: 日期格式,可以是 RTC_FORMAT_BIN 或 RTC_FORMAT_BCD。
返回值: HAL_StatusTypeDef 表示操作的结果,通常是 HAL_OK 表示成功。
5. 启动报警功能

HAL_StatusTypeDef HAL_RTC_SetAlarm(RTC_HandleTypeDef *hrtc, RTC_AlarmTypeDef *sAlarm, uint32_t Format)
功能: 设置 RTC 闹钟的时间。
参数:
hrtc: RTC 句柄。
sAlarm: 要设置的闹钟结构体,包含闹钟时间、日期等信息。
Format: 闹钟时间格式,可以是 RTC_FORMAT_BIN 或 RTC_FORMAT_BCD。
返回值: HAL_StatusTypeDef 表示操作的结果,通常是 HAL_OK 表示成功。
6. 设置报警中断

HAL_StatusTypeDef HAL_RTC_SetAlarm_IT(RTC_HandleTypeDef *hrtc, RTC_AlarmTypeDef *sAlarm, uint32_t Format)
功能: 设置 RTC 闹钟并启用中断。当闹钟时间到达时,会触发中断。
参数:
hrtc: RTC 句柄。
sAlarm: 要设置的闹钟结构体。
Format: 闹钟格式,可以是 RTC_FORMAT_BIN 或 RTC_FORMAT_BCD。
返回值: HAL_StatusTypeDef 表示操作的结果,通常是 HAL_OK 表示成功。
7. 闹钟时间回调函数

__weak void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
功能: 当闹钟 A 事件发生时调用的回调函数,用户可以在此函数中处理闹钟事件。这是一个弱定义函数,用户可以重写它来实现自定义行为。
参数:
hrtc: RTC 句柄。
8. 写入后备存储器

void HAL_RTCEx_BKUPWrite(RTC_HandleTypeDef *hrtc, uint32_t BackupRegister, uint32_t Data)
功能: 向 RTC 的后备寄存器写入数据。后备寄存器在系统断电后,如果有备用电池供电,可以保持数据。
参数:
hrtc: RTC 句柄。
BackupRegister: 要写入的后备寄存器编号。
Data: 要写入的数据。
9. 读取后备存储器

uint32_t HAL_RTCEx_BKUPRead(RTC_HandleTypeDef *hrtc, uint32_t BackupRegister)
功能: 从 RTC 的后备寄存器读取数据。
参数:
hrtc: RTC 句柄。
BackupRegister: 要读取的后备寄存器编号。
返回值: 返回读取的数据。
例程:

链接: https://pan.baidu.com/s/1-wImK-zp4hNdLH4fWU0zng?pwd=k23x 提取码: k23x
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/weixin_46286415/article/details/141855800

使用特权

评论回复
沙发
AdaMaYun| | 2024-9-9 15:22 | 只看该作者
RTC,即实时时钟,是一个独立于主系统时钟的计时器模块

使用特权

评论回复
板凳
键盘手没手| | 2024-9-21 12:27 | 只看该作者
它的主要功能是保持当前时间和日期,即使在系统断电的情况下

使用特权

评论回复
地板
公羊子丹| | 2024-9-22 07:54 | 只看该作者
这个介绍非常详细! 我最近在用 STM32 做低功耗项目,RTC 模块正好符合我的需求,感谢分享!

使用特权

评论回复
5
童雨竹| | 2024-9-22 07:55 | 只看该作者
关于 STM32 的 RTC 功能,一直搞不清楚时钟源的配置,看了这篇介绍终于明白了 LSE 的重要性,尤其是低功耗应用中,非常实用!

使用特权

评论回复
6
周半梅| | 2024-9-22 07:55 | 只看该作者
RTC 的低功耗特点确实太赞了,特别是断电后还能继续计时,这在一些关键的嵌入式应用中非常必要。

使用特权

评论回复
7
帛灿灿| | 2024-9-22 07:56 | 只看该作者
我最近在调试闹钟功能,一直搞不定中断回调函数。看到这里的示例代码,终于知道应该怎么实现闹钟中断了,感谢!

使用特权

评论回复
8
万图| | 2024-9-22 07:56 | 只看该作者
能否再深入讲解一下 LSE 与 HSE 的区别? 特别是在不同应用场景下的选择,感觉配置时钟还是有点不太理解。

使用特权

评论回复
9
Wordsworth| | 2024-9-22 07:57 | 只看该作者
入侵检测功能听起来很厉害,在实际项目中没怎么用过,有哪些应用场景会需要用到这个功能呢?

使用特权

评论回复
10
Pulitzer| | 2024-9-22 07:57 | 只看该作者
备份寄存器真的很实用,尤其是电池供电的情况下,能够保存关键数据不丢失,安全性也很高。

使用特权

评论回复
11
Bblythe| | 2024-9-22 07:57 | 只看该作者
这个 CubeMX 的配置步骤很清晰,之前一直觉得 RTC 配置有些复杂,现在一步一步跟着走,轻松搞定了!

使用特权

评论回复
12
Uriah| | 2024-9-22 07:58 | 只看该作者
RTC 的亚秒记录功能用在哪里? 有没有实际应用的场景,感觉这个精度已经很高了,不知道何时需要使用。

使用特权

评论回复
13
Clyde011| | 2024-9-22 07:58 | 只看该作者
能否分享更多关于闹钟中断的应用场景? 我想了解一下在低功耗设备中,如何通过闹钟实现系统唤醒。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

148

主题

4100

帖子

5

粉丝