引言

本文主要从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, "-") 确保至…