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工作原理框图
在这里插入图片描述
其中:最左侧为时钟输入,可由LSE、HSE以及LSI输入,经过RTC_PRER(默认值为128)进行分频,获得时钟为256Hz,再进过第二个RTC_PRER(默认值为256)进行分频,获得时钟1Hz。1Hz用来给秒计时,256Hz充当亚秒计时。闹钟A和闹钟B通过判断器和RTC_TR以及RTC_DR来比较,实现闹钟。下方有自动唤醒的时钟以及寄存器。

二、RTC相关常用寄存器

RTC预分频寄存器(RTC_PRER)
在这里插入图片描述
RTC时间寄存器(RTC_TR)
在这里插入图片描述
RTC日期寄存器(RTC_DR)
在这里插入图片描述
RTC亚秒寄存器(RTC_SSR)
在这里插入图片描述
RTC唤醒定时器寄存器(RTC_WUTR)
在这里插入图片描述
RTC闹钟A/B寄存器(RTC_ALRMAR/RTC_ALRMBR)
在这里插入图片描述
RTC闹钟A/B亚秒寄存器(RTC_ALRMASSR/ RTC_ALRMBSSR)在这里插入图片描述
RTC写保护寄存器(RTC_WPR)
在这里插入图片描述

三、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 相关详解就说明到这里!!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

留小乙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值