一、RTC簡介
實時時鐘(RTC) 是一個獨立的 BCD 定時器/計數器, RTC 提供具有可編程鬧鐘中斷功能的日歷時鐘/日歷,RTC 還包含具有中斷功能的周期性可編程喚醒標志,兩個 32 位暫存器包含二進碼十進數格式 (BCD) 的秒、分鐘、小時( 12 或 24 小時制)、星期幾、日期、月份和年份,此外,還可提供二進制格式的亞秒值,系統可以自動將月份的天數補償為 28、29(閏年)、30 和 31 天,只要芯片的備用電源一直供電,RTC上的時間會一直走,
STM32 的 RTC 外設(Real Time Clock),實質是一個掉電后還繼續運行的定時器,從定時器的角度來說,相對于通用定時器 TIM 外設,它十分簡單,只有很純粹的計時和觸發中斷的功能;但從掉電還繼續運行的角度來說,它卻是 STM32 中唯一一個具有如此強大功能的外設,所以 RTC 外設的復雜之處并不在于它的定時功能,而在于它掉電還繼續運行的特性,在主電源 VDD有效的情況下(待機),RTC 還可以配置鬧鐘事件使 STM32 退出待機模式,
二、新建工程
1. 打開 STM32CubeMX 軟體,點擊“新建工程”

2. 選擇 MCU 和封裝

3. 配置時鐘
RCC 設定,選擇 HSE(外部高速時鐘) 為 Crystal/Ceramic Resonator(晶振/陶瓷諧振器)
開啟 LSE(外部低速時鐘) 為 Crystal/Ceramic Resonator(晶振/陶瓷諧振器)

選擇 Clock Configuration,配置系統時鐘 SYSCLK 為 72MHz
修改 HCLK 的值為 72 后,輸入回車,軟體會自動修改所有配置

4. 配置除錯模式
非常重要的一步,否則會造成第一次燒錄程式后續無法識別除錯器
SYS 設定,選擇 Debug 為 Serial Wire

三、RTC
3.1 選擇時鐘
選擇 Clock Configuration,RTC 時鐘選擇為 外部低速晶振(LSE),頻率為 32.768KHz,
RTC 設備因為其獨特的運行方式(即掉電依舊運行)使用 HSE 分頻時鐘或者 LSI 的時候,在主電源 VDD 掉電的情況下,這兩個時鐘來源都會受到影響,資源消耗太大,小小的紐扣電池根本吃不消,沒法保證 RTC 正常作業.所以 RTC 一般都時鐘低速外部時鐘 LSE,

3.2 引數配置
在 Timers 中選擇 RTC 設定,并勾選 Activate Clock Source 激活時鐘源,勾選 Activate Calendar 激活萬年歷,

- RTC OUT:Disable(是否使能 tamper(PC13)引腳上輸出校正的秒脈沖時鐘)
- Tamper:不勾選(是否使能tamper(PC13)引腳作為入侵檢測功能)
RTC校驗功能,使能侵入檢測功能,RTC時鐘經64分頻輸出到侵入檢測引腳TAMPER上
當 TAMPER引腳上的信號從 0變成1或者從 1變成 0(取決于備份控制暫存器BKP_CR的 TPAL位),會產生一個侵入檢測事件,侵入檢測事件將所有資料備份暫存器內容清除,
在 Parameter Settings 進行具體引數配置,

- Calendar Time
- Data Format(日期格式):BCD data format
HAL庫是否存在BUG待驗證
- Hours(小時)
- Minutes(分鐘)
- Seconds(秒)
- Calendat Date
- Week Day(星期)
- Month(月份)
- Date(日期)
- Year(年份)
3.3 生成代碼
輸入專案名和專案路徑

選擇應用的 IDE 開發環境 MDK-ARM V5

每個外設生成獨立的 ’.c/.h’ 檔案
不勾:所有初始化代碼都生成在 main.c
勾選:初始化代碼生成在對應的外設檔案, 如 GPIO 初始化代碼生成在 gpio.c 中,

點擊 GENERATE CODE 生成代碼

3.4 添加全域變數
在 main.c 頭部添加 RTC 相關結構體 GetData 和 GetTime
/* Private variables ---------------------------------------------------------*/
RTC_HandleTypeDef hrtc;
UART_HandleTypeDef huart1;
/* USER CODE BEGIN PV */
RTC_DateTypeDef GetData; //獲取日期結構體
RTC_TimeTypeDef GetTime; //獲取時間結構體
/* USER CODE END PV */
3.5 添加讀取時間函式
在while回圈中添加:
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_USART1_UART_Init();
MX_RTC_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* 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);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
3.6 查看列印
串口列印功能查看 STM32CubeMX學習筆記(6)——USART串口使用

四、注意事項
用戶代碼要加在 USER CODE BEGIN N 和 USER CODE END N 之間,否則下次使用 STM32CubeMX 重新生成代碼后,會被洗掉,

? 由 Leung 寫于 2021 年 2 月 4 日
? 參考:STM32CubeMX系列教程13:實時時鐘(RTC)
【STM32】HAL庫 STM32CubeMX教程十三—RTC時鐘
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/256873.html
標籤:其他
上一篇:智能安全帽定位不準?UWB 0.2米高精度定位,解決行業痛點
下一篇:8張撲克牌問題

