当前位置:   article > 正文

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

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校准功能 

开启代码

  1. /*备份寄存器访问使能*/
  2. 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寄存器 (调用一个等待函数

 开启代码 

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

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

  1. void MyRTC_Init(void)
  2. {
  3. RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
  4. RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP, ENABLE);
  5. PWR_BackupAccessCmd(ENABLE);
  6. if (BKP_ReadBackupRegister(BKP_DR1) != 0xA5A5)
  7. {
  8. RCC_LSICmd(ENABLE);
  9. while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) != SET);
  10. RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);
  11. RCC_RTCCLKCmd(ENABLE);
  12. RTC_WaitForSynchro();
  13. RTC_WaitForLastTask();
  14. RTC_SetPrescaler(40000 - 1);
  15. RTC_WaitForLastTask();
  16. MyRTC_SetTime();
  17. BKP_WriteBackupRegister(BKP_DR1, 0xA5A5);
  18. }
  19. else
  20. {
  21. RCC_LSICmd(ENABLE); //即使不是第一次配置,也需要再次开启LSI时钟
  22. while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) != SET);
  23. RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);
  24. RCC_RTCCLKCmd(ENABLE);
  25. RTC_WaitForSynchro();
  26. RTC_WaitForLastTask();
  27. }
  28. }

硬件电路

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/820076
推荐阅读
相关标签
  

闽ICP备14008679号