首页 > 其他分享 >BKP备份寄存器和实时时钟笔记

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

时间:2024-07-10 12:58:11浏览次数:18  
标签:ENABLE RTC 备份 BKP 寄存器 RCC 时钟

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_APB1ENR的PWREN和BKPEN位,使能电源和后备接口时钟
  • 设置寄存器PWR_CR的DBP位,使能对后备寄存器和RTC的访问。

RTC框图

 RTC由两个主要部分组成 

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

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

  1. 第一个模块是RTC的预分频模块,它可编程产生最长为1秒的RTC时间基准TR_CLK。RTC的预分频模块包含了一个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();
	}
}

硬件电路

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

标签:ENABLE,RTC,备份,BKP,寄存器,RCC,时钟
From: https://blog.csdn.net/weixin_51738481/article/details/140306662

相关文章

  • Crontab定时任务更新SOLO以及备份数据库
    Linux定时执行任务Crontab1.安装Crontab1.1安装命令#vixie-cron软件包是cron的主程序yuminstallvixie-cron#crontabs软件包是用来安装、卸装、或列举用来驱动cron守护进程的表格的程序yuminstallcrontabs1.2启动命令#启动服务/sbin/servicecrondstar......
  • K8s 无备份,不运维
    出故障时,就知道是谁在裸泳......
  • 备份和恢复
    mongodump备份mongodump从MongoDB数据库读取数据并创建高保真BSON文件,该mongorestore 工具可以使用该文件填充MongoDB数据库。 mongodump并且mongorestore是用于备份和恢复小型MongoDB部署的简单有效的工具,但并不适合捕获大型系统的备份。mongodump只捕获数据库中的文......
  • 备份脚本
    1.OracleRMAN备份1.1创建目录[oracle@OEL7~]$mkdir-p/u01/dbbak/script[oracle@OEL7~]$cd/u01/dbbak[oracle@OEL7~]$chown-Roracle:oinstallscript[oracle@OEL7~]$mkdir-p/u01/dbbak/db[oracle@OEL7~]$mkdir-p/u01/dbbak/arch[oracle@OEL7~]......
  • 备份脚本backup_log.sh、计划任务
    脚本+计划任务 = 解放了劳动力,提升效率--》实现了自动化操作编写一个脚本backup_log.sh实现备份/var/log目录下的所有日志文件到/backup目录下,要求文件名是包含当天日期,精确到秒,文件名例如:20240308151520-log.tar.gz。同时要求删除/backup目录下七天前的备份文件,只保留最......
  • SpringBoot使用jdbcTemplate连接人大金仓按月备份表
    方式一:采用SELECT*INTOFROM复制表数据以及结构到新表,再清空原表并重置序列代码如下:点击查看代码privatevoidpnsDataCopy(){log.info("{}===>表开始复制",PNS_TABLE);longl=System.currentTimeMillis();TransactionStatustransactionS......
  • 最简 INA226 写寄存器的代码
    #include"hardware/i2c.h"#include"pico/binary_info.h"#defineI2C_SDA16#defineI2C_SCL17voidsetup(){//putyoursetupcodehere,torunonce:Serial.begin(115200);i2c_init(i2c_default,100*1000);gpio_set_functio......
  • iPhone备份数据恢复:三招搞定苹果数据恢复
    在使用iPhone的过程中,我们经常有重要的数据,如照片、联系人、短信等,通过备份功能存储在iCloud或iTunes中。这样无论是因为设备更换、数据意外删除,还是其他原因,都能从备份数据中恢复。下面小编将为大家提供3个从iphone备份中恢复数据的方法,有兴趣的小伙伴请接着往下看!方法一:通......
  • 这一篇让你更了解GPIO_Init()函数,了解CNF和MODE是如何配置输入输出模式,GPIOX_CR端口配置
    1GPIO初始化配置函数 GPIO_Init(GPIOC,&GPIOInitStruct); 1.1  正常的初始化函数代码1.2解读GPIO_Init(GPIOC,&GPIOInitStruct); 所以GPIOC的地址为  0x40000000+0x00010000+0x00001000=0x40011000STM32F103C8T6通用与复用功能I/O(GPIO与AFIO)、......
  • [oeasy]python024_vim读取文件_从头复制到尾_撤销_重做_reg_寄存器
    Guido的简历......