BKP备份寄存器和实时时钟笔记

news2024/9/8 7:10:51

BKP(Backup Registers)备份寄存器

  1. BKP可用于存储用户应用程序数据。当VDD(2.0~3.6V)电源被切断,他们仍然由VBAT(1.8~3.6V)维持供电。当系统在待机模式下被唤醒,或系统复位或电源复位时,他们也不会被复位
  2. TAMPER引脚产生的侵入事件将所有备份寄存器内容清除
  3. RTC引脚输出RTC校准时钟、RTC闹钟脉冲或者秒脉冲
  4. 存储RTC时钟校准寄存器
  5. 用户数据存储容量: 20字节(中容量和小容量)/ 84字节(大容量和互联型)

BKP基本结构 

 BKP控制寄存器用来备份、管理侵入检测和RTC校准功能 

开启代码

/*备份寄存器访问使能*/
PWR_BackupAccessCmd(ENABLE);		//使用PWR开启对备份寄存器的访问
	

RTC(Real Time Clock)实时时钟

特点
  1. RTC是一个独立的定时器,可为系统提供时钟和日历的功能
  2. RTC和时钟配置系统处于后备区域,系统复位时数据不清零,                                          VDD(2.0~3.6V)断电后可借助VBAT(1.8~3.6V)供电继续走时
  3. 32位的可编程计数器,可对应Unix时间戳的秒计数器
  4. 20位的可编程预分频器,分频系数最高为 2^{20}可适配不同频率的输入时钟
  5. 3 个专门的可屏蔽中断:
    闹钟中断,用来产生一个软件可编程的闹钟中断。
    秒中断,用来产生一个可编程的周期性中断信号 ( 最长可达 1 )
    溢出中断,指示内部可编程计数器溢出并回转为 0 的状态。
  6. 可选择三种RTC时钟源:   
  •  HSE时钟除以128(通常为8MHz/128)   
  •  LSE振荡器时钟(通常为32.768KHz)   
  •  LSI振荡器时钟(40KHz) 
       实时时钟是一个独立的定时器。 RTC 模块拥有一组连续计数的计数器,在相应软件配置下,可提供时钟日历的功能。修改计数器的值可以重新设置系统当前的时间和日期。 
        RTC 模块和时钟配置系统 (RCC_BDCR 寄存器 ) 处于后备区域,即在系统复位或从待机模式唤醒 后,RTC 的设置和时间维持不变。
        系统复位后,对后备寄存器和 RTC 的访问被禁止,这是为了防止对后备区域 (BKP) 的意外写操作。
注意 

RTC虽然有三种时钟源,不过只能选 LSE 时钟,因为只有它才能起到断电后会借助VBAT供电

 执行以下操作将使能对后备寄存器和RTC的访问:

  • 设置寄存器RCC_APB1ENRPWRENBKPEN位,使能电源和后备接口时钟
  • 设置寄存器PWR_CRDBP位,使能对后备寄存器和RTC的访问。

RTC框图

 RTC由两个主要部分组成 

APB1 接口:
       用来和 APB1 总线相连。 此单元还包含一组 16 位寄存器,可通过 APB1 总线对其进行读写操作。APB1 接口由 APB1 总 线时钟驱动,用来与 APB1 总线连接。
      通过APB1接口可以访问RTC的相关寄存器(预分频值,计数器值,闹钟值)。
RTC  核心: 

 由一组可编程计数器组成,分成两个主要模块。

  1. 第一个模块是RTC的预分频模块,它可编程产生最长为1秒的RTC时间基准TR_CLKRTC的预分频模块包含了一个20位的可编程分频器(RTC预分频器)。
  2. 第二个模块是一个32位的可编程计数器,可被初始化为当前的系统时间。                              (闹钟)系统时间TR_CLK周期累加并与存储在RTC_ALR寄存器中的可编程时间相比较,如果RTC_CR控制寄存器中设置了相应允许位,比较匹配时将产生一个闹钟中断。(闹钟只能实现一次,然后想要设置周期性,必须每次响后重新设置)

RTC_Second为秒中断,用于刷新时间,
RTC_Overflow是溢出中断。
RTC Alarm 控制开关机

RTC简化结构 

RTC操作注意事项 

1、执行以下操作将使能对BKP和RTC的访问:

  • 设置RCC_APB1ENR的PWREN和BKPEN,使能PWR和BKP时钟     
  • 设置PWR_CR的DBP,使能对BKP和RTC的访问

2、若在读取RTC寄存器时,RTC的APB1接口曾经处于禁止状态,则软件首先必须等待 RTC_CRL寄存器中的RSF位(寄存器同步标志)被硬件置1(库函数RTC等待同步

3、必须设置 RTC_CRL 寄存器中的 CNF 位,使 RTC 进入配置模式后,才能写入 RTC_PRL、RTC_CNT、RTC_ALR寄存器

4、对RTC任何寄存器的写操作,都必须在前一次写操作结束后进行。可以通过查询RTC_CR寄存器中的RTOFF状态位,判断RTC寄存器是否处于更新中。仅当RTOFF状态位是1时,才可以写入RTC寄存器 (调用一个等待函数

 开启代码 

/**
  * 函    数:RTC初始化
  * 参    数:无
  * 返 回 值:无
  */
void MyRTC_Init(void)
{
	/*开启时钟*/
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);		//开启PWR的时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP, ENABLE);		//开启BKP的时钟
	
	/*备份寄存器访问使能*/
	PWR_BackupAccessCmd(ENABLE);					//使用PWR开启对备份寄存器的访问
	
	if (BKP_ReadBackupRegister(BKP_DR1) != 0xA5A5)	
    //通过写入备份寄存器的标志位,判断RTC是否是第一次配置
	//if成立则执行第一次的RTC配置
	{
		RCC_LSEConfig(RCC_LSE_ON);							//开启LSE时钟
		while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) != SET);	//等待LSE准备就绪
		
		RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);			//选择RTCCLK来源为LSE
		RCC_RTCCLKCmd(ENABLE);							//RTCCLK使能
		
		RTC_WaitForSynchro();							//等待同步
		RTC_WaitForLastTask();							//等待上一次操作完成
		
		RTC_SetPrescaler(32768 - 1);			//设置RTC预分频器,预分频后的计数频率为1Hz
		RTC_WaitForLastTask();								//等待上一次操作完成
		
		MyRTC_SetTime();		    //设置时间,调用此函数,全局数组里时间值刷新到RTC硬件电路
		
		BKP_WriteBackupRegister(BKP_DR1, 0xA5A5);		
    	//在备份寄存器写入自己规定的标志位,用于判断RTC是不是第一次执行配置
	}
	else								//RTC不是第一次配置
	{
		RTC_WaitForSynchro();							//等待同步
		RTC_WaitForLastTask();							//等待上一次操作完成
	}
}

如果LSE无法起振导致程序卡死在初始化函数中,
可将初始化函数替换为下述代码,使用LSI当作RTCCLK
LSI无法由备用电源供电,故主电源掉电时,RTC走时会暂停

void MyRTC_Init(void)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP, ENABLE);
	
	PWR_BackupAccessCmd(ENABLE);
	
	if (BKP_ReadBackupRegister(BKP_DR1) != 0xA5A5)
	{
		RCC_LSICmd(ENABLE);
		while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) != SET);
		
		RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);
		RCC_RTCCLKCmd(ENABLE);
		
		RTC_WaitForSynchro();
		RTC_WaitForLastTask();
		
		RTC_SetPrescaler(40000 - 1);
		RTC_WaitForLastTask();
		
		MyRTC_SetTime();
		
		BKP_WriteBackupRegister(BKP_DR1, 0xA5A5);
	}
	else
	{
		RCC_LSICmd(ENABLE);				//即使不是第一次配置,也需要再次开启LSI时钟
		while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) != SET);
		
		RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);
		RCC_RTCCLKCmd(ENABLE);
		
		RTC_WaitForSynchro();
		RTC_WaitForLastTask();
	}
}

硬件电路

以后自己画板子,此电路是个不错备份参考电路

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

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

相关文章

Linux 网络--TCP协议收包流程(NAPI机制)

Linux 网络--TCP协议收包流程(NAPI机制) 平台环境简介:宿主机: ubuntu18.04Linux内核源码版本: Linux-4.15网卡驱动: Intel e1000 (ubuntu 虚拟机默认网卡驱动)协议:TCP协议,本文分析收包过程 本…

Django 更新数据 save()方法

1,添加模型 Test/app11/models.py from django.db import modelsclass Post(models.Model):title models.CharField(max_length200)content models.TextField()pub_date models.DateTimeField(date published)class Book(models.Model):title models.CharFie…

9.pwn 栈溢出

栈溢出简介 函数中的存储在栈中的局部变量数组边界检查不严格发生越界写,造成用户输入覆盖到缓冲区外的数据内容, 由于栈中同时存在着与函数调用参数的相关信息,栈溢出可以导致控制流劫持 基础栈溢出(hello world in pwn) 多数情况下我们需…

【 正己化人】 把自己做好,能解决所有问题

阳明先生说:与朋友一起辩论学问,纵然有人言辞观点浅近粗疏,或者是炫耀才华、显扬自己,也都不过是毛病发作。只要去对症下药就好,千万不能怀有轻视别人的心理,因为那不是君子与人为善的心。 人会爱发脾气、…

UE5.3-基础蓝图类整理一

常用蓝图类整理: 1、获取当前关卡名:Get Current LevelName 2、通过关卡名打开关卡:Open Level(by name) 3、碰撞检测事件:Event ActorBeginOverlap 4、获取当前player:Get Player Pawn 5、判断是否相等&#xff1…

阿里云人工智能平台PAI部署开源大模型chatglm3之失败记录--update:最后成功了!

想学习怎么部署大模型,跟着网上的帖子部署了一个星期,然而没有成功。失败的经历也是经历,记在这里。 我一共创建了3个实例来部署chatglm3,每个实例都是基于V100创建的(当时没有A10可选了),其显…

自动化测试之unittest框架详解

1、什么是Unittest框架? python自带一种单元测试框架 2、为什么使用UnitTest框架? >批量执行用例 >提供丰富的断言知识 >可以生成报告 3、核心要素 1).TestCase(测试用例) 2).TestSuite(测试套件) 3).Test…

比赛获奖的武林秘籍:05 电子计算机类比赛国奖队伍技术如何分工和学习内容

比赛获奖的武林秘籍:05 电子计算机类比赛国奖队伍技术如何分工和学习内容 摘要 本文主要介绍了在电子计算机类比赛中技术层面上的团队分工和需要学习的内容,分为了嵌入式硬件、嵌入式软件、视觉图像处理、机械、上位机软件开发和数据分析等六个方向&am…

ORA-12537: TNS:连接关闭/Io 异常: Got minus one from a read call

在另外一个数据库建立dblink的时候,发现执行命令报错: 被连接的数据库我也上去过,用工具尝试登陆也报错: IO Error: Got minus one from a read call, connect lapse 1 ms., Authentication lapse 0 ms. Got minus one from a …

PTA - 编写函数计算圆面积

题目描述: 1.要求编写函数getCircleArea(r)计算给定半径r的圆面积,函数返回圆的面积。 2.要求编写函数get_rList(n) 输入n个值放入列表并将列表返回 函数接口定义: getCircleArea(r); get_rList(n); 传入的参数r表示圆的半径&#xff0c…

新闻资讯整合平台:一站式满足企业信息需求

摘要: 面对信息爆炸的时代,企业如何在海量数据中快速获取有价值资讯,成为提升竞争力的关键。本文将探讨如何通过一站式新闻资讯整合平台,实现企业信息需求的全面满足,提升决策效率,同时介绍实用工具推荐&a…

如何构建数据驱动的企业?爬虫管理平台是关键桥梁吗?

一、数据驱动时代:为何选择爬虫管理平台? 在信息爆炸的今天,数据驱动已成为企业发展的核心战略之一。爬虫管理平台,作为数据采集的第一站,它的重要性不言而喻。这类平台通过自动化手段,从互联网的各个角落…

AI Earth——1990-2022年全国月度气象数据检索应用app

应用结果 代码 #导入安装包 import os import json import datetime import streamlit as st import streamlit.components.v1 as components import traceback from PIL import Imageimport aie#读取当前目录的内容 current_work_dir = os.path.dirname(__file__) #添加地图…

PolarisMesh源码系列——服务端启动流程

前话 PolarisMesh(北极星)是腾讯开源的服务治理平台,致力于解决分布式和微服务架构中的服务管理、流量管理、配置管理、故障容错和可观测性问题,针对不同的技术栈和环境提供服务治理的标准方案和最佳实践。 PolarisMesh 官网&am…

开发个人Go-ChatGPT–6 OpenUI

开发个人Go-ChatGPT–6 OpenUI Open-webui Open WebUI 是一种可扩展、功能丰富且用户友好的自托管 WebUI,旨在完全离线运行。它支持各种 LLM 运行器,包括 Ollama 和 OpenAI 兼容的 API。 功能 由于总所周知的原由,OpenAI 的接口需要密钥才…

网络安全——防御实验

防御实验一 拓扑结构展示: 一、 根据题目,先为办公区做安全策略主要策略有以下几点: 1、书写名称和描述,名称和描述要明确,让除本人以外的人也能理解 2、确定源地址为办公区,目标地址为DMZ区 3、确定时间…

QT程序异常结束解决方法

在用QT开发第三方SDK的时候,刚开始是运行正常的,但是重装系统之后再次运行程序总是出现:程序异常结束。 以下方法尝试无效,但不失为一种排查方法: 重新安装QT;检查Qt Creator配置,编译器位数和…

java LogUtil输出日志打日志的class文件内具体方法和行号

最近琢磨怎么把日志打的更清晰,方便查找问题,又不需要在每个class内都创建Logger对象,还带上不同的颜色做区分,简直不要太爽。利用堆栈的方向顺序拿到日志的class问题。看效果,直接上代码。 1、demo test 2、输出效果…

什么是O2O?线上线下怎么完美结合?

现如今互联网技术飞速发展,智能手机普及。O2O(Online To Offline)模式已经成为一种新的商业模式,人们的生活和消费习惯也逐渐被改变。经常听到企业提到“O2O”,它究竟是什么呢?对企业有着什么魅力呢&#x…

随笔(一)

1.即时通信软件原理(发展) 即时通信软件实现原理_即时通讯原理-CSDN博客 笔记: 2.泛洪算法: 算法介绍 | 泛洪算法(Flood fill Algorithm)-CSDN博客 漫水填充算法实现最常见有四邻域像素填充法&#xf…