|
@@ -256,18 +256,58 @@ void RTC_BKP_Init(void)
|
|
|
|
|
|
|
|
---
|
|
---
|
|
|
|
|
|
|
|
|
|
+## HAL 库版 RTC/BKP
|
|
|
|
|
+
|
|
|
|
|
+HAL 库使用 `RTC_HandleTypeDef` 管理 RTC,提供 `SetTime/GetTime/SetAlarm` 等高级 API。
|
|
|
|
|
+
|
|
|
|
|
+```c
|
|
|
|
|
+// CubeMX 生成 RTC 配置:LSE 时钟源,启用日历
|
|
|
|
|
+RTC_HandleTypeDef hrtc;
|
|
|
|
|
+
|
|
|
|
|
+// HAL 库设置时间(使用 RTC_TimeTypeDef / RTC_DateTypeDef 结构体)
|
|
|
|
|
+RTC_TimeTypeDef sTime = {0};
|
|
|
|
|
+RTC_DateTypeDef sDate = {0};
|
|
|
|
|
+
|
|
|
|
|
+sTime.Hours = 12;
|
|
|
|
|
+sTime.Minutes = 0;
|
|
|
|
|
+sTime.Seconds = 0;
|
|
|
|
|
+sTime.TimeFormat = RTC_HOURFORMAT_24; // 24 小时制
|
|
|
|
|
+sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
|
|
|
|
|
+sTime.StoreOperation = RTC_STOREOPERATION_RESET;
|
|
|
|
|
+HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN); // 设置时间
|
|
|
|
|
+
|
|
|
|
|
+sDate.Year = 26; // 2026 年
|
|
|
|
|
+sDate.Month = 7;
|
|
|
|
|
+sDate.Date = 15;
|
|
|
|
|
+sDate.WeekDay = RTC_WEEKDAY_WEDNESDAY;
|
|
|
|
|
+HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN); // 设置日期
|
|
|
|
|
+
|
|
|
|
|
+// HAL 库读取时间
|
|
|
|
|
+HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BIN); // 读时间(必须先读时间再读日期!)
|
|
|
|
|
+HAL_RTC_GetDate(&hrtc, &sDate, RTC_FORMAT_BIN); // 读日期
|
|
|
|
|
+
|
|
|
|
|
+printf("%04d-%02d-%02d %02d:%02d:%02d\r\n",
|
|
|
|
|
+ 2000 + sDate.Year, sDate.Month, sDate.Date,
|
|
|
|
|
+ sTime.Hours, sTime.Minutes, sTime.Seconds);
|
|
|
|
|
+
|
|
|
|
|
+// HAL 库读 BKP 寄存器
|
|
|
|
|
+uint16_t data = HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR1);
|
|
|
|
|
+
|
|
|
|
|
+// HAL 库写 BKP 寄存器
|
|
|
|
|
+HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR1, 0x55AA);
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
## 核心速查表
|
|
## 核心速查表
|
|
|
|
|
|
|
|
-| 操作 | 代码 |
|
|
|
|
|
-|------|------|
|
|
|
|
|
-| 解锁备份域 | `PWR->CR |= PWR_CR_DBP` |
|
|
|
|
|
-| 写 BKP 寄存器 | `BKP->DR[i] = data` |
|
|
|
|
|
-| 读 BKP 寄存器 | `data = BKP->DR[i]` |
|
|
|
|
|
-| 配置 LSE | `RCC->BDCR |= RCC_BDCR_LSEON; while(!LSERDY);` |
|
|
|
|
|
-| 选择 RTC 时钟 | `RCC->BDCR |= RCC_BDCR_RTCSEL_0`(LSE) |
|
|
|
|
|
-| 使能 RTC | `RCC->BDCR |= RCC_BDCR_RTCEN` |
|
|
|
|
|
-| 读 RTC 秒数 | `RTC_GetCounter()` |
|
|
|
|
|
-| 写 RTC 秒数 | `RTC_SetCounter(value)`(需 CNF 模式) |
|
|
|
|
|
|
|
+| 操作 | 寄存器版 | HAL 库 |
|
|
|
|
|
+|------|---------|--------|
|
|
|
|
|
+| 解锁备份域 | `PWR->CR |= PWR_CR_DBP` | CubeMX 自动处理 |
|
|
|
|
|
+| 写 BKP 寄存器 | `BKP->DR[i] = data` | `HAL_RTCEx_BKUPWrite()` |
|
|
|
|
|
+| 读 BKP 寄存器 | `data = BKP->DR[i]` | `HAL_RTCEx_BKUPRead()` |
|
|
|
|
|
+| 设置时间 | `RTC_SetCounter(秒数)` | `HAL_RTC_SetTime()` + `SetDate()` |
|
|
|
|
|
+| 读取时间 | `RTC_GetCounter()` → Unix 转换 | `HAL_RTC_GetTime()` + `GetDate()` |
|
|
|
|
|
+| 配置 LSE | `RCC->BDCR` 逐位操作 | CubeMX 自动配置 |
|
|
|
|
|
+| 写注意事项 | 需 CNF 模式 + 等待 RTOFF | HAL 库自动处理 |
|
|
|
|
|
|
|
|
## 常见问题与避坑
|
|
## 常见问题与避坑
|
|
|
|
|
|