前言
前面我们说了OLED实验,是一个比较好的显示测试代码的方法。现在我们学习关于RTC实时时钟的相关配置。
一、RTC是什么?
STM32F4 的实时时钟(RTC)相对于 STM32F1 来说,改进了不少,带了日历功能了,STM32F4 的 RTC,是一个独立的 BCD 定时器/计数器。RTC 提供一个日历时钟(包含年月日时分秒信息)、两个可编程闹钟(ALARM A 和 ALARM B)中断,以及一个具有中断功能的周期性可编程唤醒标志。RTC 还包含用于管理低功耗模 式的自动唤醒单元。
两个 32 位寄存器(TR 和 DR)包含二进码十进数格式 (BCD) 的秒、分钟、小时(12 或24 小时制)、星期、日期、月份和年份。此外,还可提供二进制格式的亚秒值。
STM32F4 的 RTC 可以自动将月份的天数补偿为 28、29(闰年)、30 和 31 天。并且还可以进行夏令时补偿。
二、RTC实时时钟实验
1.实验所需配置功能
1、RTC配置
2、采用LCD实时显示
2.功能配置
1、RTC时钟配置(只演示时钟,不演示闹钟和唤醒事件,可仿照原子代码编写)
2、LCD显示配置请参考【STM32F4】HAL库 CubeMX(十二)--------LCD显示实验
3.时钟配置
RCC时钟配置如前文一样(此处一般情况是不变的)。
【STM32F4】HAL库 CubeMX(一)--------创建工程(点亮LED)
4.生成代码
1、添加LCD代码
2、定义变量
uint8_t t = 0;
uint8_t tbuf[40];
RTC_DateTypeDef RTC_DateStruct;
RTC_TimeTypeDef RTC_TimeStruct;
3、添加以下操作代码
LCD_Init();
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");
t++;
if((t%10)==0)
{
HAL_RTC_GetTime(&hrtc,&RTC_TimeStruct,RTC_FORMAT_BIN);
sprintf((char*)tbuf,"Time:%02d:%02d:%02d",RTC_TimeStruct.Hours,RTC_TimeStruct.Minutes,RTC_TimeStruct.Seconds);
LCD_ShowString(30,140,210,16,16,tbuf);
HAL_RTC_GetDate(&hrtc,&RTC_DateStruct,RTC_FORMAT_BIN);
sprintf((char*)tbuf,"Date:20%02d-%02d-%02d",RTC_DateStruct.Year,RTC_DateStruct.Month,RTC_DateStruct.Date);
LCD_ShowString(30,160,210,16,16,tbuf);
sprintf((char*)tbuf,"Week:%d",RTC_DateStruct.WeekDay);
LCD_ShowString(30,180,210,16,16,tbuf);
}
HAL_Delay(10);
注意事项
在学习中遇到一点bug
1、读取时间之后必须读取日期,否则读不出来。
2、设置时间之后必须设置日期,否则也有问题。
望有大佬可以解答。