STM32-Unix时间戳和BKP备份寄存器以及RTC实时时钟

news2024/10/6 1:51:48

本内容基于江协科技STM32视频学习之后整理而得。

文章目录

  • 1. Unix时间戳
    • 1.1 Unix时间戳简介
    • 1.2 UTC/GMT
    • 1.3 时间戳转换
  • 2. BKP备份寄存器
    • 2.1 BKP简介
    • 2.2 BKP基本结构
    • 2.3 BKP库函数
  • 3. RTC实时时钟
    • 3.1 RTC简介
    • 3.2 RTC框图
    • 3.3 RTC基本结构
    • 3.4 硬件电路
    • 3.5 RTC操作注意事项
    • 3.6 RTC库函数

1. Unix时间戳

1.1 Unix时间戳简介

  • Unix 时间戳(Unix Timestamp)定义为从UTC/GMT的1970年1月1日0时0分0秒开始所经过的秒数,不考虑闰秒
  • 时间戳存储在一个秒计数器中,秒计数器为32位/64位的整型变量
  • 世界上所有时区的秒计数器相同,不同时区通过添加偏移来得到当地时间

image.png

1.2 UTC/GMT

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

1.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*);日期时间转换为字符串(自定义格式)

image.png

2. BKP备份寄存器

2.1 BKP简介

  • BKP(Backup Registers)备份寄存器

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

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

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

  • 存储RTC时钟校准寄存器

  • 用户数据存储容量:

    20字节(中容量和小容量)/ 84字节(大容量和互联型)
    在STM32引脚定义图中,标红色的都是供电引脚,VDD和VSS_1、2、3是内部数字部分电路的供电。VDDA和VSSA是内部模拟部分电路的供电。该四组以VDD开头的供电,都是系统的主电源。在正常使用STM32时,这四组供电
    全部都需要接到3.3V的电源上。VBAT是备用电池供电引脚,如果要使用STM32内部的BKP和RTC,该引脚必须接备用电池。用来维持BKP和RTC在VDD主电源掉电后的供电。备用电池只有一根正极的供电引脚,接电池时,电池正极接到VBAT,电池负极和主电源的负极接在一起供地。

2.2 BKP基本结构

image.png

  • 橙色区域可以称为后备区域,功能是当VDD主电源掉电时,后备区域仍然可以由VBAT的备用电池供电。当VDD主电源上电时,后备区域供电会由VBAT切换到VDD。也就是,主电源有电时,VBAT不会用到,这样可以节省电池电量。
  • BKP位于后备区域。BKP主要有数据寄存器、控制寄存器、状态寄存器和RTC时钟校准寄存器。数据寄存器是主要部分,用来存储数据的。每个数据寄存器都是16位的,一个数据寄存器可以存2个字节。中小容量的有DR1~DR10,所以容量是20字节。
  • TAMPER侵入检测,当产生上升沿和下降沿时,清除BKP所有的内容,以保证安全。
  • 时钟输出,可以从PC13位置的RTC引脚输出出去,供外部使用。当输出校准时钟时,再配合校准寄存器,可以对RTC的误差进行校准。

2.3 BKP库函数

// 缺省配置,手动清空BKP所有的数据寄存器
void BKP_DeInit(void);
// 配置TAMPER侵入检测的,配置引脚的高低电平
void BKP_TamperPinLevelConfig(uint16_t BKP_TamperPinLevel);
// 是否开启侵入检测功能
void BKP_TamperPinCmd(FunctionalState NewState);
// 中断配置
void BKP_ITConfig(FunctionalState NewState);
// 时钟输出
void BKP_RTCOutputConfig(uint16_t BKP_RTCOutputSource);
// 设置RTC校准值
void BKP_SetRTCCalibrationValue(uint8_t CalibrationValue);
// 写BKP,BKP_DR是指定写在哪个DR里,Data:写入的数据
void BKP_WriteBackupRegister(uint16_t BKP_DR, uint16_t Data);
// 读BKP,BKP_DR是要读哪个DR
uint16_t BKP_ReadBackupRegister(uint16_t BKP_DR);

FlagStatus BKP_GetFlagStatus(void);
void BKP_ClearFlag(void);
ITStatus BKP_GetITStatus(void);
void BKP_ClearITPendingBit(void);

// BKP访问使能,设置PWR_CR寄存器里的DBP位,
void PWR_BackupAccessCmd(FunctionalState NewState);

3. RTC实时时钟

3.1 RTC简介

  • RTC(Real Time Clock)实时时钟
  • RTC是一个独立的定时器,可为系统提供时钟和日历的功能
  • RTC和时钟配置系统处于后备区域,系统复位时数据不清零,VDD(2.0~3.6V)断电后可借助VBAT(1.8-3.6V)供电继续走时
  • 32位的可编程计数器,可对应Unix时间戳的秒计数器
  • 20位的可编程预分频器,可适配不同频率的输入时钟
  • 可选择三种RTC时钟源:
    • HSE时钟除以128(通常为8MHz/128):主要作为系统主时钟,主电源掉电后,停止运行
    • LSE振荡器时钟(通常为32.768KHz):主要用于RTC,可以通过VBAT备用电池供电
    • LSI振荡器时钟(40KHz):主要用于看门狗时钟,主电源掉电后,停止运行

HSE=高速外部时钟信号
HSI=高速内部时钟信号
LSI=低速内部时钟信号
LSE=低速外部时钟信号
高速时钟:一般供内部程序运行和主要外设使用;
低速时钟:一般供RTC、看门狗使用;

3.2 RTC框图

image.png

  • 左下角灰色区域是核心的分频和计数计时部分。右边是中断输出使能和NVIC部分。上面是APB1总线读写部分。下面是和PWR关联的部分,就是RTC的闹钟可以唤醒设备,退出待机模式,
    图中的灰色区域都是后备区域,在主电源掉电后,可以使用备用电池维持工作。另外这些模块在待机时都会继续维持供电。其他未被填充的部分,就是待机时不供电。
  • 分频和计数计时部分的时钟是RTCCLK,RTCCLK的时钟来源可以在RCC里配置,就是选择HSE、LSE、LSI,但由于该时钟都大于1Hz,因此,RTCCLK进来后首先经过RTC预分频器进行分频。该分频器由两个寄存器组成,上面是重装载寄存器RTC_PRL,下面是RTC_DIV余数寄存器,是计数器的作用。RTC_PRL是计数目标,写入6就是7分频,RTC_DIV是每来一个时钟计一个数,是一个自减计数器,每来一个输入时钟,DIV自减一次,自减到0时,再来一个输入时钟,DIV输出一个脉冲,产生溢出信号。同时DIV从PRL获取重装值,回到重装值继续自减。
  • 32位的可编程计数器,可看作Unix时间戳的秒计数器,借用time.h的函数,就可以得到年月日时分秒。闹钟寄存器RTC_ALR,是一个32位的寄存器,和CNT是等宽的。可以在ALR写一个秒数,设定闹钟,当CNT的值和ALR设定的闹钟值一样时,就代表闹钟响了。这时就会产生RTC_Alarm闹钟信号,通往右边的中断系统。该闹钟信号可以让STM32退出待机模式。闹钟值是一个定值,只能响一次。
  • RTC_Second是秒中断,来源是CNT的左边,开启该中断,程序就会每秒进一次RTC中断。
  • RTC_Overflow溢出中断,来源是CNT的右边,当CNT的32位计数器计满溢出了,会触发一次中断,该中断一般不会触发。因为CNT定义的是无符号数,到2106年才会溢出。
  • RTC_CR中断:F结尾的是对应的中断标志位,IE结尾的是中断使能。三个信号通过一个或门汇聚到NVIC中断控制器。
  • APB1总线和APB1接口是程序读写寄存器的。
  • WKUP引脚和闹钟信号都可以唤醒设备。

3.3 RTC基本结构

image.png

3.4 硬件电路

image.png

3.5 RTC操作注意事项

  • 执行以下操作将使能对BKP和RTC的访问:
    • 设置RCC_APB1ENR的PWREN和BKPEN,使能PWR和BKP时钟
    • 设置PWR_CR的DBP,使能对BKP和RTC的访问
  • 若在读取RTC寄存器时,RTC的APB1接口曾经处于禁止状态,则软件首先必须等待RTC_CRL寄存器中的RSF位(寄存器同步标志)被硬件置1。
  • 必须设置RTC_CRL寄存器中的CNF位,使RTC进入配置模式后,才能写入RTC_PRL、RTC_CNT、RTC_ALR寄存器。
  • 对RTC任何寄存器的写操作,都必须在前一次写操作结束后进行。可以通过查询RTC_CR寄存器中的RTOFF状态位,判断RTC寄存器是否处于更新中。仅当RTOFF状态位是1时,才可以写入RTC寄存器。

3.6 RTC库函数

// 配置LSE外部低速时钟
void RCC_LSEConfig(uint8_t RCC_LSE);
// 配置LSI内部低速时钟
void RCC_LSICmd(FunctionalState NewState);
// 选择RTCCLK的时钟源,即PPT上的数据选择器
void RCC_RTCCLKConfig(uint32_t RCC_RTCCLKSource);
// 启动RTCCLK
void RCC_RTCCLKCmd(FunctionalState NewState);
// 获取标志位,调用RCC_LSEConfig之后,还要等待一下标志位
// 等RCC中的标志位LSERDY置1后,时钟才算启动完成,工作稳定
FlagStatus RCC_GetFlagStatus(uint8_t RCC_FLAG);

// 配置中断
void RTC_ITConfig(uint16_t RTC_IT, FunctionalState NewState);
// 进入配置模式,置CRL的CNF为1,进入配置模式
void RTC_EnterConfigMode(void);
// 退出配置模式,把CNF位清零
void RTC_ExitConfigMode(void);
// 获取计数器的值,用于获取时钟
uint32_t  RTC_GetCounter(void);
// 写入CNT的值,用于设置时间
void RTC_SetCounter(uint32_t CounterValue);
// 写入预分频器,写入到PRL中,用于配置预分频器的分频系数
void RTC_SetPrescaler(uint32_t PrescalerValue);
// 写入闹钟值
void RTC_SetAlarm(uint32_t AlarmValue);
// 读取预分频器中的DIV余数寄存器,一般是为了得到更细致的时间
uint32_t  RTC_GetDivider(void);
// 等待上次操作完成,循环直到RTOFF状态位为1
void RTC_WaitForLastTask(void);
// 等待同步,清除RSF标志位,然后循环,直到RSF为1
void RTC_WaitForSynchro(void);

FlagStatus RTC_GetFlagStatus(uint16_t RTC_FLAG);
void RTC_ClearFlag(uint16_t RTC_FLAG);
ITStatus RTC_GetITStatus(uint16_t RTC_IT);
void RTC_ClearITPendingBit(uint16_t RTC_IT);


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

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

相关文章

使用qt creator配置msvc环境(不需要安装shit一样的宇宙第一IDE vs的哈)

1. 背景 习惯使用Qt编程的童鞋,尤其是linux下开发Qt的童鞋一般都是使用qt creator作为首选IDE的,通常在windows上使用Qt用qt creator作为IDE的话一般编译器有mingw和msvc两种,使用mingw版本和在linux下的方式基本上一样十分简单,不…

在linux系统centos上面安装php7gmp扩展

ps:在ubuntu上面安装gmp(最简单) $ sudo apt-get install php7.0-gmp然后再php.ini添加extensionphp_gmp.so <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<…

论文略读: LLaMA Pro: Progressive LLaMA with Block Expansion

ACL 2024 人类通常在不损害旧技能的情况下获得新技能 然而&#xff0c;对于大型语言模型&#xff08;LLMs&#xff09;&#xff0c;例如从LLaMA到CodeLLaMA&#xff0c;情况正好相反。深度学习笔记&#xff1a;灾难性遗忘-CSDN博客——>论文提出了一种用于LLMs的新的预训练…

移动硬盘“需格式化”预警:专业数据恢复指南

移动硬盘“需格式化”危机&#xff1a;了解背后的真相 在日常的数字生活中&#xff0c;移动硬盘作为我们存储重要数据的“保险箱”&#xff0c;其稳定性与安全性直接关系到我们信息的完整与便捷访问。然而&#xff0c;当您尝试打开移动硬盘时&#xff0c;屏幕上赫然出现的“需…

Ubantu22.04 通过FlatPak安装微信

Ubuntu22.04 下使用Flatpak稳定安装微信&#xff01; 国际惯例&#xff0c;废话不多说&#xff0c;先上效果图。为啥使用Flatpak,因为Wechat官方只在FlatPak发布了最新的版本。之前使用了Wine以及Dock安装Wechat,效果都不是很理想&#xff0c;bug很多。所以使用了FlatPak。 Fl…

恢复出厂设置手机变成砖

上周&#xff0c;许多Google Pixel 6&#xff08;6、6a、6 Pro&#xff09;手机用户在恢复出厂设置后都面临着设备冻结的问题。 用户说他们在下载过程中遇到了丢失 tune2fs 文件的错误 。 这会导致屏幕显示以下消息&#xff1a;“Android 系统无法启动。您的数据可能会被损坏…

AI编程探索- iOS 实现类似苹果地图 App 中的半屏拉起效果

想要的效果 功能分析 想要实现这种效果&#xff0c;感觉有点复杂&#xff0c;于是就想搜一下相关资料看看&#xff0c;可问题是&#xff0c;我不知道如何描述这种效果&#x1f602;。 当我们遇到这种效果看着很熟悉&#xff0c;但是不知道如何描述它具体是什么的时候&#…

1、spring5.2.x源码解读之下载源码和编译

1、下载源码 1.1、git下载源码 git地址&#xff1a;https://gitcode.net/mirrors/spring-projects/spring-framework.git 1.2、源码导入idea 源码下载地址&#xff1a;https://gitcode.net/mirrors/spring-projects/spring-framework/-/archive/5.2.x/spring-framework-5.2…

Redis基本命令源码解析-字符串命令

1. set 用于将kv设置到数据库中 2. mset 批量设置kv mset (msetnx) key1 value1 key2 value2 ... mset:msetCommand msetnx:msetnxCommand msetCommand和msetnxCommand都调用msetGenericCommand 2.1 msetGenericCommand 如果参数个数为偶数,则响应参数错误并返回 如果…

3.js - 模板渲染 - 金属切面效果

md&#xff0c;狗不学&#xff0c;我学 源码 // ts-nocheck// 引入three.js import * as THREE from three// 导入轨道控制器 import { OrbitControls } from three/examples/jsm/controls/OrbitControls// 导入lil.gui import { GUI } from three/examples/jsm/libs/lil-gui.m…

[搭建个人网站] 云服务器 or 本地环境搭建

别人没有的&#xff0c;你有&#xff0c;你就牛。 面试&#xff0c;吹牛皮的时候 都可以拉出来溜溜 本文介绍2种搭建网站模式方式&#xff1a;区别嘛&#xff08;花钱跟不花钱&#xff09; 花钱&#xff1a; 1. 先购买个域名。。&#xff08;这里就不多介绍了&#xff0c;随便…

Codeforces Round 955 E. Number of k-good subarrays【分治、记忆化】

E. Number of k-good subarrays 题意 定义 b i t ( x ) bit(x) bit(x) 为 x x x 的二进制表示下 1 1 1 的数量 一个数组的子段被称为 k − g o o d k-good k−good 的当且仅当&#xff1a;对于这个子段内的每个数 x x x&#xff0c;都有 b i t ( x ) ≤ k bit(x) \leq k…

ESP32 蓝牙网关实践:BLE 设备数据采集与 MQTT 云平台发布(附代码示例)

摘要: 本文详细介绍了如何使用 ESP32 构建强大的蓝牙网关&#xff0c;实现蓝牙设备与 Wi-Fi/互联网之间的无缝连接和数据桥接。文章涵盖了连接和桥接功能、数据处理和分析能力&#xff0c;并提供了详细的代码示例和 Mermaid 生成的图表&#xff0c;助您轻松构建自己的蓝牙网关解…

仿写Spring IOC

文章目录 IOC思路手写代码思路一些杂七杂八&#xff08;可跳过&#xff09; IOC思路 手写代码思路 手写代码的思路: 自定义一个MyAnnotationConfigApplicationContext&#xff0c;构造器中传入要扫描的包。获取这个包下的所有类。遍历这些类&#xff0c;找出添加了Component注…

Ubuntu 安装CGAL

一、什么是CGAL CGAL&#xff08;Computational Geometry Algorithms Library&#xff09;是一个广泛使用的开源库&#xff0c;主要用于计算几何算法的实现。该库提供了一系列高效、可靠和易于使用的几何算法和数据结构&#xff0c;适用于各种应用领域。以下是 CGAL 的主要功能…

ubuntu下载Nginx

一、Nginx下载安装&#xff08;Ubuntu系统&#xff09; 1.nginx下载 sudo apt-get install nginx2.nginx启动 启动命令 sudo nginx重新编译(每次更改完nginx配置文件后运行&#xff09;&#xff1a; sudo nginx -s reload3.测试nginx是否启动成功 打开浏览器访问本机80端口…

09.QT控件:按钮类控件

1. QPushButton 在QT中使⽤ QPushButton 表⽰⼀个按钮。QPushButton 继承⾃ QAbstractButton&#xff0c;这个类是⼀个抽象类&#xff0c;是其他按钮的⽗类。 &#xff08;1&#xff09;QAbstractButton 中&#xff0c;和 QPushButton 相关性较⼤的属性&#xff1a; &#xf…

独立开发者系列(21)——HTTP协议的使用

作为网络访问的必备知识点&#xff0c;http协议&#xff0c;我们已经知道http协议属于tcp的一种&#xff0c;而且一般是用于网络通讯的&#xff0c;但是本身http协议本身包含的内容也很多&#xff0c;正是因为有这种协议&#xff0c;前后端和各种硬件接口/服务器接口/前端&…

OpenGL笔记七之顶点数据绘制命令和绘制模式

OpenGL笔记七之顶点数据绘制命令和绘制模式 —— 2024-07-07 杭州 下午 总结自bilibili赵新政老师的教程 文章目录 OpenGL笔记七之顶点数据绘制命令和绘制模式1.OpenGL版本号更改和编译更改2.GL_TRIANGLES模式绘制一个三角形、支持NFC坐标随窗口缩放2.1.三个点2.2.四个点从0号…

缓存-缓存的使用与基本详解

1.缓存使用 为了系统性能的提升&#xff0c;我们一般都会将部分数据放入缓存中&#xff0c;加速访问。而db承担数据落盘工作。 哪些数据适合放入缓存&#xff1f; 即时性、数据一致性要求不高的访问量大且更新频率不高的数据&#xff08;读多&#xff0c;写少&#xff09; …