STM32单片机BKP备份寄存器和RTC实时时钟详解

文章目录

1. Unix时间戳

2. UTC/GMT

3. 时间戳转换

4. BKP简介

5. BKP基本结构

6. RTC简介

7. RTC框架图

8. RTC基本结构

9. 代码示例


1. Unix时间戳

实时时钟,本质上是一个定时器,专门用来产生年月日时分秒。

Unix 时间戳(Unix Timestamp)定义为从UTC/GMT的1970年1月1日0时0分0秒开始所经过的秒数,不考虑闰秒。

时间戳是一个计数器数值,从1970年1月1日0时0分0秒开始,到现在总共所经过的秒数。

时间戳存储在一个秒计数器中,秒计数器为32位/64位的整型变量。

世界上所有时区的秒计数器相同,不同时区通过添加偏移来得到当地时间。

2. UTC/GMT

GMT(Greenwich Mean Time)格林尼治标准时间是一种以地球自转为基础的时间计量系统。它将地球自转一周的时间间隔等分为24小时,以此确定计时标准。

UTC(Universal Time Coordinated)协调世界时是一种以原子钟为基础的时间计量系统。它规定铯133原子基态的两个超精细能级间在零磁场下跃迁辐射9,192,631,770周所持续的时间为1秒。当原子钟计时一天的时间与地球自转一周的时间相差超过0.9秒时,UTC会执行闰秒来保证其计时与地球自转的协调一致。

3. 时间戳转换

C语言的time.h模块提供了时间获取和时间戳转换的相关函数,可以方便地进行秒计数器、日期时间和字符串之间的转换。

函数作用

time_t time(time_t*);

获取系统时钟

struct tm* gmtime(const time_t*);

秒计数器转换为日期时间(格林尼治时间)

struct tm* localtime(const time_t*);

秒计数器转换为日期时间(当地时间)

time_t mktime(struct tm*);

日期时间转换为秒计数器(当地时间)

char* ctime(const time_t*);

秒计数器转换为字符串(默认格式)

char* asctime(const struct tm*);

日期时间转换为字符串(默认格式)

size_t strftime(char*, size_t, const char*, const struct tm*);

日期时间转换为字符串(自定义格式)

4. BKP简介

BKP(Backup Registers)备份寄存器,本质上就是RAM储存器。

BKP可用于存储用户应用程序数据。当VDD(2.0~3.6V)电源被切断,他们仍然由VBAT(1.8~3.6V)维持供电。当系统在待机模式下被唤醒,或系统复位或电源复位时,他们也不会被复位。

TAMPER引脚产生的侵入事件将所有备份寄存器内容清除。

RTC引脚输出RTC校准时钟、RTC闹钟脉冲或者秒脉冲。

存储RTC时钟校准寄存器。

用户数据存储容量:20字节(中容量和小容量)/ 84字节(大容量和互联型)。

手册建议

  • 如果没有外部电池,建议VBAT引脚接到VDD,就是VBAT和主电源接到一起,并且再连接一个100nf的滤波电容

5. BKP基本结构

STM32后备区域的特性:

  • 当VDD主电源掉电时,后备区域仍然可以由VBAT的备用电池供电。
  • 当VDD主电源上电时,后备区域供电会自动从VBAT切换到VDD。

数据寄存器:

  • 16位(存储2个字节)。
  • 中小容量设备有DR1~DR10,总共10个数据寄存器,每个寄存器存储2个字节,总容量为20字节。
  • 大容量和互联型设备有42个数据寄存器(DR)。

TAMPER引脚:

  • 用于引入检测信号(上升沿/下降沿),清除BKP所有内容以保证数据安全。

时钟输出:

  • 可以将RTC相关时钟从PC13位置的RTC引脚输出供外部使用。
  • 输出校准时钟时,可以配合校准寄存器对RTC的误差进行校准。

6. RTC简介

RTC (Real Time Clock):实时时钟。

RTC是一个独立的定时器,可为系统提供时钟和日历的功能。

RTC和时钟配置系统处于后备区域,系统复位时数据不清零,VDD(2.0 - 3.6V)断电后可借助VBAT(1.8 - 3.6V)供电继续走时。

32位的可编程计数器,可对应Unix时间戳的秒计数器。

20位的可编程预分频器,可适配不同频率的输入时钟。

RTCCLK可选择三种RTC时钟源:

  • HSE时钟除以128(通常为8MHz/128)
  • LSE振荡器时钟(通常为32.768KHz)
  • LSI振荡器时钟(40KHz)

时钟信号解释

  • HSE = 高速外部时钟信号
  • HSI = 高速内部时钟信号
  • LSI = 低速内部时钟信号
  • LSE = 低速外部时钟信号
  • H (High):高速,L (Low):低速,E (External):外部,I (Internal):内部

使用说明

  1. 高速时钟:一般供内部程序运行和主要外设使用。
  2. 低速时钟:一般供RTC、看门狗等东东使用。
  3. 只有选择LSE振荡器时钟,才能实现RTC主电源掉电继续走时的功能。

7. RTC框架图

可编程预分频器

  • RTC_CNT每秒自增,因此驱动计数器的时钟 TR_CLK 需要是1Hz的信号。实际提供RTC模块的时钟(RTCCLK)频率较高,因此RTCCLK经过20位RTC预分频器(1~2^20分频),保证输出给计数器的频率为1Hz。
  • 灰色填充区域均是后备区域。

分频和计数

  • 输入时钟RTCCLK,经过RTC预分频器(由重装载寄存器RTC_PRL和余数寄存器RTC_DIV控制),计数器重装值ARR和CNT进行分频。

RTC_CNT

  • 可以作为Unix时间戳的秒计数器,再借用time.h的函数可以方便地得到年月日时分秒。

闹钟寄存器RTC_ALR

  • 32位寄存器,用来设置闹钟。设置闹钟时,将ALR写入一个秒数,当CNT的值等于ALR设定的闹钟值时,就会产生RTC_Alarm闹钟信号。通过中断系统,在闹钟中断里执行相应操作。
  • 同时,闹钟信号可以让STM32退出待机模式。
  • 此外,这个闹钟值是一个定值,只能响一次。若想实现周期闹钟,在每次闹钟响过后,都需要重新设置下一次闹钟时间。

中断信号

  • RTC_Second(秒中断):来自于CNT的输入时钟。开启此中断后,程序会每秒进入一次RTC中断。
  • RTC_Overflow(溢出中断):来自CNT右边,表示CNT的32位计数器计满溢出时触发一次中断。
  • RTC_Alarm(闹钟中断):当计数器的值和闹钟值相等时触发中断,同时可以唤醒设备退出待机模式。

中断标志位和中断输出控制

  • **F(Flag)**结尾的是对应的中断标志位。
  • **IE(Interrupt Enable)**结尾的是中断使能。
  • 最后三个信号通过一个或汇聚到NVIC中断控制器。

APB1总线和APB1接口

  • 程序读写寄存器的地方可以通过APB1总线完成,RTC位于APB1总线上的设备。

退出待机模式:唤醒机制

  • 闹钟信号和WKUP引脚都可以唤醒设备,退出待机模式。

8. RTC基本结构

RTCCLK的配置和信号处理流程

时钟来源配置

  • 最左边的RTCCLK时钟来源在RCC中配置,可以从三个时钟中选择一个作为RTCCLK。

时钟预分频

  • 选择的RTCCLK经过预分频器对时钟进行分频。
  • 余数计数器是一个自减计数器,存储当前的计数值。
  • 重装寄存器决定计数目标和分频值。
  • 分频后得到1Hz的秒计数信号,传递给32位计数器,每秒自增一次。

闹钟设定

  • 32位计数器下有一个32位的闹钟值,可以设定闹钟时间。

中断信号触发

  • 右侧有三个信号可以触发中断:秒信号、计数器溢出信号和闹钟信号。
  • 这三个信号通过中断输出控制,进行中断使能。
  • 启用的中断信号才能传递到NVIC,然后向CPU申请中断。

程序配置步骤

配置数据选择器:选择RTCCLK时钟来源。

配置重装寄存器:选择分频系数。

配置32位计数器

  • 进行日期时间的读写。
  • 如果需要闹钟,配置32位闹钟值。

配置中断

  • 启用中断,再配置NVIC。
  • 最后,编写对应的中断函数。

9. 代码示例

STM32读写备份寄存器和实时时钟

STM32读写备份寄存器和实时时钟-CSDN博客

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

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

相关文章

CausalMMM:基于因果结构学习的营销组合建模

1. 摘要 在线广告中,营销组合建模(Marketing Mix Modeling,MMM) 被用于预测广告商家的总商品交易量(GMV),并帮助决策者调整各种广告渠道的预算分配。传统的基于回归技术的MMM方法在复杂营销场景…

Windows10中端口被占用处理方法

前言 在Windows 10中,查看端口被占用情况的方法主要依赖于命令行工具netstat。以下是详细步骤,以及必要的解释和归纳: 打开命令提示符 方法1:使用快捷键Win R,打开“运行”对话框,输入cmd,然…

大疆炸机后MOV修复方法(DJI Inspire 3)

dji大疆可以说是无人机中的华为,产品线之广性能之高让高傲的美国人侧面,质量和性价比才是王道。另外产品线的细分也是制胜法宝,无论是手持、农用机、特殊无人机还是影视级产品DJI都有涉及,给人的感觉就是在无人机细分方面它已经无…

Java中的实例变量和类变量

在面向对象编程中,实例变量和类变量(也称为静态变量)是两种重要的成员变量类型。它们各自具有不同的特性和用途。以下是关于这两种变量的详细介绍: 实例变量(Instance Variables) 定义:实例变量…

kafka 集群 Controller 节点和 zookeeper 集群 leader 节点有何区别联系?

kafka 集群 Controller 节点和 zookeeper 集群 leader 节点有何区别联系? Kafka 集群中的 Controller 节点和 ZooKeeper 集群中的 Leader 节点在角色和功能上有明显的区 别,但它们之间也有一定的联系。以下是它们的详细区别和联系: Kafka 集群中的 Controller 节点 角色和…

kafka(五)spring-kafka(1)集成方法

一、集成 1、pom依赖 <!--kafka--><dependency><groupId>org.apache.kafka</groupId><artifactId>kafka-clients</artifactId></dependency><dependency><groupId>org.springframework.kafka</groupId><artif…

java泛型学习

没有java泛型会存在的问题 假设我们有一个方法&#xff0c;希望通过传递不同类型的参数&#xff0c;输出不同类型的对象值。正常情况下我们可能会写不同的方法来实现&#xff0c;但是这样会导致类不断增加&#xff0c;并且类方法很相似&#xff0c;不能够复用。进而导致类爆炸…

cuda 与 opencl 的概念对应关系 备忘

OpenCL&#xff08;Open Computing Language&#xff09;和 CUDA&#xff08;Compute Unified Device Architecture&#xff09;都是用于并行编程的框架&#xff0c;允许开发者利用 GPU&#xff08;以及其他处理器&#xff09;进行高性能计算。尽管它们的目标相似&#xff0c;但…

基于顺序存储的环形队列算法库构建

学习贺利坚老师基于数组的环形队列 数据结构之自建算法库——顺序环形队列_下空队列q中依次入队列数据元素abc-CSDN博客文章浏览阅读5.2k次&#xff0c;点赞6次&#xff0c;收藏6次。本文针对数据结构基础系列网络课程(3)&#xff1a;栈和队列中第9课时环形队列的存储及基本操…

华为---理解OSPF Route-ID(五)

9.5 理解OSPF Route-ID 9.5.1 原理概述 一些动态路由协议要求使用Router-ID作为路由器的身份标示&#xff0c;如果在启动这些路由协议时没有指定Router-ID,则默认使用路由器全局下的路由管理Router-ID。 Router-ID选举规则为&#xff0c;如果通过Router-ID命令配置了Router-…

在Ubuntu 18.04上安装Anaconda

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 简介 Anaconda 是一个为数据科学和机器学习工作流设计的开源软件包管理器、环境管理器和 Python 和 R 编程语言的发行版。 本教程将指…

QT 用GDAL库读写shp文件

地理信息系统离不开shp文件&#xff0c;自己写程序调用gdal库解析shp文件&#xff0c;看看shp文件里的内容。 一、GDALAllRegister()注册所有驱动 二、GDALOpenEx()打开shp文件 三、调用GDALDataset->GetLayerCount()获取图层数量 四、调用GDALDataset->GetLayer(?)…

1.22 LeetCode总结(基本算法)_位运算

进制的概念 进制即进位计数制&#xff0c;是利用固定的数字符号和统一的规则的带进位的计数方法。 任何一种进位计数制都有一个基数&#xff0c;基数为 X 的进位计数制称为 X 进制&#xff0c;表示每一个数位上的数运算时都是逢 X 进一。 504. 七进制数 手法1&#xff1a;当…

android开发中 ComponentActivity()有哪些常用的方法?

ComponentActivity 是 Android 中一个基础的活动类&#xff0c;它继承自 Activity&#xff0c;并且集成了 Jetpack 的诸多组件&#xff0c;使得它在 Compose 和 ViewModel 等新特性中的使用非常便利。以下是一些 ComponentActivity 中常用的方法&#xff1a; 生命周期相关方法…

MongoDB 插入文档

MongoDB 插入文档 MongoDB 是一个流行的 NoSQL 数据库,它使用文档存储数据。在 MongoDB 中,数据以 BSON(Binary JSON)格式存储,这是一种二进制表示的 JSON 格式。MongoDB 提供了灵活的数据模型,使得插入和查询文档变得非常简单。本文将详细介绍如何在 MongoDB 中插入文档…

APP启动流程解析

简单概括启动微信的流程就是&#xff1a; 1.Launcher通知AMS 要启动微信了&#xff0c;并且告诉AMS要启动的是哪个页面也就是首页是哪个页面 2.AMS收到消息告诉Launcher知道了&#xff0c;并且把要启动的页面记下来 3.Launcher进入Paused状态&#xff0c;告诉AMS&#xff0c…

[FreeRTOS 基础知识] 互斥访问与回环队列 概念

文章目录 为什么需要互斥访问&#xff1f;使用队列实现互斥访问休眠和唤醒机制环形缓冲区 为什么需要互斥访问&#xff1f; 在裸机中&#xff0c;假设有两个函数&#xff08;func_A, func_B&#xff09;都要修改a的值&#xff08;a&#xff09;&#xff0c;那么将a定义为全局变…

css-vxe列表中ant进度条与百分比

1.vxe列表 ant进度条 <vxe-column field"actualProgress" title"进度" align"center" width"200"><template #default"{ row }"><a-progress:percent"Math.floor(row.actualProgress)"size"s…

Java程序之可爱的小兔兔

题目&#xff1a; 古典问题&#xff0c;有一对兔子&#xff0c;从出生后第3个月起每个月都生一对兔子&#xff0c;小兔子长到第三个月后每个月又生一对兔子&#xff0c;假如兔子都不死&#xff0c;问每个月的兔子总数为多少? 程序分析&#xff1a; 兔子的规律为数列1,1,2,3,…

C++基础知识——《缺省参数》和《函数重载》

P. S.&#xff1a;以下代码均在VS2019环境下测试&#xff0c;不代表所有编译器均可通过。 P. S.&#xff1a;测试代码均未展示头文件stdio.h的声明&#xff0c;使用时请自行添加。 博主主页&#xff1a;Yan. yan.                        …