当前位置: 首页 > news >正文

STM32单片机入门学习——第42节: [12-2] BKP备份寄存器RTC实时时钟

写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难,但我还是想去做!

本文写于:2025.04.19

STM32开发板学习——第42节: [12-2] BKP备份寄存器&RTC实时时钟

  • 前言
  • 开发板说明
  • 引用
  • 解答和科普
  • 一、BKP备份寄存器
  • 二、RTC实时时钟
  • 问题
  • 总结

前言

   本次笔记是用来记录我的学习过程,同时把我需要的困难和思考记下来,有助于我的学习,同时也作为一种习惯,可以督促我学习,是一个激励自己的过程,让我们开始32单片机的学习之路。
   欢迎大家给我提意见,能给我的嵌入式之旅提供方向和路线,现在作为小白,我就先学习32单片机了,就跟着B站上的江协科技开始学习了.
   在这里会记录下江协科技32单片机开发板的配套视频教程所作的实验和学习笔记内容,因为我之前有一个开发板,我大概率会用我的板子模仿着来做.让我们一起加油!
   另外为了增强我的学习效果:每次笔记把我不知道或者问题在后面提出来,再下一篇开头作为解答!

开发板说明

   本人采用的是慧净的开发板,因为这个板子是我N年前就买的板子,索性就拿来用了。另外我也购买了江科大的学习套间。
   原理图如下
1、开发板原理图
在这里插入图片描述
2、STM32F103C6和51对比
在这里插入图片描述
3、STM32F103C6核心板
在这里插入图片描述

视频中的都用这个开发板来实现,如果有资源就利用起来。另外也计划实现江协科技的套件。

下图是实物图
在这里插入图片描述

引用

【STM32入门教程-2023版 细致讲解 中文字幕】
还参考了下图中的书籍:
STM32库开发实战指南:基于STM32F103(第2版)
在这里插入图片描述
数据手册
在这里插入图片描述

解答和科普

一、BKP备份寄存器

在这里插入图片描述
VBAT:备用电池供电;正极3.3V,负极共地。VBAT和主电源接在一起,并且再连接一个100nF的滤波电容。
PC13-TAMPER-RTC共用一个引脚,2号引脚,可以先加入一个默认的上拉或者下拉电阻,别人拆开你的设备,触发开关,就会在TAMPER引脚产生上升沿或者下降沿,这样STM32就检测到侵入事件了,这时BKP的数据会自动清零,并且申请中断,你在中断里,还可以继续保护设备, 另外主电源断电后,侵入检测仍然有效。
RTC引脚输出RTC校准时钟、RTC闹钟脉冲或者秒脉冲
存储RTC时钟校准寄存器
PC13-TAMPER-RTC,这三个功能,同一时间只能使用一个。
BKP(20个字节)
在这里插入图片描述
当VDD主电源掉电时,后备区域仍然可以由VBAT的备用电池供电,当VDD主电源上电后,后备区域供电会由VBAT切换到VDD,也就是主电源有电时,VBAT不会用到,这样可以节省电池电量。
RTC和时钟配置系统处于后备区域,系统复位时数据不清零,VDD(2.0~ 3.6V)断电后可借助VBAT(1.8~3.6V)供电继续走时。

二、RTC实时时钟

在这里插入图片描述
32位的可编程计数器,可对应Unix时间戳的秒计数器,在读取时间时,先读取这个秒数,然后使用time.h模块的localtime函数,就可以得到年月日时分秒的信息了。在写入时间时,先填充年月日时分秒信息到struct tm结构体,然后用mktime函数,得到秒数,再写入到这个32位计数器即可,这样操作这个秒数计数器的思路就清晰了。
在这里插入图片描述
因为时间戳的设计,只需要一个32位计数器寄存器就行了,不需要年月日,小时分钟的寄存器了,都不需要再设计了。硬件也不需要考虑大月小月、平年闰年,直接秒一直加,软件就要进行计算了。
驱动时钟需要是1Hz的信号,但是实际提供给RTC模块的时钟,也就是RTCCLK,一般频率都比较高,所以我们显然要在这里加一个分频器,给RTCCLK降频率,保证分频器输出给计数器的频率为1Hz,为了适配各种RTCCLK,就加了一个20位分频器。1~ 2^20分频。

在这里插入图片描述
可选择三种RTC时钟源:
HSE时钟除以128(通常为8MHz/128) 为了分频到1hz。
LSE振荡器时钟(通常为32.768KHz) 自然移出1Hz
LSI振荡器时钟(40KHz)
在这里插入图片描述
本身就是专供的RTC时钟,LSE振荡器时钟(通常为32.768KHz),可以通过VBAT供电。
在这里插入图片描述
在这里插入图片描述
RTC时钟可以唤醒设备,退出待机模式。有灰色的部分都处于后备区域,这些电路在主电源掉电后,可以使用备用电池维持工作,另外还写了,这些模块在待机时都会继续维持供电。有关睡眠、停机、待机,这些低功耗相关的内容,下节学PWR的时候再细讲。
首先,看分频和计数计时部分,这一块的输入时钟是RTCCLK,RTCCLK的来源需要再RCC里进行配置,可选择的选项是这三个,主要选择中间这一路。RTCCLK进来,需要首先经过RTC预分频器进行分频,这个分频器由两个寄存器组成,上面这个是重装寄存器RTC_PRL,下面这个是,RTC_DIV,手册里叫作余数寄存器,但实际上,这一块跟我们之前定时器时基单元里的计数器CNT和重装值ARR,是一样的作用,可能是右边已经有了一个计数器CNT了,所以就比较奇怪,叫做余数寄存器。但实际上它还是计数器的作用。分频器其实就是一个计数器,计几个数溢出一次,那就是几分频,对于可编程的分频器来说,需要有两个寄存器,一个寄存器用来不断地计数,另一个寄存器,写入一个计数目标值,用来配置是几分频,那在这里,上面这个PRL,就是技术目标,写入6,那就是7分频;因为计数值包含了0,所以写入几,那就是几+1分频,这个和定时器是一样的;下面这个DIV就是每来一个时钟计一个数的用途了,是一个自减计数器,每来一个时钟,DIV的值自减一次,自减到0,再来一个输入时钟,DIV输出一个脉冲,产生溢出信号,同时DIV从PRL获取重装值,回到重装值继续自减,比如是32.768KHz,32768HZ,为了分频得到1HZ,PRL就要给32767,这个数值是始终不变的,DIV可以保持初始值为0,那在第一个时钟到来时,DIV就立刻溢出,产生溢出信号给后续电路,同时DIV变为重装值32767,然后继续自减,直到变为0,然后再来一个时钟,产生一个脉冲。每来32768个输入脉冲,计数器溢出一次,产生一个输出脉冲,这就是32768分频了,分频后的时钟频率是1HZ,t提供给后面的秒计数器。计数计数部分,32位可编程计数器RTC_CNT,就是计时最核心的部分,可以把这个计数器看作是Uinx时间戳的秒计数器,这样借用tim.h的函数,就可以很方便地的到年月时分秒了。这个下面,RTC还设计的有一个闹钟寄存器RTC_ALR,这个ALR也是一个32位的寄存器,和上面这个CNT是等宽的,它的作用,顾名思义,就是设置闹钟,可以在ALR写一个秒数,设定闹钟,当CNT的值跟ALR设定的闹钟值一样时,也就是这里画的等号,如果它俩值相等,就代表闹钟响了,这时候就会产生RTC_Alarm闹钟信号,通往右边的中断系统,在中断函数里,你可以执行相应的操作,同时闹钟还兼具一个功能,就是下面这里的,闹钟信号可以让STM32退出待机模式,这个功能就可以对应一些用途,比如你设计一个数据采集设备,需要在环境恶劣的地方工作,比如高原、海底、深井这些地方,然后要求是每天中午12点采集一次环境数据,其他时间,为了节省电量,避免频繁换电池,芯片都必须处于待机模式,这样的话,就可以使用这个RTC自带的闹钟功能,定一个中午12点的闹钟,闹钟一响,芯片唤醒,采集数据,完成后,继续待机。闹钟是个定值只能响一次,所以如果你想实现周期性的闹钟,那在每次闹钟响之后,都需要重新设置一下下一个闹钟时间,这就是闹钟和闹钟唤醒的一个用途。

在往右边看,这就是中断部分了,左边这里有3个信号可以触发中断,第一个RTC_Second秒中断,它的来源就是CNT的输入时钟,如果开启这个中断,那么程序就会每秒进一次RTC中断,第二个是RTC_Overflow,溢出中断,它的来源是CNT的右边,意思就是CNT的32位计数器计满溢出了,会触发一次中断,所以这个中断一般不会触发(2106年)。第三个RTC_Alarm,闹钟中断,当计数值和闹钟值相等时,触发中断,同时,闹钟信号可以把设备从待机模式唤醒,好,这就是三个中断信号,中断信号到右边,这一块是中断标志位和中断输出控制,IE是中断使能,F结尾是对应的中断标志位,最后3个信号通过一个或门,汇聚到NVIC中断控制器。

APB1和APB1接口就是我们程序读写寄存器的地方了,读写寄存器可以通过APB1总线来完成,另外也可以看出,RTC是APB1总线上的设备,
最后下面这一块,退出待机模式,还有一个WKUP引脚,闹钟信号和WKUP引脚,都可以唤醒设备。

在这里插入图片描述
在这里插入图片描述
最左边是RTCCLK时钟来源,这一块需要在RCC配置,3个时,钟选择一个当作RTCCLK,
之后,RTCCLK先通过预分频器,对时钟进行分频,余数计数器是一个自减计数器,存储当前的计数值,重装寄存器是计数目标,决定分频值,分频之后,得到1Hz的秒计数信号,通向32位计数器,一秒自增一次,下面还有一个32位的闹钟值,可以设定闹钟,右边有三个信号可以触发中断,分别是秒信号,计数器溢出信号和闹钟信号,三个信号先通过中断输出控制,进行中断使能,使能的中断才能通向NVIC,然后向CPU申请中断。在程序中,配置这个数据选择器,可以选择时钟来源,配置重装寄存器,可以选择分频系数,配置32位计数器,可以进行日期时间的读写,需要闹钟的话,配置32位闹钟值即可,需要中断的话,先允许中断,再配置NVIC,最后写对应的中断函数即可。

在这里插入图片描述
在这里插入图片描述
电路设计可以看看参考手册。
在这里插入图片描述
第一步,设置RCC_APB1ENR的PWREN和BKPEN,使能PWR和BKP时钟;
第二步,设置PWR_CR的DBP,使能对BKP和RTC的访问。
对应库函数,等待RTC同步:若在读取RTC寄存器时,RTC的APB1接口曾经处于禁止状态,则软件首先必须等待RTC_CRL寄存器中的RSF位(寄存器同步标志)被硬件置1,因为是RTCCLK的时钟,PCL1的频率,与RTCCLK时钟不同步,读出的通常是0,要等一下RTCCLK来一个上升沿,只有有一个上升沿,RTC把它的寄存器的值同步到APB1总线上。这样之后读取的值,就都是没问题的了。
配置标志位:必须设置RTC_CRL寄存器中的CNF位,使RTC进入配置模式后,才能写入RTC_PRL、RTC_CNT、RTC_ALR寄存器。
调用一个等待函数,对RTC任何寄存器的写操作,都必须在前一次写操作结束后进行。可以通过查询RTC_CR寄存器中的RTOFF状态位,判断RTC寄存器是否处于更新中。仅当RTOFF状态位是1时,才可以写入RTC寄存器,还是因为PCLK1和RTCCLK时钟频率不一样,你用PCLK的频率写入之后,这个值还不能立刻更新到RTC的寄存器里,因为RTC寄存器是由RTCCLK驱动的,所以PCLK1写完之后,得等一下RTCCLK的时钟,RTCCLK的时钟来一个上升沿,值更新到RTC寄存器里,整个写入过程才算结束。

在这里插入图片描述
在这里插入图片描述
CNT自增,相较于分频器重装的时机是慢了一个RTCCLK时钟的,之后CNT一直增呀增,直到等于4,此时CNT等于闹钟值,闹钟信号的触发时机,是在CNT=4期间的末尾时刻,和秒信号的上升沿一起的。然后闹钟标志位也会在此刻置1挂起。开启中断,则会进入中断,在中断函数里,由软件清除这个闹钟标志位。
在这里插入图片描述
16位的寄存器:
在这里插入图片描述

问题

总结

本节课主要是了解BKP备份寄存器,实现掉电不丢失,还有RTC实时时钟的操作。

相关文章:

  • QML动画--ParallelAnimation和SequentialAnimation
  • linux查看目录相关命令
  • SpringBoot启动后初始化的几种方式
  • 《关于加快推进虚拟电厂发展的指导意见》解读
  • Windows进程管理
  • 微信、抖音、小红书emoji符号大全
  • 【工具变量】A股上市公司信息披露质量KV指数测算数据集(含do代码 1991-2024年)
  • 多线程使用——线程安全、线程同步
  • -SSRF 服务端请求Gopher 伪协议无回显利用黑白盒挖掘业务功能点
  • Scade 语言词法介绍
  • 4.17--4.19刷题记录(贪心)
  • RTMP握手流程
  • 完整游戏排行榜系统实现
  • Opentelemetry 项目解读
  • 3. 进程概念
  • 点灯大师(第一步)
  • I/O多路转接之select、poll、epoll详解
  • JS中实现类似sleep、wait、delay的延时功能
  • 【今日三题】打怪(模拟) / 字符串分类(字符串哈希) / 城市群数量(dfs)
  • javaSE.判空包装类
  • 俄“联盟MS-26”载人飞船安全返回地球
  • 信心从何而来|当消博会展商遇上关税战
  • 商务部新闻发言人就美对我海事、物流和造船等领域宣布最终措施答记者问
  • 抵制饭圈极端应援,发倡议书还不够
  • “雪豹瘫痪”“漂流小孩哥大闹幼儿园”都是谣言!10起典型案例公布
  • 江西修水警方:一民房内发生刑案,犯罪嫌疑人已被抓获