RTC实时时钟

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常用寄存器

  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)在这里插入代码片

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

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

。✧* ꧁流痕꧂✧*。

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

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

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

打赏作者

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

抵扣说明:

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

余额充值