STM32学习笔记(十二)丨RTC实时时钟

本篇文章包含的内容

  • 一、计算机底层计时系统——时间戳
    • 1.1 时间戳简介
    • 1.2 GMT/UTC
    • 1.3 C语言和`time.h`库
  • 二、STM32的BKP和RTC时钟
    • 2.1 BKP(Backup Registers)备份寄存器
    • 2.2 RTC(Real Time Clock)实时时钟
      • 2.2.1 RTC简介
      • 2.2.2 RTC的内部结构及工作原理
      • 2.2.3 RTC操作及注意事项

​  本次课程采用单片机型号为STM32F103C8T6。
​  课程链接:江协科技 STM32入门教程


  往期笔记链接:
  STM32学习笔记(一)丨建立工程丨GPIO 通用输入输出
  STM32学习笔记(二)丨STM32程序调试丨OLED的使用
  STM32学习笔记(三)丨中断系统丨EXTI外部中断
  STM32学习笔记(四)丨TIM定时器及其应用(定时中断、内外时钟源选择)
  STM32学习笔记(五)丨TIM定时器及其应用(输出比较丨PWM驱动呼吸灯、舵机、直流电机)
  STM32学习笔记(六)丨TIM定时器及其应用(输入捕获丨测量PWM波形的频率和占空比)
  STM32学习笔记(七)丨TIM定时器及其应用(编码器接口丨用定时器实现编码器测速)
  STM32学习笔记(八)丨ADC模数转换器(ADC单、双通道转换)
  STM32学习笔记(九)丨DMA直接存储器存取(DMA数据转运、DMA+AD多通道转换)
  STM32学习笔记(十)丨I2C通信(使用I2C实现MPU6050和STM32之间通信)
  STM32学习笔记(十一)丨SPI通信(W25Q64芯片简介,使用SPI读写W25Q64存储器芯片)


一、计算机底层计时系统——时间戳

1.1 时间戳简介

在这里插入图片描述

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

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

  2038年危机:由于之前的Unix系统采用一个32位的有符号数来计时,这个计时系统最大的计时时间会在2038年的1月19日溢出,这可能会让一部分不健全的计算机程序崩溃。STM32的32位秒计数器是一个无符号的计数器,在2106年才会溢出。

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

  可以看到,用时间戳来计时的方法是很简单粗暴的一种计时方法,但是计算机底层通过时间戳来计时,有以下几点好处:

  1. 硬件电路设计简单:设计RTC时,只需要一个很大的秒计数器即可,不需要年月日、大月小月、平年闰年等寄存器来记录。
  2. 计算时间间隔时很方便。
  3. 存储方便,只需要一个变量。

  当然,使用时间戳计数器来计时也有一定的缺陷,例如在将秒数转化为我们熟知的时间格式的时候,需要进行复杂的计算,比较占用软件资源。

1.2 GMT/UTC

  • GMT(Greenwich Mean Time)格林尼治标准时间是一种以地球自转为基础的时间计量系统。它将地球自转一周的时间间隔等分为24小时,以此确定计时标准。但是由于地球自转一周的时间实际上是不固定的,它是越来越慢的,所以这种计时系统已经不再适用于现代科学和社会的发展

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

1.3 C语言和time.h

在这里插入图片描述
​  在一系列函数中,最复杂的函数是struct tm* localtime(const time*);time_t mktime(struct tm*);,这两个函数也是STM32的RTC编程中需要掌握的函数,所以需要重点掌握,其他的了解即可。
​  struct tm* localtime(const time_t*)函数的参数是一个静态的指针变量,如果不特殊指定为32位计时系统,就默认为64位的计时系统,所以可以认为time_t就是一个64位的int类型的变量。这个函数的返回值是一个结构体指针,在这个结构体中存放一些时间信息,可以供用户方便的查看。time_t mktime(struct tm*)函数也是同理。
在这里插入图片描述

二、STM32的BKP和RTC时钟

2.1 BKP(Backup Registers)备份寄存器

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

  • TAMPER引脚产生的侵入事件将所有备份寄存器内容清除
  • RTC引脚输出RTC校准时钟(外部设备测量这个输出时钟,可以对内部RTC微小的误差进行校准)、RTC闹钟脉冲或者秒脉冲(可以输出,为别的设备提供时钟)
  • 存储RTC时钟校准寄存器
  • 用户数据存储容量:20字节(中容量和小容量)/ 84字节(大容量和互联型)

​  下图展示了BKP的基本结构,橙色部分为后备区域。BKP是后备区域中的一部分电路,后备区域中还有RTC的相关电路。STM32F103C8T6的VBAT,TAMPER,RTC三个功能复用在了同一个引脚上,所以这三个功能在同一时间只能使用一个。
在这里插入图片描述

2.2 RTC(Real Time Clock)实时时钟

2.2.1 RTC简介

  • RTC是一个独立的定时器,可为系统提供时钟和日历的功能
  • RTC和时钟配置系统处于后备区域,系统复位时数据不清零,VDD(2.0 ~ 3.6V)断电后可借助VBAT(1.8 ~ 3.6V)供电继续走时
  • 32位的可编程计数器,可对应Unix时间戳的秒计数器
  • 20位的可编程预分频器(分频系数可以为1到 2 20 2^{20} 220),可适配不同频率的输入时钟
  • 可选择三种RTC时钟源:
    • HSE(高速外部时钟)时钟除以128(通常为8MHz/128)
    • LSE(低速外部时钟)振荡器时钟(通常为32.768KHz),只有这一路的时钟可以由VBAT供电,所以如果要实现掉电自动走时的功能,必须使用这一路时钟
    • LSI(低速内部时钟)振荡器时钟(40KHz)

时钟信号选择32.768kHz的原因

  1. 32.768kHz对于晶振或振荡器的,在硬件设计或者工业生产时可能会有一些便利,使这一频率的晶振或振荡器稳定性高,益于生产;
  2. 32768恰好为2的15次方,如果要产生一个1Hz的信号供RTC计时,可以简单地设计一个15位的计数器,让其不断计时,它的自然溢出频率就是1Hz,不用额外设计计数器的目标值存储寄存器,也不用把计数值和目标值不断作比较,对于芯片内部的电路设计非常友好。

2.2.2 RTC的内部结构及工作原理

在这里插入图片描述
​  上图展示了RTC的内部框图和工作原理。灰色的部分为后备区域,在主电源断电时可以由VBAT供电继续工作。RTC_DIV余数寄存器是一个自减计数器。自建到0后,在下一个上升沿到来时产生溢出信号,并江RTC_PRL中的值装载进来继续自减。
​  RTC电路可以产生三个中断信号:

  • RTC_Second秒中断:每秒产生一个中断信号。
  • RTC_Overflow溢出中断:这个中断会在2106年触发一次。
  • RTC_Alarm闹钟中断:该中断可以让STM32从待机模式中唤醒,并且执行一个中断服务函数。这可以实现让STM32在一些环境恶劣的地方工作,在节约电量的前提下自动执行定时采集数据的功能。
    在这里插入图片描述
    ​  实际设计的硬件电路及推荐电路如下图所示:
    在这里插入图片描述

2.2.3 RTC操作及注意事项

  • 依次执行以下操作将使能对BKP和RTC的访问
    • 设置RCC_APB1ENR的PWREN和BKPEN,使能PWR和BKP时钟(需要同时开启PWR和BKP的时钟,RTC才能正常使用,RTC并没有单独开启时钟的函数)
    • 设置PWR_CR的DBP,使能对BKP和RTC的访问
  • 若在读取RTC寄存器时,RTC的APB1接口曾经处于禁止状态,则软件首先必须等待RTC_CRL寄存器中的RSF位(寄存器同步标志)被硬件置1(RTC等待同步):由于PCLK1的时钟频率36MHz远大于RTCCLK,有可能在上电开启时,RTC的寄存器还没有更新到APB1总线上,这时将发生读取错误(读取到的值为0)。实际使用时调用一个RTC等待同步的库函数即可。
  • 必须设置RTC_CRL寄存器中的CNF位,使RTC进入配置模式后,才能写入RTC_PRL、RTC_CNT、RTC_ALR寄存器(库函数中已经包含)
  • 对RTC任何寄存器的写操作,都必须在前一次写操作结束后进行。可以通过查询RTC_CR寄存器中的RTOFF状态位,判断RTC寄存器是否处于更新中。仅当RTOFF状态位是1时,才可以写入RTC寄存器(调用一个等待的库 函数即可)

​  课程链接:江协科技 STM32入门教程,欢迎大家一起交流学习。
​  持续更新完善中……


  原创笔记,码字不易,欢迎点赞,收藏~ 如有谬误敬请在评论区不吝告知,感激不尽!博主将持续更新有关嵌入式开发、机器学习方面的学习笔记~

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

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

相关文章

javascript 导出表格的excel

一个php网站的表格,需要增加导出excel的功能, 因对web开发不甚了解,开始想着用php导出, 搜索一番发现比较复杂,而且我的表格里已经有数据了, 如果导出又要去库中获取一次,不是负担加倍, 可否把现有表格数据,直接导出来? 答案是肯定的,用js在前端导出 开源js组件…

opencv-07-感兴趣区域(ROI)

在图像处理过程中,我们可能会对图像的某一个特定区域感兴趣,该区域被称为感兴趣区 域(Region of Interest,ROI)。在设定感兴趣区域 ROI 后,就可以对该区域进行整体操作。 以下是一些 OpenCV ROI应用场景 …

centos环境搭建nsq单点

简言 下载 启动nsq(单节点) 1. 启动nsqd 2. 启动nsqlookupd 3. 启动nsqadmin 查看状态 简言 1. nsq是go语言实现的分布式消息处理平台,类似我们常用的kafka,rocket mq等,目的是用来大规模地处理每天数以十亿计级别的消息。它具有分布式和…

如何用Jmeter做性能测试

目录 性能测试的概念 性能测试类型 性能测试应用场景(领域) 性能测试常用的指标 性能测试流程 需求分析 搭建测试环境 测试场景设计 测试用例设计和脚本开发 测试数据准备 性能测试执行和管理 性能测试结果分析与调优 测试报告和跟踪 性能测…

AtcoderABC244场

A - Last LetterA - Last Letter 题目大意 给定一个长度为N的字符串S,由小写英文字母组成,打印出S的最后一个字符。 思路分析 题目要求打印出字符串S的最后一个字符,可以直接通过访问S的最后一个元素来获取该字符。可以使用字符串的back()…

用Arthas快速定位线上JVM问题!

Arthas分析FullGC问题定位 对于FullGC那一定不会陌生,一般来说会采用横切FullGC前置拦截(-XX:+HeapDumpBeforeFullGC)和后置拦截(-XX:+HeapDumpAfterFullGC),导出FullGC发生前后的heap dump文件,以便于我们进行FullGC原因的分析和定位。 推测分析问题之FullGC的频率过高…

unity背景缓动动效

这算是一个很常见的小功能,比如我们在玩横版游戏的时候,背景动画会以一定的频率运动,其实现方式也有很多种。 比如,使用UGUI的imageanimtion动画的方式,自己k桢实现。 还可以使用材质球本身的功能来实现,关…

WPF 自定义控件完成库容表盘显示效果

先看一下显示效果: 需要注意的地方有以下几点: 表盘的刻度分部,长刻度和短刻度显示。在数值80W时,需要更改刻度盘的颜色渐变。在数值80W时,更改库容总数背景的显示,也是颜色渐变。刻度盘控件属性定义&…

HarmonyOS课程体验官招募(第四期),寻找乐于分享,精益求精的伙伴

华为开发者联盟HarmonyOS课程体验官(第四期)活动,开始招募啦! 如果你精益求精、乐于分享;如果你愿意为学堂课程优化改进出谋划策,那就快来加入我们吧!学堂期待与你共同成长、一起进步&#xff0…

11、动手学深度学习——语言模型和数据集:代码详解

我们了解了如何将文本数据映射为词元,以及将这些词元可以视为一系列离散的观测,例如单词或字符。 假设长度为 T T T的文本序列中的词元依次为 x 1 , x 2 , … , x T x_1, x_2, \ldots, x_T x1​,x2​,…,xT​。于是, x t x_t xt​&#xff08…

GPT与人类:人工智能是否能够真正复制人类语言?

人类语言是一种复杂的系统,它不仅包含着无数单词和语法规则,更重要的是具有丰富的含义和上下文。这些语言特征涉及到常识、文化、情感和经验等方面,是人类在长期进化和文明发展中所积累起来的丰富知识和经验的体现。然而,人工智能…

SpringCloud学习路线(7)—— 统一网关Gateway

一、引言 (一)需求: 服务器中的微服务只允许内部人员调用或是内网人员进行调用,拒绝外网人员访问。 (二)如何实现需求? 网关 (三)网关的功能 身份认证和权限校验服务…

java线上故障排查套路总结

线上故障主要会包括cpu、磁盘、内存以及网络问题,而大多数故障可能会包含不止一个层面的问题,所以进行排查时候尽量四个方面依次排查一遍。同时例如jstack、jmap等工具也是不囿于一个方面的问题的,基本上出问题就是df、free、top 三连&#x…

Principle Component Analysis

简述PCA的计算过程 输入:数据集X{x1,x2,...,xn},需降到k维 ① 去中心化(去均值,即每个特征减去各自的均值) ② 计算协方差矩阵1/nX*X^T(1/n不影响特征向量&#xff09…

day39-Oracle分区表

0目录 Oracle分区表 1.2.3 1. Oracle分区表 1.1 作用: Oracle数据库的分区把表中的数据行按照分区划成几个区域,提高大数据量下表的性能 1.2 应用场景:常应用于数据量大的表 1.3 分类:Oracle中有范围分区(最常见…

vue使用docxtemplater导出word实现使用textarea输入的内容换行

注:本文只做导出word并且换行操作,不做vue引入docxtemplater步骤 先看一下实现效果 这是文本域输入的 这是导出来的结果 可以看出来导出来的结果也是换行的呢 接下来我们手摸手操作一下流程 首先咱们捋一捋思路 知道文本域的换行的换行标识符,我们发…

[深度学习入门]什么是神经网络?[神经网络的架构、工作、激活函数]

目录 一、前言二、神经网络的架构——以手写数字识别三、神经网络的工作1、单输入单输出感知器函数2、二维输入参数3、三维输入参数 四、激活函数1、激活函数2、ReLU激活函数3、非线性激活函数(1)二输入二输出的神经网络的架构(2)…

基于预测控制模型的自适应巡航控制仿真与机器人实现(Matlab代码实现)

目录 💥1 概述 📚2 运行结果 🎉3 参考文献 👨‍💻4 Matlab代码 💥1 概述 自适应巡航控制技术为目前由于汽车保有量不断增长而带来的行车安全、驾驶舒适性及交通拥堵等问题提供了一条有效的解决途径&am…

数据结构(王道)——数据结构之 二叉树的存储结构

一、顺序存储 静态顺序存储 顺序存储的二叉树结构特性: 顺序存储的非完全二叉树特性 不完全二叉树的可能会浪费大量空间,所以一般顺序存储二叉树比较少用。 图示为什么很少用顺序存储来存二叉树 顺序存储的二叉树总结: 二、链式存储 二叉链表…

TCP的三次握手过程

TCP 是面向连接的协议,所以使用 TCP 前必须先建立连接,而建立连接是通过三次握手来进行的。三次握手的过程如下图: 刚开始客户端处于 closed 的状态,服务端处于 listen 状态。 第一次握手:客户端给服务端发一个 SYN 报…