前言:本篇笔记参考嘉立创文档,连接放在最后
#RTC相关概念定义
Real-Time Clock 缩写 RTC 翻译 实时时钟,是单片机片内外设的一种,作用于提供准确的时间还有日期,这个外设有独立的电源,当单片机停止供电的时候,仍能保持准确的时间。
RTC由晶振还有计数器组成,晶振产生一个固定频率的信号,计数器对这些信号进行计数,RTC本质上就是一个1S计数器,由此换算出时间,除此之外RTC是一个独立的BCD定时器/计数器,F4的RTC提供一个日历时钟,两个闹钟中断,一个可编程唤醒标志。
#RTC外设电源的选择
#RTC常用的功能介绍
时间和日期表示:RTC可以表示时间日期,他可以跟踪年,月,日,分钟和秒的信息
闹钟功能:通过设置时间还有日期触发闹钟发生中断。
定时器功能:RTC支持定时器功能,可以实现周期性的定时触发。
外部中断触发:可以通过外部中断输入来触发中断事件。
总结:RTC 实时时钟,主要应用就是在掉电或者复位之后,可以准确的提供时间。(使用BAT电源)
#RTC相关代码表示
RTC模块是在后备区域,但是在系统复位或者从待机模式唤醒后,会自动禁止访问后备寄存器和RTC,防止对后备区域的意外操作,所以在配置RTC的时候,要取消备份区域的写保护。
使能对RTC访问:使能对后备寄存器和RTC的访问权限。
设置RTC时钟源:选择外部时钟源和分频系数。
配置RTC结构体:配置RTC结构体基本结构
关闭RTC配置模式:配置结束关闭RTC配置模式
void RTC_ClockInit(void)
{RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);//开启时钟PWR_BackupAccessCmd(ENABLE);//使能备份寄存器RCC_LSICmd(ENABLE);//开启LSI外置低俗晶振RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);//配置RTC时钟来源RCC_RTCCLKCmd(ENABLE);RTC_WaitForSynchro();if(RTC_ReadBackupRegister(RTC_BKP_DR0) != 0x2002) //一个变量,看看RTC初始化没{printf("Set Time and Date.....\r\n");Rtc_TimerConfig();printf("Set End!!\r\n");}PWR_BackupAccessCmd(DISABLE); // 关闭备份寄存器}
void Rtc_TimerConfig(void)
{RTC_WriteProtectionCmd(DISABLE);//关闭系统自动的读写保护RTC_InitTypeDef RTC_InitStruct;RTC_InitStruct.RTC_AsynchPrediv = RTC_HourFormat_24;RTC_InitStruct.RTC_HourFormat =(uint32_t)0x7F;RTC_InitStruct.RTC_SynchPrediv =(uint32_t)0xFF; RTC_Init(&RTC_InitStruct);RTC_TimeTypeDef RTC_TimerStruct;RTC_TimerStruct.RTC_H12 = RTC_H12_AM;RTC_TimerStruct.RTC_Hours = 18;RTC_TimerStruct.RTC_Minutes = 10;RTC_TimerStruct.RTC_Seconds = 1;RTC_SetTime(RTC_Format_BIN,&RTC_TimerStruct);RTC_DateTypeDef RTC_DataStruct;RTC_DataStruct.RTC_Date = 11; RTC_DataStruct.RTC_Month = RTC_Month_March ;RTC_DataStruct.RTC_WeekDay = 1;RTC_DataStruct.RTC_Year = 24;RTC_SetDate(RTC_Format_BIN,&RTC_DataStruct);RTC_EnterInitMode();//关闭RTC编辑模式RTC_WriteBackupRegister(RTC_BKP_DR0,0x2002);RTC_WriteProtectionCmd(ENABLE);}
void RtcShowTime(void)
{// 时间结构体RTC_TimeTypeDef RTC_TimeStructure;// 日期结构体RTC_DateTypeDef RTC_DateStructure; // 获取RTC日期RTC_GetTime(RTC_Format_BIN, &RTC_TimeStructure); // 获取RTC时间RTC_GetDate(RTC_Format_BIN, &RTC_DateStructure);//将获取到的RTC时间BIN二进制再通过串口输出printf("Current time: %d:%d:%d ", \RTC_TimeStructure.RTC_Hours, RTC_TimeStructure.RTC_Minutes, RTC_TimeStructure.RTC_Seconds);printf("%d-%d-%d\n\r", \RTC_DateStructure.RTC_Year, RTC_DateStructure.RTC_Month, RTC_DateStructure.RTC_Date);
}
int BcdToDecimal(int bcd)
{int decimal = 0;int temp = 1;int number = 0;if( bcd >= 0x0A ) // 如果大于或等于10{while(bcd > 0) {number = bcd % 16;decimal += number * temp;temp *= 10;bcd /= 16;}return decimal;}return bcd;}
int main(void)
{board_init();uart1_init(115200U);printf("RTC Init Start.....\r\n");RTC_ClockInit(); // RTC 初始化printf("RTC Init Successful!!\r\n");while(1){//获取RTC时间并通过串口输出RtcShowTime(); delay_ms(1000);}}
#相关实验现象
欢迎指正,希望对你,有所帮助!!!
【立创·天空星STM32F407VET6】入门手册 - 飞书云文档 (feishu.cn)