HAL+Cubemx+RTC实时时钟(掉电不丢失)

发布时间:2026/5/19 22:44:25

HAL+Cubemx+RTC实时时钟(掉电不丢失) 整体思路1.设置时钟时间2.通过每次初始化后在BKP备份寄存器写入标志位并且在初始化前先检查是否有标志位实现掉电不丢失备注1.BKP备份寄存器在使用RTC功能时由cubemx自动开启2.第一次初始化设定时间后只要后备区域不断电RTC就会一直走时一cubemx配置二程序编写在int main前定义RTC_TimeTypeDef RTC_Time ;//时分秒 RTC_DateTypeDef RTC_Date; //年月日while (1) { HAL_RTC_GetDate(hrtc, RTC_Date, RTC_FORMAT_BIN); HAL_RTC_GetTime(hrtc,RTC_Time, RTC_FORMAT_BIN); /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ }到此使用实时监控变量已经可以看见时钟在正常走时了但是复位后时钟又会被初始化相当于丢失了二实现掉电不丢失下面这个是准备在BKP的这个地址上写入这个标志位#define RTC_BKP_DRX RTC_BKP_DR1 #define RTC_MAGIC 0x32F22.需要在int mian前重新定义一个函数void RTC_Init_Check(void)用于在每次初始化前检查是否有标志位如果有标志位说明时间已经设置过了并且后备区域并未掉电直接读取当前时间即可void RTC_Init_Check(void) { if (HAL_RTCEx_BKUPRead(hrtc, RTC_BKP_DRX) ! RTC_MAGIC) { // ❌ 第一次上电或者电池没电 RTC_TimeTypeDef sTime {0}; RTC_DateTypeDef sDate {0}; // 设置时间 sTime.Hours 12; sTime.Minutes 22; sTime.Seconds 0; HAL_RTC_SetTime(hrtc, sTime, RTC_FORMAT_BIN); // 设置日期 sDate.Year 26; sDate.Month RTC_MONTH_MARCH; sDate.Date 23; HAL_RTC_SetDate(hrtc, sDate, RTC_FORMAT_BIN); // 写标志 HAL_RTCEx_BKUPWrite(hrtc, RTC_BKP_DRX, RTC_MAGIC); } else { // ✅ 已初始化 → 什么都不做保持原时间 } }3.修改 MX_RTC_Init并且调用RTC_Init_Check();static void MX_RTC_Init(void) { /* USER CODE BEGIN RTC_Init 0 */ /* USER CODE END RTC_Init 0 */ /* USER CODE BEGIN RTC_Init 1 */ /* USER CODE END RTC_Init 1 */ /** Initialize RTC Only */ hrtc.Instance RTC; hrtc.Init.AsynchPrediv RTC_AUTO_1_SECOND; hrtc.Init.OutPut RTC_OUTPUTSOURCE_ALARM; if (HAL_RTC_Init(hrtc) ! HAL_OK) { Error_Handler(); } /* USER CODE BEGIN Check_RTC_BKUP */ RTC_Init_Check(); /* USER CODE END Check_RTC_BKUP */ /** Initialize RTC and set the Time and Date */ /* USER CODE BEGIN RTC_Init 2 */ /* USER CODE END RTC_Init 2 */ }到此结束已经实现了掉电数据不丢失

相关新闻