[stm32 HAL库] RTC和BKP驱动

本文档介绍了如何在STM32CubeMX中配置外部时钟源,激活时钟和日历,并切换到外部低速时钟。重点在于解决单片机复位后RCC时钟清零的问题,通过开启BKP备用寄存器并设置标志位,确保复位后时钟依然保持。此外,还展示了如何使用串口进行调试,并详细说明了如何利用HAL库设置和获取RTC时间及日期,确保时间的准确读取和更新。

CubeMX 配置

  1. 打开外部时钟
    在这里插入图片描述

  2. 激活时钟和日历
    在这里插入图片描述

  3. 更改RCC时钟为外部低速时钟
    在这里插入图片描述
    以上在CubeMX中的配置就已经完成,点击生成代码即可。

4.这里我需要使用串口进行调试,因此打开了串口一
在这里插入图片描述

工程修改

以上配置后,RCC可以正常走时运行,但是当单片机复位后,RCC时钟会清零,这可不符合我们的目的。
因此,在RCC初始化函数中我们添加这两行代码:
开启BKP备用寄存器时钟和取消其写保护。
在这里插入图片描述
之后在我们添加55行56行57行和83行代码进行是否第一次设置时间进行判断,如果是第一次进行时间的初始化,然后将标志位改变,之后无论如何操作,复位,关闭电源,这个标志位都不会改变。
在这里插入图片描述

实现基本时间走时并读取

  1. 在主函数中定义两个保存时间和数据的结构体,并配置时间和日期等数据在这里插入图片描述
  2. 写入时间数据
HAL_RTC_SetTime(&hrtc, &RtcTime, RTC_FORMAT_BIN)
HAL_RTC_SetDate(&hrtc, &RtcDate, RTC_FORMAT_BIN)
  1. 读取时间数据
HAL_RTC_GetTime(&hrtc, &RtcTime,RTC_FORMAT_BIN);
HAL_RTC_GetDate(&hrtc, &RtcDate,RTC_FORMAT_BIN);

在这里插入图片描述

### STM32 HAL RTC 使用教程及示例代码 #### 初始化RTC模块 为了使用STM32RTC功能,首先需要初始化RTC模块。这可以通过调用`HAL_RTC_Init()`函数来完成,此函数负责按照默认配置设置RTC模块[^3]。 ```c // 定义RTC句柄结构体 RTC_HandleTypeDef hrtc; void MX_RTC_Init(void) { // 配置RTC参数... if (HAL_RTC_Init(&hrtc) != HAL_OK) { // 错误处理 Error_Handler(); } } ``` #### 设置时间日期 一旦RTC被成功初始化之后,就可以利用它来进行时间管理操作了。下面这段代码展示了如何设定RTC的时间日期: ```c RTC_TimeTypeDef sTime = {0}; RTC_DateTypeDef sDate = {0}; sTime.Hours = 14; sTime.Minutes = 30; sTime.Seconds = 0; if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK) { // 时间设置失败后的错误处理 } sDate.WeekDay = RTC_WEEKDAY_MONDAY; sDate.Month = RTC_MONTH_JANUARY; sDate.Date = 1; sDate.Year = 21; if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN) != HAL_OK) { // 日期设置失败后的错误处理 } ``` #### 备份寄存器读写 备份区域允许开发者保存一些即使在系统断电情况下也不会丢失的数据。这里给出了一段用于向指定位置写入数据以及从中读取数据的例子: ```c uint32_t rtcBackup = 240630; uint32_t readValue; readValue = HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR0); printf("%lu\r\n", readValue); HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR0, rtcBackup); ``` #### 周期性唤醒定时器 周期性的唤醒事件能够使MCU从低功耗模式下恢复过来执行某些任务。这部分涉及到更多复杂的配置细节,在实际应用中可能还需要考虑电源管理中断服务程序的设计等问题[^1]。 ```c RTC_AlarmTypeDef sAlarm = {0}; sAlarm.AlarmTime.Hours = 8; sAlarm.AlarmTime.Minutes = 0; sAlarm.AlarmTime.Seconds = 0; sAlarm.AlarmMask = RTC_ALARMMASK_NONE; if (HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN) != HAL_OK) { // 报警设置失败后的错误处理 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

おもいね

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值