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

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();
	}
}

硬件电路

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

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-10 00:50:05       49 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-10 00:50:05       53 阅读
  3. 在Django里面运行非项目文件

    2024-07-10 00:50:05       42 阅读
  4. Python语言-面向对象

    2024-07-10 00:50:05       53 阅读

热门阅读

  1. Visual Studio编译优化选项

    2024-07-10 00:50:05       16 阅读
  2. Pywinauto:强大的Windows 应用程序测试工具

    2024-07-10 00:50:05       20 阅读
  3. Linux grep技巧 结合awk查询

    2024-07-10 00:50:05       14 阅读
  4. Appium:强大的移动应用测试工具

    2024-07-10 00:50:05       19 阅读
  5. 宝塔-Linux模板常用命令-centos7

    2024-07-10 00:50:05       15 阅读
  6. 仙人掌中的SNMP检测不到服务器

    2024-07-10 00:50:05       18 阅读
  7. 算法力扣刷题 三十四【71.简化路径】

    2024-07-10 00:50:05       18 阅读
  8. yolov5:Conv类参数量计算

    2024-07-10 00:50:05       23 阅读
  9. GitHub每日最火火火项目(7.9)

    2024-07-10 00:50:05       19 阅读
  10. py基础语法简述

    2024-07-10 00:50:05       16 阅读