STM32 RTC實時時鐘詳解與HAL庫實戰教程

摘要:本文深入講解STM32的RTC(Real-Time Clock)模塊,涵蓋原理分析、CubeMX配置、HAL庫編程實現,并提供完整的鬧鐘設置與時間校準例程代碼。通過本文,您將掌握RTC在低功耗場景下的核心應用技巧。


1. RTC模塊概述

RTC(實時時鐘)是STM32內部獨立運行的定時器模塊,主要特點:

  • 獨立供電:通過VBAT引腳連接備用電池(3V紐扣電池)

  • 32位計數器:可記錄秒級時間(配合預分頻器)

  • 鬧鐘中斷:支持多種喚醒事件

  • 日歷功能:自動處理月、年、閏年計算

  • 低功耗:在待機模式下仍可運行


2. 硬件設計要點

2.1 硬件連接

  • VBAT引腳:連接3V紐扣電池(CR2032)

  • 32.768kHz晶振:建議外接低速晶振(LSE)

  • 備用電源電路

    VDD -> 3.3V主電源
    VBAT -> 電池正極
    GND -> 共地

3. CubeMX配置步驟

3.1 時鐘配置

  1. 激活RTC時鐘源:LSE(外部低速晶振)

  2. 啟用日歷功能

  3. 配置預分頻器:

    • Asynchronous Prescaler: 127

    • Synchronous Prescaler: 255
      (得到1Hz時鐘:(32768/(127+1)*(255+1)) = 1Hz)

3.2 NVIC設置

  • 使能RTC全局中斷

  • 使能鬧鐘中斷(Alarm A)


4. HAL庫代碼實現

4.1 RTC初始化

void MX_RTC_Init(void)
{RTC_TimeTypeDef sTime = {0};RTC_DateTypeDef sDate = {0};hrtc.Instance = RTC;hrtc.Init.HourFormat = RTC_HOURFORMAT_24;hrtc.Init.AsynchPrediv = 127;hrtc.Init.SynchPrediv = 255;hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;hrtc.Init.OutPutPolar = RTC_OUTPUT_POLARITY_HIGH;HAL_RTC_Init(&hrtc);// 設置初始時間sTime.Hours = 12;sTime.Minutes = 0;sTime.Seconds = 0;HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN);// 設置初始日期sDate.WeekDay = RTC_WEEKDAY_MONDAY;sDate.Month = RTC_MONTH_JANUARY;sDate.Date = 1;sDate.Year = 24; // 2024年HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN);
}

4.2 讀取當前時間

void Get_TimeDate(RTC_TimeTypeDef *sTime, RTC_DateTypeDef *sDate)
{HAL_RTC_GetTime(&hrtc, sTime, RTC_FORMAT_BIN);HAL_RTC_GetDate(&hrtc, sDate, RTC_FORMAT_BIN);
}

4.3 設置鬧鐘(30秒后觸發)

void Set_Alarm(void)
{RTC_AlarmTypeDef sAlarm = {0};sAlarm.AlarmTime.Hours = 0;sAlarm.AlarmTime.Minutes = 0;sAlarm.AlarmTime.Seconds = 30; // 30秒后觸發sAlarm.AlarmMask = RTC_ALARMMASK_NONE;sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_NONE;sAlarm.Alarm = RTC_ALARM_A;HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN);
}

4.4 中斷回調函數

void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
{HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); // 翻轉LEDSet_Alarm(); // 重新設置下一次鬧鐘
}

5. 關鍵API說明

函數功能描述
HAL_RTC_SetTime()設置RTC當前時間
HAL_RTC_GetTime()讀取當前時間
HAL_RTC_SetAlarm_IT()設置帶中斷的鬧鐘
HAL_RTCEx_SetWakeUpTimer()配置喚醒定時器

6. 常見問題排查

  1. RTC不保存時間

    • 檢查VBAT電池連接

    • 確認RTC時鐘源配置正確

  2. 時間誤差較大

    • 校準LSE晶振負載電容

    • 使用更高精度的溫補晶振

  3. 鬧鐘不觸發

    • 檢查NVIC中斷使能狀態

    • 確認未屏蔽AlarmMask


通過本教程,您應該能夠快速掌握STM32 RTC模塊的核心應用技巧。在實際項目中,建議結合備份寄存器(BKP)實現關鍵數據的掉電保存功能。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/71194.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/71194.shtml
英文地址,請注明出處:http://en.pswp.cn/web/71194.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spring Boot攔截器(Interceptor)與過濾器(Filter)詳細教程

Spring Boot攔截器(Interceptor)與過濾器(Filter)詳細教程 目錄 概述 什么是攔截器(Interceptor)?什么是過濾器(Filter)?兩者的核心區別 使用場景 攔截器的典…

Tauri跨平臺開發問題及解決方案深度解析(React版)

Tauri跨平臺開發問題及解決方案深度解析(React版) 一、環境配置與項目初始化難題(React適配) 1.1 React項目初始化 推薦模板: # 使用ReactTypeScript模板 npm create tauri-applatest -- --template react-ts# 項目…

AIGC和搜索引擎的異同

AIGC(生成式人工智能)與搜索引擎的核心差異體現在信息處理方式和輸出形態上,我們可以從以下維度對比: 一、工作原理的本質差異 信息檢索機制 搜索引擎:基于關鍵詞匹配(如"中暑怎么辦"→返回相關…

SFT與RLHF的關系

在大模型訓練中,SFT(監督微調)和RLHF(基于人類反饋的強化學習)是相互關聯但目標不同的兩個階段,通常需要結合使用以優化模型性能,而非互相替代。以下是關鍵要點: 1. 核心關系 SFT&…

C# 類型轉換

C# 類型轉換 引言 在C#編程語言中,類型轉換是一種將一個數據類型的變量轉換成另一個數據類型的操作。類型轉換是編程中常見的操作,特別是在處理不同數據類型的變量時。本文將詳細探討C#中的類型轉換,包括隱式轉換和顯式轉換,以及…

提升系統效能:從流量控制到并發處理的全面解析

在當今快速發展的數字時代,無論是構建高效的網絡服務、管理海量數據,還是優化系統的并發處理能力,都是技術開發者和架構師們面臨的重大挑戰。本文集旨在深入探討幾個關鍵技術領域,包括用于網絡通信中的漏桶算法與令牌桶算法的原理…

Git GitHub基礎

git是什么? Git是一個分布式版本控制系統,用于管理源代碼的變更。它允許多個開發者在同一個項目上協作,同時跟蹤每個修改的歷史記錄。 關鍵詞: 分布式版本控制軟件 軟件 安裝到我們電腦上的一個工具 版本控制 例如論文&…

派可數據BI接入DeepSeek,開啟智能數據分析新紀元

派可數據BI產品完成接入DeepSeek,此次接入標志著派可數據BI在智能數據分析領域邁出了重要一步,將為用戶帶來更智能、更高效、更便捷的數據分析體驗。 派可數據BI作為國內領先的商業智能解決方案提供商,一直致力于為用戶提供高效、穩定易擴展…

Linux-ftrace-雙nop機制的實現

Linux 內核調試工具ftrace 之(NOP動態插樁的實現原理) ftrace 是 Linux 內核中的一種跟蹤工具,主要用于性能分析、調試和內核代碼的執行跟蹤。它通過在內核代碼的關鍵點插入探針(probe)來記錄函數調用和執行信息。這對…

Qt互斥鎖(QMutex)的使用、QMutexLocker的使用

Qt互斥鎖【QMutex】的使用、QMutexLocker的使用 基于讀寫鎖(QReadWriteLock)的線程同步Chapter1 Qt互斥鎖(QMutex)的使用、QMutexLocker的使用一、QMutexLocker和QMutex實現示例圖二、QMutex和QMutexLocker的關系(個人理解)三、QMutex使用和QMutexLocker…

【無標題】Ubuntu22.04編譯視覺十四講slambook2 ch4時fmt庫的報錯

Ubuntu22.04編譯視覺十四講slambook2 ch4時fmt庫的報錯 cmake ..順利&#xff0c;make后出現如下報錯&#xff1a; in function std::make_unsigned<int>::type fmt::v8::detail::to_unsigned<int>(int): trajectoryError.cpp:(.text._ZN3fmt2v86detail11to_unsi…

SpringBoot ——簡單開發流程實戰

本文使用SpringBoot進行電商系統商品數據增刪改查的簡單開發流程。 本文目錄 一、創建Spring Boot項目二、配置數據庫連接三、創建實體類四、創建Repository接口五、創建Service層六、創建Controller層七、測試 一、創建Spring Boot項目 可以通過https://start.spring.io/或者…

fastadmin 后臺商品sku(vue)

先上個效果圖 首先先引入vue define([backend], function (Backend) {require.config({paths: {vue: /assets/jeekshopskugoods/libs/vue.min,skuimg: /assets/jeekshopskugoods/js/skuimg,skugoods: /assets/jeekshopskugoods/js/skugoods,layui: /assets/LayuiSpzj/layui/la…

LeetCode 718 - 最長重復子數組

LeetCode 718 - 最長重復子數組 是一個典型的數組和字符串問題&#xff0c;適合考察動態規劃、滑動窗口和二分查找等多種編程能力。掌握其多種解法及變體能夠有效提高處理字符串和數組算法的能力。 題目描述 輸入: 兩個整數數組 nums1 和 nums2。輸出: 兩個數組中存在的最長的…

LeetCode 0132.分割回文串 II:動態規劃

【LetMeFly】132.分割回文串 II&#xff1a;動態規劃 力扣題目鏈接&#xff1a;https://leetcode.cn/problems/palindrome-partitioning-ii/ 給你一個字符串 s&#xff0c;請你將 s 分割成一些子串&#xff0c;使每個子串都是回文串。 返回符合要求的 最少分割次數 。 示例 …

iOS 實現UIButton自動化點擊埋點

思路&#xff1a;我們HOOK UIControl的 addtarget:action:forControlEvents方法&#xff0c;交換UIControl的 addtarget:action:forControlEvents 方法的實現&#xff0c; 在交換的方法中添加原來響應的同時&#xff0c;再添加一個埋點響應&#xff0c;該響應方法實現了點擊埋點…

C++藍橋杯基礎篇(六)

片頭 嗨~小伙伴們&#xff0c;大家好&#xff01;今天我們來一起學習藍橋杯基礎篇&#xff08;六&#xff09;&#xff0c;練習相關的數組習題&#xff0c;準備好了嗎&#xff1f;咱們開始咯&#xff01; 第1題 數組的左方區域 這道題&#xff0c;實質上是找規律&#xff0c;…

git -學習筆記

目錄 基本操作語法 設置用戶和郵箱 版本回退 工作區和暫存區 撤銷修改 刪除與恢復 一工作區刪除了&#xff0c;但是暫存區沒刪除 二工作區誤刪了&#xff0c;暫存區還有 github-Git 連接 報錯解決-push遠程倉庫被拒絕 遠程庫 分支 分支沖突 儲藏分支 回到當前分…

Windows本地Docker+Open-WebUI部署DeepSeek

最近想在自己的電腦本地部署一下DeepSeek試試&#xff0c;由于不希望污染電腦的Windows環境&#xff0c;所以在wsl中安裝了ollama&#xff0c;使用ollama拉取DeepSeek模型。然后在Windows中安裝了Docker Desktop&#xff0c;在Docker中部署了Open-WebUI&#xff0c;最后再在Ope…

力扣785. 判斷二分圖

力扣785. 判斷二分圖 題目 題目解析及思路 題目要求將所有節點分成兩部分&#xff0c;每條邊的兩個端點都必須在不同集合中 二分圖&#xff1a;BFS/DFS/并查集 因為圖不一定聯通&#xff0c;所以枚舉所有點都做bfs(如果沒聯通的話) 代碼 class Solution { public:bool is…