一、RTC实时时钟简介
RTC(Real-Time Clock)实时时钟是一种可以像时钟一样输出实际时间的电子设备,一般为集成电路,因此也称为时钟芯片。它的主要功能是为我们提供时间、日历及闹钟等与时间相关的服务。
RTC的工作原理基于一个32位的计数器,它以固定的时间间隔(通常为1秒)递增。这个计数器可以通过预分频器来调整,以满足不同应用的需求。当计数器溢出时,它会产生一个中断或者触发其他的事件,比如闹钟功能。RTC模块还具有多种功能,比如自动校准、低功耗模式等,可以进一步提高其灵活性和可靠性。
RTC通常用于在软件或硬件中跟踪时钟时间和日历日期,它的许多功能是非常专业的,是维持高精度和非常可靠的操作所必需的。在STM32F103这样的微控制器中,RTC模块提供了自动闹钟、自动唤醒、定时器和日历功能,可以通过软件配置来实现各种功能。同时,RTC模块还提供了备份寄存器,用于保存RTC模块的配置和状态信息,以便在掉电后能够继续保持数据。
总的来说,单片机RTC实时时钟是一个重要的组成部分,为各种需要时间计数和日期显示的应用场景提供了精确的时间计数和日期显示功能。
下面我们通过STM32F407ZFT6为例进行讲解:
二、新建工程
1、选择芯片型号
2、配置时钟RCC
选择 HSE(外部高速时钟) 为 Crystal/Ceramic Resonator(晶振/陶瓷谐振器)
这个项目我们要用到RTC实时时钟,所以下面的Low Speed Clock也要选上Crystal/Ceramic Resonator(晶振/陶瓷谐振器)
3、Timers里的RTC勾选Activate Clock Source(激活时钟源)和Activate Calendar(激活万年历),只有完成上面这两步操作,才能进行下面的时钟树配置,时钟树我们需要讲To RTC(kHz)前面选择LSE
4、时钟树配置
在clock Configuration中将HCLK配置为最高频率然后回车
RTC 设备因为其独特的运行方式(即掉电依旧运行)使用 HSE 分频时钟或者 LSI 的时候,在主电源 VDD 掉电的情况下,这两个时钟来源都会受到影响,资源消耗太大,小小的纽扣电池根本吃不消。没法保证 RTC 正常工作.所以 RTC 一般都时钟低速外部时钟 LSE。
5、选择调试模式
SYS 设置,选择 Debug 为 Serial Wire
Timebase Source时钟源可以选择SysTick
6、参数配置
7、生成代码
每个外设生成独立的 ’.c/.h’
文件
不勾:所有初始化代码都生成在 main.c
勾选:初始化代码生成在对应的外设文件。
点击 GENERATE CODE 生成代码。
三、修改代码
添加全局变量
在 main.c
头部添加 RTC 相关结构体 GetData
和 GetTime
/* Private variables ---------------------------------------------------------*/
RTC_HandleTypeDef hrtc;
UART_HandleTypeDef huart1;
/* USER CODE BEGIN PV */
RTC_DateTypeDef GetData; //获取日期结构体
RTC_TimeTypeDef GetTime; //获取时间结构体
/* USER CODE END PV */
在while中添加读取时间函数
while (1)
{
/* Get the RTC current Time */
HAL_RTC_GetTime(&hrtc, &GetTime, RTC_FORMAT_BIN);
/* Get the RTC current Date */
HAL_RTC_GetDate(&hrtc, &GetData, RTC_FORMAT_BIN);
/* Display date Format : yy/mm/dd */
printf("%02d/%02d/%02d\r\n",2000 + GetData.Year, GetData.Month, GetData.Date);
/* Display time Format : hh:mm:ss */
printf("%02d:%02d:%02d\r\n",GetTime.Hours, GetTime.Minutes, GetTime.Seconds);
printf("\r\n");
HAL_Delay(1000);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
附带串口重定向代码:
前提是在CubeMx中配置好了串口以及添加了stdio.h头文件
int fputc(int ch,FILE *f)
{
HAL_UART_Transmit (&huart1, (uint8_t *)&ch,1,0xffff);
return ch;
}
int fgetc(FILE *f)
{
uint8_t ch=0;
HAL_UART_Receive (&huart1,&ch,1,0xffff);
}
打印成功:
参考链接:https://blog.csdn.net/qq_36347513/article/details/113663264