系列文章目錄
STM32CubeIDE(CUBE-MX hal庫)----初嘗點亮小燈
STM32CubeIDE(CUBE-MX hal庫)----按鍵控制
STM32CubeIDE(CUBE-MX hal庫)----串口通信
STM32CubeIDE(CUBE-MX hal庫)----定時器
STM32CubeIDE(CUBE-MX hal庫)----藍牙模塊HC-05(詳細配置)
前言
RTC是一個獨立的定時器,可為系統提供時鐘和日歷的功能
一、可視化配置
1.配置RCC時鐘源,LSE外部低速時鐘,HSE外部高速時鐘
2.配置RTC,Activate Clock Source 激活時鐘源,Activate calendar激活日歷,RTC全局中斷
3.設置參數,設置當前的時間。BCD data format BCD碼進制,23為2023年的后兩位
4.使能串口,將日期發送到上位機
5.時鐘源設置, 設置RTC時鐘為LSE
二、修改代碼
1.頭文件加入<stdio.h>因為加入了printf
/* USER CODE BEGIN Includes */
#include <stdio.h>/* USER CODE END Includes */
2.在USER CODE BEGIN 0中加入重定向代碼
/* USER CODE BEGIN 0 */
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endifPUTCHAR_PROTOTYPE
{HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1,0xFFFF);return ch;
}int fputc(int ch,FILE *f)
{HAL_UART_Transmit(&huart1,(uint8_t*)&ch,1,0xffff);return ch;
}/* USER CODE END 0 */
3.在while (1)中加入獲取時間和日期代碼
while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 *//* Get the RTC current Time */HAL_RTC_GetTime(&hrtc, &GetTime, RTC_FORMAT_BIN);/* Get the RTC current Date */HAL_RTC_GetDate(&hrtc, &GetData, RTC_FORMAT_BIN);/* Display date Format : yy/mm/dd */printf("%02d/%02d/%02d\r\n",2000 + GetData.Year, GetData.Month, GetData.Date);/* Display time Format : hh:mm:ss */printf("%02d:%02d:%02d\r\n",GetTime.Hours, GetTime.Minutes, GetTime.Seconds);printf("\r\n");HAL_Delay(1000);}
三、實驗現象
實現時鐘的
四、擴展
RTC掉電或者復位時時間會進行重置,如果不進行重置則加上改動下面代碼
void MX_RTC_Init(void)
{/* USER CODE BEGIN RTC_Init 0 */RTC_TimeTypeDef time; //時間結構體參數RTC_DateTypeDef datebuff; //日期結構體參數/* USER CODE END RTC_Init 0 */RTC_TimeTypeDef sTime = {0};RTC_DateTypeDef DateToUpdate = {0};/* USER CODE BEGIN RTC_Init 1 */__HAL_RCC_BKP_CLK_ENABLE(); //開啟后備區域時鐘__HAL_RCC_PWR_CLK_ENABLE(); //開啟電源時鐘/* USER CODE END RTC_Init 1 *//**Initialize RTC Only */hrtc.Instance = RTC;hrtc.Init.AsynchPrediv = RTC_AUTO_1_SECOND;hrtc.Init.OutPut = RTC_OUTPUTSOURCE_NONE;if (HAL_RTC_Init(&hrtc) != HAL_OK){Error_Handler();}/* USER CODE BEGIN Check_RTC_BKUP */if(HAL_RTCEx_BKUPRead(&hrtc,RTC_BKP_DR1)!= 0x5051){/* USER CODE END Check_RTC_BKUP *//**Initialize RTC and set the Time and Date */sTime.Hours = 0x23;sTime.Minutes = 0x28;sTime.Seconds = 0x20;if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK){Error_Handler();}DateToUpdate.WeekDay = RTC_WEEKDAY_THURSDAY;DateToUpdate.Month = RTC_MONTH_DECEMBER;DateToUpdate.Date = 0x7;DateToUpdate.Year = 0x23;if (HAL_RTC_SetDate(&hrtc, &DateToUpdate, RTC_FORMAT_BCD) != HAL_OK){Error_Handler();}/* USER CODE BEGIN RTC_Init 2 */__HAL_RTC_SECOND_ENABLE_IT(&hrtc,RTC_IT_SEC); //開啟RTC時鐘秒中斷datebuff = DateToUpdate; //把日期數據拷貝到自己定義的data中HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR1, 0x5051);//向指定的后備區域寄存器寫入數據HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR2, (uint16_t)datebuff.Year);HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR3, (uint16_t)datebuff.Month);HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR4, (uint16_t)datebuff.Date);HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR5, (uint16_t)datebuff.WeekDay);}else{datebuff.Year = HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR2);datebuff.Month = HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR3);datebuff.Date = HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR4);datebuff.WeekDay = HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR5);DateToUpdate = datebuff;if (HAL_RTC_SetDate(&hrtc, &DateToUpdate, RTC_FORMAT_BIN) != HAL_OK){Error_Handler();}__HAL_RTC_SECOND_ENABLE_IT(&hrtc,RTC_IT_SEC); //開啟RTC時鐘秒中斷 }}
參考文章:https://blog.csdn.net/as480133937/article/details/105741893