STM32-BKP備份寄存器與RTC實時時鐘

引言

本文主要從BKP備份寄存器RTC實時時鐘的原理,特性及應用三個方面展開討論,解析它們在STM32中的獨特價值,助力開發者更好的掌握和運用它們。

BKP備份寄存器的定義

STM32的BKP備份寄存器是一種特殊的存儲單元,它位于備份區域,即使在系統復位或電源關閉時,也能通過電池備份保持數據不丟失。它通常包含多個寄存器,用于存儲關鍵數據,如配置信息、狀態標志等。這些寄存器通過低功耗設計和獨立的備份電源,確保數據在主電源失效時仍能安全保存,為系統恢復和數據完整性提供可靠保障。

簡單來講,BKP備份寄存器可用于存儲用戶的程序數據,當VDD(也就是芯片電源)被切斷后,仍然可以通過VBAT引腳外接一個紐扣電池(通常在1.8v到3.6v)向芯片供電,讓系統處于低功耗模式下維持一些功能的運行,當系統或電源復位,它也不會被復位。

硬件設計

BKP備份寄存器與RTC實時時鐘的關系

首先,它們兩個是緊密相關的功能模塊,它們共同為系統提供數據部分和時間管理的功能,它們都是共享VBAT備用電源。

其次,BKP備份寄存器是用于數據的備份,而RTC實時時鐘模塊本身用于時間計數,所以RTC實時時鐘需要BKP備份寄存器來存儲一些數據。

BKP備份寄存器的特性及應用

我認為BKP備份寄存器最大的特性就是斷電不丟失數據,當然,如果VDD和VBAT同時斷電的話,那它就發揮不出它的作用了。很顯然,它的特性決定著它的應用,如低功耗模式下的數據保持,防拆功能(TAMPER)等。

配置TAMPER(防拆功能)的示例代碼

首先是使能PWR和BKP時鐘,開啟PWR時鐘是因為訪問備份域是由PWR模塊進行控制的,所以必須要使能它

void BKP_Init(void)
{// 使能PWR和BKP時鐘RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);// 使能訪問備份寄存器PWR_BackupAccessCmd(ENABLE);
}

其次是配置PC13引腳,因為大部分的TAMPER引腳都是PC13,可根據實際需求更改

void TAMPER_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;// 配置TAMPER引腳(PC13)為輸入模式GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOC, &GPIO_InitStructure);// 配置TAMPER引腳為高電平有效BKP_TamperPinLevelConfig(BKP_TamperPinLevel_High);// 使能TAMPER引腳功能BKP_TamperPinCmd(ENABLE);
}

接著封裝一下寫入數據和讀出數據的函數

void BKP_WriteData(uint16_t Data)
{// 寫入數據到備份寄存器1BKP_WriteBackupRegister(BKP_DR1, Data);
}uint16_t BKP_ReadData(void)
{// 從備份寄存器1讀取數據return BKP_ReadBackupRegister(BKP_DR1);
}

最后是檢查TAMPER事件標志位,建議放在while循環中不斷查詢,當然,用戶可以在里面調用一些TAMPER事件發生后執行的函數,如通過串口打印輸出等,這里就不調用了。

void BKP_CheckTamper(void)
{// 檢查TAMPER事件標志位if (BKP_GetFlagStatus(BKP_FLAG_TAMP) != RESET){// 清除TAMPER事件標志位BKP_ClearFlag(BKP_FLAG_TAMP);}
}

總結一下

該示例代碼的邏輯思路是初始化BKP和TAMPER引腳,接著把想寫的數據寫入到備份寄存器中,然后再把寫入的數據讀出來,再關掉VDD同時保持VBAT連接備用電源,如果寫入的數據沒有被刪除,那這個BKP備份寄存器實驗就是成功的。同時將TAMPER引腳置于低電平,如果TAMPER事件發生,那么這個防拆功能的實驗也是成功的。

RTC實時時鐘定義

RTC(Real-Time Clock,實時時鐘)是一種硬件電路,用于為電子設備提供精確的時間和日期信息。它通常獨立于主處理器運行,即使在系統關閉或斷電時,也能通過備用電池繼續計時。RTC的主要功能是保持時間的連續性,提供秒、分、時、日、月、年的準確記錄,并支持鬧鐘和周期性喚醒功能。它廣泛應用于嵌入式系統、智能設備和低功耗應用中,確保設備在任何情況下都能準確地跟蹤時間。

RTC實時時鐘特性與應用

RTC實時時鐘具有高精度,低功耗,掉電保持的特性,廣泛應用于時鐘,日歷,數據采集等。

RTC實時時鐘示例代碼

1,設置實時時鐘時間函數

#include "time.h"uint32_t MyRTC_Time[] = {2025,8,18,10,41,00};	//定義全局的時間數組,數組內容分別為年、月、日、時、分、秒void MyRTC_SetTime(void)
{time_t time_cnt;        //定義秒計數器數據類型struct tm time_date;    //定義日期時間數據類型// 將數組的時間賦值給日期時間結構體time_date.tm_year = MyRTC_Time[0] - 1900;        // 年份,從1900開始計算time_date.tm_mon = MyRTC_Time[1] - 1;            // 月份,從0開始(0表示1月)time_date.tm_mday = MyRTC_Time[2];               // 日期time_date.tm_hour = MyRTC_Time[3];               // 小時time_date.tm_min = MyRTC_Time[4];                // 分鐘time_date.tm_sec = MyRTC_Time[5];                // 秒// 調用mktime函數,將日期時間轉換為秒計數器格式// - 8 * 60 * 60為東八區的時區調整time_cnt = mktime(&time_date) - 8 * 60 * 60;// 將秒計數器寫入到RTC的CNT中RTC_SetCounter(time_cnt);// 等待上一次操作完成RTC_WaitForLastTask();
}

從全局數組 MyRTC_Time[]中讀取時間值,將讀取的時間變量賦值給struct tm類型的變量time_data,再使用mktime函數將struct tm轉換為秒計數器格式,并調整時區。

2,RTC初始化函數

void MyRTC_Init(void)
{/*開啟時鐘*/RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);        //開啟PWR的時鐘RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP, ENABLE);        //開啟BKP的時鐘/*備份寄存器訪問使能*/PWR_BackupAccessCmd(ENABLE);                            //使用PWR開啟對備份寄存器的訪問if (BKP_ReadBackupRegister(BKP_DR1) != 0x0000)            //通過寫入備份寄存器的標志位,判斷RTC是否是第一次配置//if成立則執行第一次的RTC配置{RCC_LSEConfig(RCC_LSE_ON);                            //開啟LSE時鐘while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) != SET);    //等待LSE準備就緒RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);                //選擇RTCCLK來源為LSERCC_RTCCLKCmd(ENABLE);                                //RTCCLK使能RTC_WaitForSynchro();                                //等待同步RTC_WaitForLastTask();                                //等待上一次操作完成RTC_SetPrescaler(32768 - 1);                        //設置RTC預分頻器,預分頻后的計數頻率為1HzRTC_WaitForLastTask();                                //等待上一次操作完成MyRTC_SetTime();                                    //設置時間,調用此函數,全局數組里時間值刷新到RTC硬件電路BKP_WriteBackupRegister(BKP_DR1, 0x0000);            //在備份寄存器寫入自己規定的標志位,用于判斷RTC是不是第一次執行配置}else                                                    //RTC不是第一次配置{RTC_WaitForSynchro();                                //等待同步RTC_WaitForLastTask();                                //等待上一次操作完成}
}

首先判斷寫入BKP備份寄存器里面的BKP_DR1是不是等于0x0000,這個是提前寫入的值,當然,這個值可以自定義,這個判斷操作是檢查VBAT是否斷開,如果斷開就需要重新配置,選擇外部低速晶振,也就是我們常見的32.768khz,再進行預分頻為1hz,最后再調用刷新時間的函數,就初始化完成了。

3,RTC讀取時間函數

void MyRTC_ReadTime(void)
{time_t time_cnt;		//定義秒計數器數據類型struct tm time_date;	//定義日期時間數據類型time_cnt = RTC_GetCounter() + 8 * 60 * 60;		//讀取RTC的CNT,獲取當前的秒計數器//+ 8 * 60 * 60為東八區的時區調整time_date = *localtime(&time_cnt);				//使用localtime函數,將秒計數器轉換為日期時間格式MyRTC_Time[0] = time_date.tm_year + 1900;		//將日期時間結構體賦值給數組的時間MyRTC_Time[1] = time_date.tm_mon + 1;MyRTC_Time[2] = time_date.tm_mday;MyRTC_Time[3] = time_date.tm_hour;MyRTC_Time[4] = time_date.tm_min;MyRTC_Time[5] = time_date.tm_sec;
}

最后在需要的地方調用此函數,就可以獲取時間了。

總結

本文介紹了STM32的BKP備份寄存器與RTC實時時鐘功能。BKP寄存器可在系統復位后保存關鍵數據,確保數據的連續性。RTC模塊則提供精確的時間管理,支持時鐘設置、時間更新等功能,二者結合可實現低功耗、高可靠性的數據備份與時間記錄,適用于多種嵌入式應用場景。

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

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

相關文章

Linux網絡服務(五)——FTP服務詳解與實踐操作手冊

文章目錄前言一、FTP服務概述1.1 FTP基本定義1.2 VSFTP模式分類1.3 FTP端口作用二、FTP作用與工作原理(重點)2.1 FTP的作用、模式及通信方式2.1.1 FTP核心作用2.1.2 VSFTP模式與通信協議2.2 FTP工作原理與流程2.2.1 主動模式工作原理2.2.2 被動模式工作原…

5.3 包管理工具 npm yarn pnpm 對比

基本介紹 工具發布時間開發者定位npm2010 年npm Inc / OpenJS FoundationNode.js 官方包管理器Yarn2016 年Facebook(現 Meta)更快、更可靠的替代方案pnpm2016 年Zoltan Kochan高性能、節省磁盤空間 一、核心機制與設計差異 1. npm(Node Pa…

爬蟲基礎學習-授權認證,cookie認證,異常處理

驗證: HTTPBasicAuthHandler(用戶基本的身份驗證處理) HTTPPasswordMgrWithDefaultRealm(經常和authhandler一起出現)#創建一個密碼管理器 password_mgr urllib.request.HTTPPasswordMgrWithDefaultRealm() #添加進目…

開發避坑指南(34):mysql深度分頁查詢優化方案

問題語句 SELECT* FROMt_order_log l WHERE1 1 AND l.create_time > 2024-08-28 AND l.create_time < 2024-09-04 23:59:59 LIMIT 10000,10上述查詢sql&#xff0c;即使create_time字段已建立索引&#xff0c;但偏移量達到幾十萬時候&#xff0c;查詢耗時將近1分鐘&…

Unreal Engine UFloatingPawnMovement

Unreal? Unreal Engine - UFloatingPawnMovement&#x1f3f7; 定義&#x1f9e9; 類繼承關系?? 關鍵特性&#x1f6e0;? 常見配置&#xff08;Details 面板/代碼&#xff09;&#x1f4dd; 使用方法1) 在 Pawn 中添加組件&#xff08;C&#xff09;2) 綁定輸入與驅動移動3…

某網盤不好用?有沒有類似某網盤的存儲軟件?阿里云國際站 OSS:云存儲的全能助手,你 get 了嗎?

在這個數據爆炸的時代&#xff0c;數據存儲和管理成為了眾多企業和個人面臨的一大挑戰。想象一下&#xff0c;你是一位視頻博主&#xff0c;隨著粉絲量的增長&#xff0c;視頻素材越來越多&#xff0c;電腦硬盤根本裝不下&#xff0c;每次找素材都要花費大量時間。又或者你是一…

安全運維過程文檔體系規范

安全運維過程文檔體系規范 1. 文檔體系總覽 本文檔體系嚴格遵循“安全運維生命周期”模型設計&#xff0c;涵蓋業務建立、協同、運維管理、識別防御監測、響應和效果評估六個核心階段。體系旨在通過標準化、規范化的文檔管理&#xff0c;確保所有安全運維活動有章可循、有據可查…

【計算機網絡】 IPV4和IPV6區別

IPv4 和 IPv6 是兩代 互聯網協議&#xff08;Internet Protocol&#xff09;&#xff0c;它們的核心作用都是&#xff1a; &#x1f449; 為網絡設備分配唯一地址&#xff0c;讓它們能在網絡中互相通信。1?? 地址長度IPv4&#xff1a;32 位&#xff08;4 字節&#xff09;&am…

哈希:最長連續序列

題目描述&#xff1a;無序的整型數組&#xff0c;求連續最長序列。 輸入&#xff1a;nums [100,4,200,1,3,2] 輸出&#xff1a;4 &#xff08;因為&#xff1a;最長數字連續序列是 [1, 2, 3, 4]&#xff0c;長度為 4。&#xff09; 說明&#xff1a;連續指的是數字的連續…

python中的生成器

概要python中的生成器是一種特殊的迭代器&#xff0c;如果按照c語言的說法&#xff0c;就是一種特殊的指針&#xff0c;但是python語言的一個語言特性是兼容了函數化編程&#xff0c;類似lambda匿名函數機制。本文重點介紹生成器表達式的使用&#xff0c;是一種很快捷&#xff…

【Coze】Windows 環境下使用 Docker 部署 Coze Studio 的詳細指南

一、前言&#xff1a; Coze Studio 是一站式 AI Agent 開發工具。提供各類最新大模型和工具、多種開發模式和框架&#xff0c;從開發到部署&#xff0c;為你提供最便捷的 AI Agent 開發環境。 提供 AI Agent 開發所需的全部核心技術&#xff1a;Prompt、RAG、Plugin、Workflo…

票務系統小程序源碼

1. 系統概述 github地址 本系統是一個歷經多年迭代和市場檢驗的綜合性智慧票務解決方案。它以小程序和后臺管理系統為核心&#xff0c;深度整合了線上OTA渠道、線下多種支付方式以及各類智能硬件&#xff0c;為旅游景區、展館、活動中心等場景提供穩定、高效、功能完備的一體化…

Python 文件操作與異常處理全解析

目錄 一、文件的基本概念 1. 什么是文件 2. 文件操作的核心內容 3. 文件操作的作用 二、文件的基本操作 1. 文件操作三步走 2. 打開文件&#xff1a;open () 函數 2.1 文件路徑 2.2 常用 mode 模式 3. 寫入文件&#xff1a;write () 函數 4. 關閉文件&#xff1a;cl…

領碼方案:通用物聯網數據采集低代碼集成平臺——萬物智聯時代的黃金鑰匙

摘要&#xff1a; 領碼方案通過“協議抽象層低代碼引擎AI智能中樞”架構&#xff0c;實現物聯網設備數據采集、存儲、分析的零代碼配置化集成。支持200工業協議即插即用&#xff0c;10分鐘完成設備上云&#xff0c;數據流轉效率提升70%&#xff0c;AI模型調用耗時降低90%。該方…

后臺管理系統-10-vue3之用戶管理組件配置子路由和靜態頁面

文章目錄 1 配置子路由 1.1 router/index.js(添加路由) 1.2 views/User.vue(用戶管理) 1.3 驗證路由是否生效 2 User.vue(靜態頁面) 2.1 搜索框和表格的靜態搭建 2.2 用戶表格的數據獲取渲染 2.2.1 user.js(準備數據) 2.2.2 mock.js(攔截請求的URL) 2.2.3 api.js(axios請求的UR…

AMPAK正基科技系列產品有哪些廣泛應用于IOT物聯網

關於正基AMPAK 智慧物聯網 無線射頻模組專家 專業品牌 正基科技是一家擁有超過 20 年無線模組研發、設計、生產、行銷與產品技術整合服務經驗的公司。 有專業的高頻模組硬體設計及軟體整合工程師團隊&#xff0c;具備豐富的客戶應用經驗&#xff0c;能因應客戶與市場導向的產品…

【PyTorch】環境配置

文章目錄1. 配置cuda環境2. 配置conda環境3. 配置pytorch gpu環境1. 配置cuda環境 在命令行輸入以下命令可以查看當前顯卡驅動版本和最高支持的cuda版本 nvidia-smi根據cuda版本去官網下載并安裝cuda 下載鏈接&#xff1a;https://developer.nvidia.com/cuda-toolkit-archive…

vue3實現實現手機/PC端錄音:recorder-core

通過 recorder-core 這個插件實現錄音recorder-core插件使用下方的js文件是安裝后封裝的一個js文件&#xff0c;在需要使用的地方直接引入這個文件&#xff1a;import record from “./recorderCore.js”;// 文件名稱&#xff1a;recorderCore.js// recorder-core插件使用方式…

deepseek 本地部署,如何支持工具調用

這里需要考慮顯卡是否和模型匹配&#xff0c;支不支持推理 先把模版拉取到本地&#xff1a;git clone https://github.com/sgl-project/sglang.git 我的位置是 /data/home/sglang 注意模版位于sglang下的examples/chat_template中 根據對應的模版部署模型&#xff0c;比如 …

Excel中運行VB的函數

“插入” -》 “模塊”Function FormatCodeFlex(inputStr As String, Optional defaultVal As String "0") As StringOn Error GoTo ErrorHandlerDim parts() As StringDim i As Integer 使用 "-" 分割字符串parts Split(inputStr, "-") 確保至…