前言:本篇笔记参考嘉立创文档,连接放在最后
#RTC相关概念定义
Real-Time Clock 缩写 RTC 翻译 实时时钟,是单片机片内外设的一种,作用于提供准确的时间还有日期,这个外设有独立的电源,当单片机停止供电的时候,仍能保持准确的时间。
RTC由晶振还有计数器组成,晶振产生一个固定频率的信号,计数器对这些信号进行计数,RTC本质上就是一个1S计数器,由此换算出时间,除此之外RTC是一个独立的BCD定时器/计数器,F4的RTC提供一个日历时钟,两个闹钟中断,一个可编程唤醒标志。
#RTC外设电源的选择
![](https://img-blog.csdnimg.cn/direct/cba8653a7b3c425f9dc5bfc4d40eee93.png)
#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)