RTC实时时钟原理+BKP

一.RTC实时时钟原理+BKP

  • 探索者STM32F4开发板

     《STM32F4开发指南-库函数版本》-第20章  RTC实时时钟实验
  • STM32F4xx官方资料:
    《STM32F4中文参考手册 》-第23章 实时时钟(RTC)

二.RTC实时时钟特征与原理

  • RTC (Real Time Clock):实时时钟
  • RTC是个独立的BCD定时器/计数器。RTC 提供一个日历时钟,两个可编程闹钟中断,以及一个具有中断功能的周期性可编程唤醒标志。RTC还包含用于管理低功耗模式的自动唤醒单元。
  • 两个32位寄存器包含二进码十进制格式(BCD)的秒,分钟,小时(12或24小时制),星期几,日期,月份和年份。此外,还可以提供二进制的亚秒值。
  • 系统可以自动将月份的天数补偿为28,29(闰年),30,31天。并且还可以进行夏令时补偿。
  • 其他32位寄存器还包含可编程的闹钟亚秒,秒,分钟,小时,星期几和日期。
  • 此外,还可以使用数字校准功能对晶振精度的偏差进行补偿。
  • 上电复位后,所有的RTC寄存器都会受到保护,以防止可能的非正常写访问。
  • RTC模块和时钟配置是在后备区域,即在系统复位或者待机模式唤醒后RTC的设置和时间维持不变,只要后备区域供电正常,RTC将一直工作下去。但是在系统复位之后会自动禁止访问后备区域和RTC,以防止意外操作,所以在设置时间之前,要先取消后备区域写保护。

1.RTC特征

RTC特征

RTC特征(1)

2.RTC工作原理框图

RTC工作原理框图

三.RTC原理

1.RTC时钟源

RTC时钟源

2.RTC BKP备份寄存器

提醒:一共有20个32位备份寄存器。常用来保存一些系统配置信息和相关标志位。

RTC BKP备份寄存器

四.RTC常用寄存器

1.RTC相关常用寄存器

  1. RTC时间寄存器(RTC_TR)
  2. RTC日期寄存器(RTC_DR)
  3. RTC亚秒寄存器(RTC_SSR)
  4. RTC控制寄存器(RTC_CR)
  5. RTC初始化和状态寄存器(RTC_ISR)
  6. RTC预分频寄存器(RTC_PRER)
  7. RTC唤醒定时器寄存器(RTC_WUTR)
  8. RTC闹钟A寄存器(RTC_ALRMAR)
  9. RTC闹钟A亚秒寄存器(RTC_ALRMASSR)
  10. RTC闹钟B寄存器( RTC_ALRMBR)
  11. RTC闹钟B亚秒寄存器(RTC_ALRMBSSR)
  12. RTC写保护寄存器(RTC_WPR)
  13. RTC备份寄存器(RTC_BKPxR)
  14. RTC时间戳时间寄存器(RTC_TSTR)
  15. RTC时间戳日期寄存器(RTC_TSDR)
  16. RTC时间戳亚秒寄存器(RTC_TSSSR)

2.RTC预分频寄存器(RTC_PRER)

RTC预分频寄存器(RTC_PRER)

3.RTC时间寄存器(RTC_TR)

RTC时间寄存器(RTC_TR)

4.RTC日期寄存器(RTC_DR)

RTC日期寄存器(RTC_DR)

5.RTC亚秒寄存器(RTC_SSR)

RTC亚秒寄存器(RTC_SSR)

6.RTC控制寄存器(RTC_CR)

RTC控制寄存器(RTC_CR)

每个位的含义,看中文参考手册CR寄存器描述

7.RTC初始化和状态寄存器(RTC_ISR)

RTC初始化和状态寄存器(RTC_ISR)

每个位的含义,看中文参考手册CR寄存器描述

8.RTC唤醒定时器寄存器(RTC_WUTR)

RTC唤醒定时器寄存器(RTC_WUTR)

9.RTC闹钟A/B寄存器(RTC_ALRMAR/ RTC_ALRMBR)

RTC闹钟A/B寄存器(RTC_ALRMAR/ RTC_ALRMBR)

闹钟A和B描述一致

10.RTC闹钟A/B亚秒寄存器(RTC_ALRMASSR/ RTC_ALRMBSSR)

RTC闹钟A/B亚秒寄存器(RTC_ALRMASSR/ RTC_ALRMBSSR)

闹钟A和B描述一致

11.RTC写保护寄存器(RTC_WPR)

RTC写保护寄存器(RTC_WPR)

五.RTC相关库函数

库函数所在文件: stm32f4xx_rtc.c / stm32f4xx_rtc.h

1.相关常用库函数

ErrorStatus RTC_Init(RTC_InitTypeDef* RTC_InitStruct);
ErrorStatus RTC_EnterInitMode(void);
void RTC_ExitInitMode(void);
ErrorStatus RTC_SetTime(uint32_t RTC_Format, RTC_TimeTypeDef* RTC_TimeStruct);
void RTC_GetTime(uint32_t RTC_Format, RTC_TimeTypeDef* RTC_TimeStruct);
uint32_t RTC_GetSubSecond(void);
ErrorStatus RTC_SetDate(uint32_t RTC_Format, RTC_DateTypeDef* RTC_DateStruct);
void RTC_GetDate(uint32_t RTC_Format, RTC_DateTypeDef* RTC_DateStruct);
void RTC_SetAlarm();
void RTC_GetAlarm();
ErrorStatus RTC_AlarmCmd(uint32_t RTC_Alarm, FunctionalState NewState);
void RTC_AlarmSubSecondConfig(uint32_t RTC_Alarm, uint32_t RTC_AlarmSubSecondValue, uint32_t RTC_AlarmSubSecondMask);
uint32_t RTC_GetAlarmSubSecond(uint32_t RTC_Alarm);

2.RTC时钟源和时钟操作函数

 void RCC_RTCCLKConfig(uint32_t  CLKSource);//时钟源选择
 void RCC_RTCCLKCmd(FunctionalState NewState)//时钟使能

3.RTC初始化函数

ErrorStatus RTC_Init(RTC_InitTypeDef* RTC_InitStruct);
typedef struct
{ uint32_t RTC_HourFormat;   //小时格式:24/12
  uint32_t RTC_AsynchPrediv;  //异步分频 系数
  uint32_t RTC_SynchPrediv; //同步分频系数
}RTC_InitTypeDe
ErrorStatus RTC_Init(RTC_InitTypeDef* RTC_InitStruct);
typedef struct
{ uint32_t RTC_HourFormat;   //小时格式:24/12
  uint32_t RTC_AsynchPrediv;  //异步分频 系数
  uint32_t RTC_SynchPrediv; //同步分频系数
}RTC_InitTypeDe

4.RTC日历配置相关函数

 ErrorStatus RTC_SetTime(uint32_t RTC_Format, RTC_TimeTypeDef* RTC_TimeStruct);
 void RTC_GetTime(uint32_t RTC_Format, RTC_TimeTypeDef* RTC_TimeStruct);
 ErrorStatus RTC_SetDate(uint32_t RTC_Format, RTC_DateTypeDef* RTC_DateStruct);
 void RTC_GetDate(uint32_t RTC_Format, RTC_DateTypeDef* RTC_DateStruct);
 uint32_t RTC_GetSubSecond(void);

5.RTC闹钟相关函数

ErrorStatus RTC_AlarmCmd(uint32_t RTC_Alarm, FunctionalState NewState)
void RTC_SetAlarm(uint32_t RTC_Format, uint32_t RTC_Alarm,   
                                                          RTC_AlarmTypeDef* RTC_AlarmStruct);
void RTC_GetAlarm(uint32_t RTC_Format, uint32_t RTC_Alarm, 
                                                         RTC_AlarmTypeDef* RTC_AlarmStruct);
void RTC_AlarmSubSecondConfig(uint32_t RTC_Alarm, uint32_t RTC_AlarmSubSecondValue, 
                                                               uint32_t RTC_AlarmSubSecondMask) 
uint32_t RTC_GetAlarmSubSecond(uint32_t RTC_Alarm);

6.RTC周期唤醒相关函数

void RTC_WakeUpClockConfig(uint32_t RTC_WakeUpClock);
void RTC_SetWakeUpCounter(uint32_t RTC_WakeUpCounter);
uint32_t RTC_GetWakeUpCounter(void);
RTC_WakeUpCmd(DISABLE);//关闭WAKE UP

7.RTC 中断配置以及状态相关函数

void RTC_ITConfig(uint32_t RTC_IT, FunctionalState NewState);
FlagStatus RTC_GetFlagStatus(uint32_t RTC_FLAG);
void RTC_ClearFlag(uint32_t RTC_FLAG);
ITStatus RTC_GetITStatus(uint32_t RTC_IT);
void RTC_ClearITPendingBit(uint32_t RTC_IT);

8.RTC相关约束函数

 void RTC_WriteProtectionCmd(FunctionalState NewState);//取消写保护
 ErrorStatus RTC_EnterInitMode(void);//进入配置模式,RTC_ISR_INITF位设置为1
 void RTC_ExitInitMode(void)//退出初始化模式。

9.其他相关函数

uint32_t RTC_ReadBackupRegister(uint32_t RTC_BKP_DR);
void RTC_WriteBackupRegister(uint32_t RTC_BKP_DR, uint32_t Data)
void RTC_ITConfig(uint32_t RTC_IT, FunctionalState NewState);

六.配置一般步骤

1.RTC日历

  1. 使能PWR时钟:RCC_APB1PeriphClockCmd();
  2. 使能后备寄存器访问: PWR_BackupAccessCmd();
  3. 配置RTC时钟源,使能RTC时钟:

RCC_RTCCLKConfig();
RCC_RTCCLKCmd();
​ 如果使用LSE,要打开LSE:RCC_LSEConfig(RCC_LSE_ON);

  1. 初始化RTC(同步/异步分频系数和时钟格式):RTC_Init ();
  2. 设置时间:RTC_SetTime ();
  3. 设置日期:RTC_SetDate();

2.RTC闹钟

  1. RTC已经初始化好相关参数。
  2. 关闭闹钟:RTC_AlarmCmd(RTC_Alarm_A,DISABLE);
  3. 配置闹钟参数:RTC_SetAlarm();
  4. 开启闹钟:RTC_AlarmCmd(RTC_Alarm_A,EABLE);
  5. 开启配置闹钟中断:

     RTC_ITConfig();
     EXTI_Init();
     NVIC_Init();
  6. 编写中断服务函数:RTC_Alarm_IRQHandler();

3.RTC周期性自动唤醒

  1. RTC已经初始化好相关参数。
  2. 关闭WakeUp:RTC_WakeUpCmd(DISABLE);
  3. 配置WakeUp时钟分频系数/来源: RTC_WakeUpClockConfig();
  4. 设置WakeUp自动装载寄存器:

        RTC_SetWakeUpCounter();
  5. 使能WakeUp : RTC_WakeUpCmd( ENABLE);
  6. 开启配置闹钟中断:

        RTC_ITConfig();
        EXTI_Init();
        NVIC_Init();
  7. 编写中断服务函数: RTC_WKUP_IRQHandler();
最后修改:2020 年 02 月 26 日 09 : 48 AM
如果觉得我的文章对你有用,请随意赞赏