【物联网学习笔记】RTC

发布时间:2026/5/27 23:38:21

【物联网学习笔记】RTC 前言本文是本人备赛物联网赛项的学习笔记主要供本人学习、复习不是经验分享或教学若有错误大佬轻喷。一、RTC 基础概念扫盲1.1 什么是 RTCRTCReal-Time Clock实时时钟是 STM32 芯片内置的独立外设核心作用是精准记录年、月、日、星期、时、分、秒系统掉电后可通过备用电池如 CR2032 纽扣电池持续走时重新上电无需重新设置时间。注意RTC 是芯片内部功能没有和任何 GPIO 引脚相连无需配置 GPIO 即可使用二、CubeMX 全流程配置保姆级步骤2.1 新建基础工程打开 STM32CubeMX点击ACCESS TO MCU SELECTOR搜索框输入STM32WLE5CCU6选中芯片后点击Start Project。2.2 配置 RCC外部晶振RTC 精准走时的关键RTC 的精准走时依赖外部低速晶振LSE必须配置左侧Pinout Configuration→ System Core →RCCLow Speed Clock (LSE)选择Crystal/Ceramic Resonator外部晶振模式High Speed Clock (HSE) 根据开发板硬件选择对应模式即可2.3 配置 USART2用于串口打印验证为了后续能通过串口查看 RTC 时间先配置基础串口Connectivity →USART2Mode 选择Asynchronous异步通信Parameter Settings 保持默认波特率 115200 Bits/s数据位 8停止位 1无校验。2.4 RTC 核心功能配置重点这是 RTC 正常工作的核心步骤一步都不能错Timers →RTCMode 模式配置勾选Activate Clock Source激活 RTC 时钟源勾选Activate Calendar激活日历功能Parameter Settings 参数配置Hour Format选择Hour Format 2424 小时制新手友好Asynchronous/Synchronous Predivider保持默认值异步 127、同步 25532768kHz 晶振分频后刚好 1Hz 秒计数Data Format选择BIN二进制格式方便代码读取Calendar TimeHours/Minutes/Seconds 为上电默认时间直接修改这里的数值即可设置初始时间Calendar DateYear/Month/Date/WeekDay 为默认日期新手先保持默认实际项目按需修改。2.5 时钟树配置顶部Clock Configuration确认 RTC 时钟源选择为LSE外部低速晶振确保走时精准其他参数保持默认点击空白处自动完成时钟树计算。2.6 工程生成配置顶部Project ManagerProject 选项卡设置工程名称、存放路径重点路径绝对不能有中文、空格、特殊字符Toolchain/IDE 选择MDK-ARM V5Code Generator 选项卡勾选Generate peripheral initialization as a pair of .c/.h files per peripheral每个外设生成独立文件代码更清晰。点击右上角GENERATE CODE生成代码弹出提示后点击Open Project打开 Keil 工程。三、逐行注释代码实现仅聚焦 RTC我们创建两个独立文件app.h和app.c将原讲义的zsdz统一替换为通用的app完全解耦 CubeMX 生成的代码重新生成 CubeMX 代码不会被覆盖。3.1 编写 app.h 头文件头文件核心作用是定义 RTC 时间结构体、声明全局变量与函数防止头文件重复包含。#ifndef __APP_H // 防止头文件被重复包含的宏定义 #define __APP_H #include string.h // 引入字符串操作头文件基础依赖 #include stdio.h // 引入标准输入输出头文件printf串口打印依赖 #include gpio.h // 引入GPIO驱动头文件基础依赖 // 定义RTC时间存储结构体统一封装年月日周、时分秒 typedef struct { unsigned char Year; // 存储RTC读取的年份值 unsigned char Month; // 存储RTC读取的月份值范围1-12 unsigned char WeekDay; // 存储RTC读取的星期值范围1-7 unsigned char Date; // 存储RTC读取的日期值范围1-31 unsigned char Hours; // 存储RTC读取的小时值范围0-23 unsigned char Minutes; // 存储RTC读取的分钟值范围0-59 unsigned char Seconds; // 存储RTC读取的秒数值范围0-59 }RTC_APP; extern RTC_APP rtc_value; // 声明全局RTC结构体变量供其他文件如main.c直接调用 void app_read_RTC(void); // 声明RTC时间读取核心函数 #endif // 头文件结束标记3.2 编写 app.c 源文件源文件实现头文件中声明的函数核心是RTC 时间的读取逻辑。#include app.h // 包含自定义头文件获取RTC结构体和函数声明 RTC_APP rtc_value; // 定义全局RTC结构体变量实际存储读取到的RTC时间 // 函数功能从RTC外设读取当前时间日期存入全局结构体rtc_value中 // 入口参数无 // 返回值无 // 备注必须先读时间再读日期顺序不能反 void app_read_RTC(void) { extern RTC_HandleTypeDef hrtc; // 声明外部RTC句柄由CubeMX生成定义在rtc.c中 RTC_DateTypeDef data_value; // 定义HAL库标准日期结构体临时存储日期数据 RTC_TimeTypeDef time_value; // 定义HAL库标准时间结构体临时存储时间数据 // 【新手必记坑点】必须先调用HAL_RTC_GetTime读取时间 // 参数1RTC句柄参数2时间存储结构体参数3数据格式RTC_FORMAT_BIN二进制 HAL_RTC_GetTime(hrtc, time_value, RTC_FORMAT_BIN); // 【新手必记坑点】必须再调用HAL_RTC_GetDate读取日期两个函数必须成对调用 HAL_RTC_GetDate(hrtc, data_value, RTC_FORMAT_BIN); // 将读取到的日期数据赋值给全局RTC结构体 rtc_value.Year data_value.Year; // 年份赋值 rtc_value.Month data_value.Month; // 月份赋值 rtc_value.WeekDay data_value.WeekDay; // 星期赋值 rtc_value.Date data_value.Date; // 日期赋值 // 将读取到的时间数据赋值给全局RTC结构体 rtc_value.Hours time_value.Hours; // 小时赋值 rtc_value.Minutes time_value.Minutes; // 分钟赋值 rtc_value.Seconds time_value.Seconds; // 秒数赋值 }3.3 修改 main.c 主函数重点提醒所有用户代码必须写在USER CODE BEGIN X和USER CODE END X之间否则重新生成 CubeMX 代码时会被覆盖步骤 1引入头文件找到USER CODE BEGIN Includes代码段添加如下代码/* USER CODE BEGIN Includes */ #include app.h // 引入我们自定义的RTC头文件 #include stdio.h // 引入标准输入输出头文件printf依赖 /* USER CODE END Includes */步骤 2添加 printf 重定向代码找到USER CODE BEGIN 0代码段添加串口 printf 重定向代码否则无法通过串口打印时间/* USER CODE BEGIN 0 */ // printf串口重定向函数将printf的输出重定向到USART2 int fputc(int ch, FILE *f) { extern UART_HandleTypeDef huart2; // 声明外部USART2句柄由CubeMX生成 // 通过USART2发送一个字符参数1USART2句柄参数2字符指针参数3发送长度参数4超时时间 HAL_UART_Transmit(huart2, (uint8_t *)ch, 1, 0xFFFF); return ch; // 返回发送的字符 } /* USER CODE END 0 */步骤 3主循环添加 RTC 读取与打印找到 while (1) 主循环中的USER CODE BEGIN WHILE代码段添加核心逻辑/* USER CODE BEGIN WHILE */ while (1) { app_read_RTC(); // 调用自定义函数读取RTC当前时间到全局rtc_value // 串口格式化打印RTC时间%02d表示两位数显示不足补0格式更规范 printf(RTC实时时间%02d-%02d-%02d 星期%d %02d:%02d:%02d\r\n, rtc_value.Year, // 打印年份 rtc_value.Month, // 打印月份 rtc_value.Date, // 打印日期 rtc_value.WeekDay, // 打印星期 rtc_value.Hours, // 打印小时 rtc_value.Minutes, // 打印分钟 rtc_value.Seconds);// 打印秒数 HAL_Delay(500); // 延时500ms控制打印频率避免串口刷屏 /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */四、编译下载与效果验证编译工程点击 Keil 左侧Rebuild按钮全量编译出现0 Error(s), 0 Warning(s)即为成功下载程序连接 ST-Link 仿真器点击Load按钮下载程序下载完成后按下开发板复位键串口验证打开串口助手选择对应串口号配置波特率 115200、数据位 8、停止位 1、无校验打开串口即可看到 RTC 实时时间每秒自动更新

相关新闻