RTC实时时钟特征
RTC(Real Time Clock):实时时钟
①是独立的BCD定时器/计数器。RTC提供一个日历时钟,两个可编程闹钟中断,以及一个具有中断功能的周期性可编程唤醒标志。还有管理低功耗模式的自动唤醒单元。
②两个32位寄存器包含二进码十进制格式的秒,分钟,小时,星期几,日期,月份和年份。
③系统自动将月份的天数补偿为28 29 30 31 ,并且还可以进行夏令时补偿。
RTC时钟原理
先选择 LSE、HSE_RTC、LSI的时钟源,进行精密校准,经过分频,提供给日历影子寄存器,两个闹钟寄存器的值可与日历寄存器的值进行比较,相等便产生相应的中断。
BKP备份寄存器
有20个32位的备份寄存器,保存系统配置信息和相关标志位。
位31:0 BPK【31:0】
寄存器由V(BAT)供电,系统复位时,寄存器不会复位。
RTC常用寄存器
-
RTC时间寄存器(RTC_TR)
-
RTC日期寄存器(RTC_DR)
-
RTC亚秒寄存器(RTC_SSR)
-
RTC控制寄存器(RTC CR)
-
RTC初始化和状态寄存器(RTC ISR)
-
RTC预分频寄存器(RTC_PRER)
-
RTC唤醒定时器寄存器(RTC_WUTR)
-
RTC闹钟A寄存器(RTC ALRMAR)
-
RTC闹钟A亚秒寄存器(RTC_ALRMASSR)
-
RTC闹钟B寄存器(RTC_ALRMBR)
-
RTC闹钟B亚秒寄存器(RTC ALRMBSSR)
-
RTC写保护寄存器(RTC_WPR)
-
RTC备份寄存器(RTC BKPXR)
-
RTC时间截时间寄存器(RTC TSTR)
-
RTC时间戳日期寄存器(RTC TSDR)
-
RTC时间截亚秒寄存器(RTC TSSSR)
在这里插入代码片
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 tRTC_AsynchPrediv;//异步分频系数
uint32_tRTC_SynchPrediv;//同步分频系数
}RTC_InitTypeDe
③ RTC周期唤醒相关函数
void RTC_WakeUpClockConfig(uint32_ tRTC_WakeUpClock);
void RTC_SetWakeUpCounter(uint32_tRTC_WakeUpCounter);
uint32_t RTC_GetWakeUpCounter(void);
RTC_WakeUpCmd(DISABLE);//关闭WAKE UP
④ RTC中断配置以及状态相关函数
void RTC_ITConfig(uint32_tRTC_IT,FunctionalState NewState);
FlagStatus RTC_GetFlagStatus(uint32_tRTC_FLAG);
Void RTC_ClearFlag(uint32_tRTC_FLAG);
ITStatus RTC_GetITStatus(uint32_t RTC_IT);void RTC_ClearlTPendingBit(uint32_t RTC IT);
⑤ RTC相关约束函数
void RTC_WriteProtectionCmd(FunctionalState NewState);//取消写保护
ErrorStatus RTC_EnterInitMode(void);//进入配置模式,RTC_ISR_INITF位设置为1
void RTC_ExitlnitMode(void)//退出初始化模式。
⑥RTC闹钟相关函数
ErrorStatus RTC AlarmCmd(uint32_tRTC_Alarm, FunctionalState NewState)
void RTC_SetAlarm(uint32_tRTC_Format,uint32_t RTC_Alarm,
RTC_AlarmTypeDef* RTC_AlarmStruct);
void RTC_GetAlarm(uint32_tRTC_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日历配置相关函数
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_tRTC_Fomat, RTC_DateTypeDef* RTC_Datestruct);
uint32_t RTC GetSubSecond(void);
⑥其他相关函数
uint32_t_RTC_ReadBackupRegister(uint32_tRTC_BKP_DR);
void RTC_WriteBackupRegister(uint32_tRTC_BKP_DR,uint32_t Data)
void RTC_ITConfig(uint32_tRTC_IT,FunctionalState NewState);
RTC 日历配置步骤
====使能PWP时钟:
====使能PWR时钟:RCC_APB1PeriphClockCmd();
====使能后备寄存器访问:PWR BackupAccessCmd();
====配置RTC时钟源,使能RTC时钟:
RCC_RTCCLKConfig();
RCC_RTCCLKcmd0;
如果使用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_SetWakeUpCounter();
====使能WakeUp:
RTC_WakeUpCmd(ENABLE);
====开启配置闹钟中断
RTC_ITConfig();
EXTI_Init();
NVIC_Init();
====编写中断服务函数‘
RTC_WKUP_IRQHandler();
实时时钟实验代码
int main(void)
{
RTC_TimeTypeDef RTC_TimeStruct;
RTC_DateTypeDef RTC_DateStruct;
u8 tbuf[40];
u8 t=0;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组
delay_init(168); //初始化延时函数
uart_init(115200); //初始化串口波特率
usmart_dev.init(84); //初始化USMART
LED_Init(); //初始化LED
LCD_Init(); //初始化LCD
My_RTC_Init(); //初始化¯RTC
RTC_Set_WakeUp(RTC_WakeUpClock_CK_SPRE_16bits,0); //配置WAKE UP中断,1秒钟中断一次
POINT_COLOR=RED;
LCD_ShowString(30,50,200,16,16,"Explorer STM32F4");
LCD_ShowString(30,70,200,16,16,"RTC TEST");
LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
LCD_ShowString(30,110,200,16,16,"2014/5/5");
while(1)
{
t++;
if((t%10)==0) //每100ms更新一次显示数据
{
;
RTC_GetTime(RTC_Format_BIN,&RTC_TimeStruct);
sprintf((char*)tbuf,"Time:%02d:%02d:%02d",RTC_TimeStruct.RTC_Hours,RTC_TimeStruct.RTC_Minutes,RTC_TimeStruct.RTC_Seconds);
LCD_ShowString(30,140,210,16,16,tbuf);
RTC_GetDate(RTC_Format_BIN, &RTC_DateStruct);
sprintf((char*)tbuf,"Date:20%02d-%02d-%02d",RTC_DateStruct.RTC_Year,RTC_DateStruct.RTC_Month,RTC_DateStruct.RTC_Date);
LCD_ShowString(30,160,210,16,16,tbuf);
sprintf((char*)tbuf,"Week:%d",RTC_DateStruct.RTC_WeekDay);
LCD_ShowString(30,180,210,16,16,tbuf);
}
if((t%20)==0)LED0=!LED0; //每200ms,翻转一次LED0
delay_ms(10);
}
}