stm32rtc实时时钟详解文章

目录

stm32 后备区域基础知识详解

stm32 bkp基础知识详解

Unix时间戳基础知识详解

stm32 rtc实时时钟基础知识详解

相关代码初始化配置


                                        欢迎指正,希望对你,有所帮助!!!

stm32 后备区域基础知识详解

        stm32芯片的 后备区域 (Backup Domain) 是一个特殊的区域,专门用在系统 电源关闭 或者 复位 后维持一些数据不被丢失,通常使用备用电池提供电源,也就是使用纽扣电池提供电源,这样即使主控电源断电,RTC(实时时钟)和其他后备寄存器的数据依然能够保持。

后备区域组成包含:

        RTC模块:stm32 的实时时钟模块(RTC)是一个低功耗计时器,用来保持时间和日期等信息,即使在主控电源关闭之后也能维持之前的数据,RTC模块可以通过电池供电来持续工作。

        BKP寄存器:BKP寄存器是用来存储一些需要再系统复位后保持的数据,比如用户的一些配置信息,计数器的值等,BKP寄存器的内容不会因为系统复位或者掉电而去丢失。

        备份SRAM:在一些stm32的型号里面,还包括成为备份SRAM的区域,这个区域在主电源断电的时仍然使用备用电池供电,用于存储一些数据,这是一个独立于SRAM的内存区域,通常用于存储长期不变的数据。

stm32 bkp基础知识详解

        芯片的 bkp(Back Up) 备份寄存器 通常用来保存掉电之后仍然不丢失的数据,而stm32F103系列芯片属于中容量产品,该产品的寄存器是42个16位的寄存器,可以用来存储84个字节的用户程序数据。

        当芯片VDD电源被切断,后备区域切换为VBAT(1.8~3.6V)维持供电,如果芯片VDD电源没有被切断,依然使用芯片VDD电源对 bkp 后备区域进行供电,当系统在待机模式下被唤醒,或系统复位或电源复位时,也不会被复位,使用芯片的Vbat引脚进行供电,通常情况下是使用纽扣电池对芯片的Vbat引脚进行供电,在芯片进行断电或者芯片进行复位的时候,bkp寄存器中的数据仍然受不到影响。

        同时当TAMPER引脚产生侵入事件的时候会将所有备份寄存器内容清除,TAMPER引脚用来安全保障设计,如果做一个安全系数非常高的设备,BKP里面存了一些数据,同时需要防拆的功能,可以使用TAMPER引脚的防入侵检测的功能。

        TAMPER引脚通常连接到外部的信号源(按钮  传感器  外部电路),当引脚的电平或信号发生变化的时候,STM32的安全模块会做出响应。

        因为bkp寄存器掉电不丢失数据的特性,通常与rtc时钟外设进行联动使用,来使rtc时钟达到掉电之后时钟时间依然保持精准计时的特性。

              

                                                        纽扣电池/电池底座图

        上文提及到bkp寄存器内的数据不受芯片断电影响和复位影响,但是如果将Vbat电源断电在此复位就能发现数据是丢失的。

        芯片的数字电路供电引脚 VDD VSS 这些引脚主要给STM32的数字电路提供电源,处理器,核心,外设(GPIO SPI USART),其中VDD是正极 VSS是电源负极。

                                芯片数字电路供电引脚标号

        而模拟电路供电引脚,是用来专门给模拟电路的外设进行供电的,因为模拟电路对于电源噪声要求比较高,所以这些引脚有单独的供电要求,用来保证模拟电路的精度还有稳定性。        

                                芯片模拟电路供电引脚标号

        备用电源引脚用于在主电源(VDD)断开时,维持某些外设的工作,RTC和BKP非易失存储器,引脚通常连接到纽扣电池上,因为这里VBAT是接入电源正极,而纽扣电池的负极接入VSS就行了

                                芯片备用电池供电引脚

        芯片的电源引脚分离设计有助于降低电源噪声,确保模拟电源的性能和稳定性。

Unix时间戳基础知识详解

        Unix时间戳(也叫POSIX时间戳或Epoch时间),从1970年1月1日0分0秒英国时间开始计时,没有任何的单位换算,计时单位只有秒,世界上所有的Unix计数器时间相同,不同时区通过添加偏移来得到当地时间。

        因为Unix时间戳只有秒,计算为时间需要通过换算,在计算机中通常使用 32 位变量来用于Unix时间戳存放秒数。

stm32 rtc实时时钟基础知识详解

        RTC(Real Time Clock)实时时钟本质上是独立的定时器,rtc模块拥有一组连续计数的计数器,在通过软件程序对rtc定时器进行配置,可以提供时钟日历等功能,RTC和时钟配置系统处于后备区域,系统复位时数据不清零,芯片VDD断电后可借助VBAT供电继续走,修改计数器的值可以重新设置系统当前时间和日期,而不需要电源的支持,适合实时计时和存储日期,同样的RTC引脚也可以输出校准时钟,RTC闹钟脉冲或者脉冲。

                                                        数据手册框图

        图中的 32  位可编程计数器,对应的就是Unix 时间戳,用来计时需要时间需要通过换算时间戳的秒数。左边的RTC预分频器是20位的,分频器输出给计数器的频率为1hz,而外部时钟源的频率都比较高,所以需要分频器的分频。

        灰色区域部分在待机模式下,依然会进行供电,同时RTC是APB1总线上的外设,

                          

                                                        RCC时钟框图

        RTC这个外设时钟源能选择 LSI HSE HSI 三种时钟源,但是基本上只用,LSE作为时钟源也就是外部低速时钟,在芯片VDD掉电之后 LSI HSE 是停止运行的,而HSI时钟源可以通过VBAT进行供电运行,而RTC需要再掉电之后依然能够正常运行,所以因为这个特性需要选择 HSI 这个时钟源来使用

        而RTC引脚也就是PC13引脚,在这里需要注意的是,PC13/TAMPER/RTC三个功能公用一个引脚。        

                                                        RTC程序流程框图

          右边的 秒信号 计数器溢出信号 闹钟信号 可以触发中断,如果需要使用闹钟触发中断,可以使用32位闹钟值进行配置。      

                            

                                                        配置电路图

        需要注意的是,芯片晶振走线需要先过晶振在过电容,反之是不对的,推荐连接的二极管是为了防止电流倒灌设计的。

相关代码初始化配置

        初始化 bkp 的时候还需要初始化 pwr ,因为bkp寄存器位于 后备区域 ,该区域的电源是由 PWR 模块进行管理的,当系统进入待机模式或掉电模式,pwr模块确保VBAT电池供电给 bkp寄存器和RTC模块。

	#if 0//使用BKP寄存器流程   开启 PWREN BKP 时钟 使能对 BKP RTC外设的访问RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP,ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);//使用 CTRL + ALT +空格快捷键 函数就会进行参数提示PWR_BackupAccessCmd(ENABLE);BKP_WriteBackupRegister(BKP_DR1,0x1234);OLED_ShowHexNum(1,1,BKP_ReadBackupRegister(BKP_DR1),4);#endif

                                                        bkp初始化代码

        这里需要注意的是 time.h 库文件是编译器自带的库文件,这种库文件引入的时候需要使用<>来完成,同时需要注意的是,在赋值数据的时候数据前面不需要加 0 如果数据前面加0代表着是8进制的意思

#include "RTC.h"
#include "stm32f10x.h"  
#include <time.h>uint16_t RTC_Arry[] = {2023,1,1,23,59,55};void RTC_Init(void)
{RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP,ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);PWR_BackupAccessCmd(ENABLE);RCC_LSEConfig(RCC_LSE_ON);//如果有VBAT电源BKP里面的数据就不会丢失,这个时候if语句就不会执行也不会执行初始化if(BKP_ReadBackupRegister(BKP_DR1)!=0xA5A5)//利用Bkp来判断VBAT电源有没有断电{//获取标志位判断 LSE 时钟是否准备完毕while(!RCC_GetFlagStatus(RCC_FLAG_LSERDY)){}#if 0//如果LSE晶振有问题齐振不了可以选择更换时钟源RCC_LSICmd(ENABLE);//获取标志位判断 LSE 时钟是否准备完毕while(!RCC_GetFlagStatus(RCC_FLAG_LSIRDY)){}RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);RTC_SetPrescaler(4000 - 1);//分频为1hz#endifRCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);RCC_RTCCLKCmd(ENABLE);//等待RTC时钟和APB1时钟同步,等待上次RTC操作完成	RTC_WaitForSynchro();RTC_WaitForLastTask();RTC_SetPrescaler(32768 - 1);//分频为1hzRTC_WaitForLastTask();//等待写入完成//设置32位unix时间戳时间RTC_SetCounter(1672588795);RTC_WaitForLastTask();//等待写入完成BKP_WriteBackupRegister(BKP_DR1,0xA5A5);}}
//初始化之后得到的是Unix秒时间 还需要一个函数用来把秒函数转化为 现实时间进制
//调用函数把数组里面的时间刷新进RTC数组里面,同样的将Unix时间戳的数据保存在RTC_Arry[]数组里面
void RTC_Set_Time(void)
{time_t time_cnt;struct tm time_data;time_data.tm_yday = RTC_Arry[0] - 1900;time_data.tm_mon = RTC_Arry[1] - 1;time_data.tm_mday = RTC_Arry[2];time_data.tm_hour = RTC_Arry[3];time_data.tm_min = RTC_Arry[4];time_data.tm_sec = RTC_Arry[5];//将现实时间转化为时间戳time_cnt = mktime(&time_data) - 8*60*60;//同时将时间戳写到RTC外设的32位寄存器里面RTC_SetCounter(time_cnt);RTC_WaitForLastTask();}
void RTC_ReadTime(void)
{time_t time_cnt;struct tm time_data;//北京时间比伦敦时间多了8个小时time_cnt = RTC_GetCounter()+8*60*60;//将时间戳换算为日期time_data = *localtime(&time_cnt);RTC_Arry[0] = time_data.tm_yday + 1900;RTC_Arry[1] =  time_data.tm_mon + 1;RTC_Arry[2] = time_data.tm_mday;RTC_Arry[3] = time_data.tm_hour;RTC_Arry[4] = time_data.tm_min;RTC_Arry[5] = time_data.tm_sec;}

                                                        RTC初始化代码

        同时需要注意的是因为time库函数中的转为时间为伦敦时间不是中国时间差了8个小时,所以在对给Unix时间戳寄存器赋值的时候需要去掉8个小时,同理在利用Unix时间戳计算中国时间的时候需要加上8个小时。

        在进行初始化的时候利用bkp寄存器里面的数据来判断VBAT这个引脚有没有断电如果没有断电,只是VDD断电就不在初始化RTC设备,如果VBAT断电BKP寄存器里面的数据丢失,那就重新初始化RTC寄存器的时间。

        来实现当有纽扣电池的时候芯片断电时间依然准确,而当VBAT备用电池断电的时候时间就重新初始化了。

使用纽扣电池注意事项

        需要注意的是,当备份区域使用Vdd供电的时候,也就是Vbat引脚没有使用纽扣电池的时候,pwr内部低电压检测器会自动切换为Vdd进行供电下述功能可用。

1 PC14和PC15可以用于GPIO或LSE引脚

2 PC13可以作为通用IO口,TAMPER引脚,RTC校准时钟,RTC闹钟或秒输出

        如果当后备区域使用Vbat进行供电,也就是使用纽扣电池对芯片Vbat引脚进行供电的时候,固定为下述功能:

1 PC14 PC15引脚只能作为LSE时钟源输入引脚

2 PC13引脚可以作为TAMPER引脚,RTC闹钟或秒输出

        当使用纽扣电池对Vbat引脚供电使用芯片RTC功能时,PC13 14 15 引脚不能作为普通GPIO来使用。​​​​​​​

                                                        欢迎指正,希望对你,有所帮助!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/22098.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot项目@Cacheable注解的使用

Cacheable 是 Spring 框架中用于缓存的注解之一&#xff0c;它可以帮助你轻松地将方法的结果缓存起来&#xff0c;从而提高应用的性能。下面详细介绍如何使用 Cacheable 注解以及相关的配置和注意事项。 1. 基本用法 1.1 添加依赖 首先&#xff0c;确保你的项目中包含了 Spr…

windows上vscode cmake工程搭建

安装vscode插件&#xff1a; 1.按装fastc&#xff08;主要是安装MinGW\mingw64比较方便&#xff09; 2.安装C&#xff0c;cmake&#xff0c;cmake tools插件 3.准备工作完成之后&#xff0c;按F1&#xff0c;选择cmake:Quick Start就可以创建一个cmake工程。 4.设置Cmake: G…

SpringMVC详解

文章目录 1 什么是MVC 1.1 MVC设计思想1.2 Spring MVC 2 SpringMVC快速入门3 SpringMVC处理请求 3.1 请求分类及处理方式 3.1.1 静态请求3.1.2 动态请求 3.2 处理静态请求 3.2.1 处理html文件请求3.2.2 处理图片等请求 3.3 处理动态请求 3.3.1 注解说明3.3.2 示例 3.4 常见问题…

【用deepseek和chatgpt做算法竞赛】——还得DeepSeek来 -Minimum Cost Trees_5

往期 【用deepseek和chatgpt做算法竞赛】——华为算法精英实战营第十九期-Minimum Cost Trees_0&#xff1a;介绍了题目和背景【用deepseek和chatgpt做算法竞赛】——华为算法精英实战营第十九期-Minimum Cost Trees_1&#xff1a;题目输入的格式说明&#xff0c;选择了邻接表…

面试题汇总

1. 判断大小端问题 大端&#xff1a;低字节存放在高地址&#xff1b; 小端&#xff1a;低字节存放在低地址 如 : 0x12345678 bool is_little_endian() {unsigned int x 1;return ((char*)&x)[0]; }bool is_big_endian() {unsigned int x 1;return !((char*)&x)[0];…

jsherp importItemExcel接口存在SQL注入

一、漏洞简介 很多人说管伊佳ERP&#xff08;原名&#xff1a;华夏ERP&#xff0c;英文名&#xff1a;jshERP&#xff09;是目前人气领先的国产ERP系统虽然目前只有进销存财务生产的功能&#xff0c;但后面将会推出ERP的全部功能&#xff0c;有兴趣请帮点一下 二、漏洞影响 …

体验用ai做了个python小游戏

体验用ai做了个python小游戏 写在前面使用的工具2.增加功能1.要求增加视频作为背景。2.我让增加了一个欢迎页面。3.我发现中文显示有问题。4.我提出了背景修改意见&#xff0c;欢迎页面和结束页面背景是视频&#xff0c;游戏页面背景是静态图片。5.提出增加更多游戏元素。 总结…

动态存储斐波那契数列(递归优化)

递归 递归是c当中一种自身调用自身的算法。 普通递归解决斐波那契数列问题 #include<iostream> using namespace std; int f(int n){int sum;if(n<2){sum1;}else{sumf(n-1)f(n-2);}return sum; } int main() {int n;cin>>n;cout<<f(n);return 0;}当数据…

php文件上传

文章目录 文件上传机制文件上传脚本文件上传绕过php后缀替换为空web服务器的解析漏洞绕过nginxiisapache 高级文件上传nginx自定义配置文件&#xff08;默认三分钟刷新一次&#xff09;服务端内容检测结合伪协议使用配合日志包含只允许图片上传 上传实战训练 文件上传机制 文件…

播放器系列1——总概述

播放器核心架构 模块解释 文件读取 读取视频文件、读取网络文件、读取音频文件&#xff0c;大概分为这三种&#xff0c;目前代码中仅实现了读取视频文件播放&#xff0c;也就是当没有video数据的时候播放器不可使用。 解复用 容器指的是多媒体文件中的封装格式&#xff0c;…

【存储中间件API】MySQL、Redis、MongoDB、ES常见api操作及性能比较

常见中间件api操作及性能比较 ☝️ MySQL crud操作✌️ maven依赖✌️ 配置✌️ 定义实体类✌️ 常用api ☝️ Redis crud操作✌️ maven依赖✌️ 配置✌️ 常用api ☝️ MongoDB crud操作✌️ maven依赖✌️ 配置文件✌️ 定义实体类✌️ MongoDB常用api ☝️ ES crud操作 ⭐️…

【进程与线程】Linux 线程、同步以及互斥

每个用户进程有自己的地址空间。 线程是操作系统与多线程编程的基础知识。 系统为每个用户进程创建一个 task_struct 来描述该进程&#xff1a;该结构体中包含了一个指针指向该进程的虚拟地址空间映射表&#xff1a; 实际上 task_struct 和地址空间映射表一起用来表示一个进程…

实现动态翻转时钟效果的 HTML、CSS 和 JavaScript,附源码

实现动态翻转时钟效果的 HTML、CSS 和 JavaScript 在现代网页设计中&#xff0c;动画效果可以极大地增强用户体验。本文将介绍如何利用 HTML、CSS 和 JavaScript 创建一个动态翻转时钟的效果&#xff0c;模拟经典机械翻页时钟的视觉效果。我们将通过详细的步骤讲解如何实现时钟…

Spring Boot与MyBatis

Spring Boot与MyBatis的配置 一、简介 Spring Boot是一个用于创建独立的、基于Spring的生产级应用程序的框架&#xff0c;它简化了Spring应用的初始搭建以及开发过程。MyBatis是一款优秀的持久层框架&#xff0c;它支持定制化SQL、存储过程以及高级映射。将Spring Boot和MyBa…

1.16作业

1 进注册界面&#xff0c;第一次以为抓包选把isadmin ture了就好 第二次尝试&#xff0c;勾选is admin&#xff0c;有需要invitecode&#xff08;经典&#xff09; 2 p r**5 r**4 - r**3 r**2 - r 2023 q r**5 - r**4 r**3 - r**2 r 2023 n 25066797992811602609904…

LeetCode 2209.用地毯覆盖后的最少白色砖块:记忆化搜索之——深度优先搜索(DFS)

【LetMeFly】2209.用地毯覆盖后的最少白色砖块&#xff1a;记忆化搜索之——深度优先搜索(DFS) 力扣题目链接&#xff1a;https://leetcode.cn/problems/minimum-white-tiles-after-covering-with-carpets/ 给你一个下标从 0 开始的 二进制 字符串 floor &#xff0c;它表示地…

「正版软件」PDF Reader - 专业 PDF 编辑阅读工具软件

PDF Reader 轻松查看、编辑、批注、转换、数字签名和管理 PDF 文件&#xff0c;以提高工作效率并充分利用 PDF 文档。 像专业人士一样编辑 PDF 编辑 PDF 文本 轻松添加、删除或修改 PDF 文档中的原始文本以更正错误。自定义文本属性&#xff0c;如颜色、字体大小、样式和粗细。…

【报错解决】vue打开界面报错Uncaught SecurityError: Failed to construct ‘WebSocket‘

问题描述&#xff1a; vue运行时正常&#xff0c;但是打开页面后报错 Uncaught SecurityError: Failed to construct WebSocket: An insecure WebSocket connection may not be initiated from a page loaded over HTTPS. 解决方案&#xff1a; 在项目列表中的public下的ind…

骶骨神经

骶骨肿瘤手术后遗症是什么_39健康网_癌症 [健康之路]匠心仁术&#xff08;七&#xff09; 勇闯禁区 骶骨肿瘤切除术

wps中的js开发

严格区分大小写 /*** learn_js Macro*/ function test() {Range(D7).Value2Selection.Value2; // Selection.formula "100" }function Workbook_SheetSelectionChange(Sh, Target) {if(Sh.Name Sheet1) {test();}}function test2() {// 把I4单元格及其周边有数的单…