STM32F4 RTC详解

一、RTC介绍

RTC(Real Time Clock):实时时钟。
RTC是个独立的BCD定时器/计数器。RTC 提供一个日历时钟,两个可编程闹钟中断,以及一个具有中断功能的周期性可编程唤醒标志。RTC还包含用于管理低功耗模式的自动唤醒单元。两个32位寄存器包含二进码十进制格式(BCD)的秒,分钟,小时(12或24小时制),星期几,日期,月份和年份。此外,还可以提供二进制的亚秒值。系统可以自动将月份的天数补偿为28,29(闰年),30,31天。上电复位后,所有的RTC寄存器都会受到保护,以防止可能的非正常写访问。RTC模块和时钟配置是在后备区域,即在系统复位或者待机模式唤醒后RTC的设置和时间维持不变,只要后备区域供电正常,RTC将一直工作下去。但是在系统复位之后会自动禁止访问后备区域和RTC,以防止意外操作,所以在设置时间之前,要先取消后备区域写保护。
二、RTC工作原理框图
STM32F4 RTC详解_第1张图片
其中:最左侧为时钟输入,可由LSE、HSE以及LSI输入,经过RTC_PRER(默认值为128)进行分频,获得时钟为256Hz,再进过第二个RTC_PRER(默认值为256)进行分频,获得时钟1Hz。1Hz用来给秒计时,256Hz充当亚秒计时。闹钟A和闹钟B通过判断器和RTC_TR以及RTC_DR来比较,实现闹钟。下方有自动唤醒的时钟以及寄存器。

二、RTC相关常用寄存器

RTC预分频寄存器(RTC_PRER)
STM32F4 RTC详解_第2张图片
RTC时间寄存器(RTC_TR)
STM32F4 RTC详解_第3张图片
RTC日期寄存器(RTC_DR)
STM32F4 RTC详解_第4张图片
RTC亚秒寄存器(RTC_SSR)
STM32F4 RTC详解_第5张图片
RTC唤醒定时器寄存器(RTC_WUTR)
STM32F4 RTC详解_第6张图片
RTC闹钟A/B寄存器(RTC_ALRMAR/RTC_ALRMBR)
STM32F4 RTC详解_第7张图片
RTC闹钟A/B亚秒寄存器(RTC_ALRMASSR/ RTC_ALRMBSSR)STM32F4 RTC详解_第8张图片
RTC写保护寄存器(RTC_WPR)
STM32F4 RTC详解_第9张图片

三、RTC相关库函数讲解

RTC时钟源和时钟操作函数:

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

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

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

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

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

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

RTC相关约束函数:

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

其他相关函数:

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)

四、RTC日历配置一般步骤

  • ①使能PWR时钟:
RCC_APB1PeriphClockCmd();
  • ② 使能后备寄存器访问: `
 PWR_BackupAccessCmd();`
  • ③ 配置RTC时钟源,使能RTC时钟:
 RCC_RTCCLKConfig();
 RCC_RTCCLKCmd();
如果使用LSE,要打开LSE:
RCC_LSEConfig(RCC_LSE_ON);
  • ④ 初始化RTC(同步/异步分频系数和时钟格式):
RTC_Init ();`
  • ⑤ 设置时间:
 RTC_SetTime ();
  • ⑥设置日期:
 RTC_SetDate()

五、RTC闹钟配置一般步骤:

  • RTC已经初始化好相关参数
  • 关闭闹钟:
RTC_AlarmCmd(RTC_Alarm_A,DISABLE); 
  • 配置闹钟参数:
RTC_SetAlarm();
  • 开启闹钟:
RTC_AlarmCmd(RTC_Alarm_A,EABLE);
  • 开启配置闹钟中断:
 RTC_ITConfig();
 EXTI_Init();
 NVIC_Init();
  • 编写中断服务函数:
RTC_Alarm_IRQHandler();

六、RTC周期性自动唤醒配置一般步骤:

  • RTC已经初始化好相关参数
  • 关闭WakeUp:
RTC_WakeUpCmd(DISABLE);
  • 配置WakeUp时钟分频系数/来源:
 RTC_WakeUpClockConfig();
  • 设置WakeUp自动装载寄存器:
 RTC_SetWakeUpCounter();
  • 使能WakeUp :
 RTC_WakeUpCmd( ENABLE);
  • 开启配置闹钟中断:
 RTC_ITConfig();
 EXTI_Init();
 NVIC_Init();
  • 编写中断服务函数:
 RTC_WKUP_IRQHandler();

RTC 相关详解就说明到这里!!!

你可能感兴趣的:(STM32F4,stm32,嵌入式)