【蓝桥杯——物联网设计与开发】基础模块8 - RTC
目录
一、RTC
(1)资源介绍
🔅简介
🔅时钟与分频(十分重要‼️)
(2)STM32CubeMX 软件配置
(3)代码编写
(4)实验现象
二、RTC接口函数封装
三、踩坑日记
(1)RTC时间读取问题
(2)RTC分频系数修改问题
(3)RTC时钟不准确问题
一、RTC
(1)资源介绍
🔅简介
(以下资料来源于STM32L0_参考手册(L0x1))
- RTC提供自动唤醒来管理所有低功耗模式。
- 实时时钟(RTC)是一个独立的BCD定时器/计数器。RTC提供了一个带有可编程报警中断的时间时钟/日历。
- RTC还包括一个具有中断能力的周期性可编程唤醒标志。
- 两个32位寄存器包含秒、分、小时(12或24小时格式)、天(星期中的一天)、日期(月中的一天)、月和年,以二进制编码的十进制格式(BCD)表示。分秒值也可以以二进制格式提供。
- 28天、29天(闰年)、30天和31天的补偿将自动执行。还可以执行夏令时补偿。
- 额外的32位寄存器包含可编程报警子秒,秒,分钟,小时,日和日期。
- 数字校准功能可用于补偿晶体振荡器精度的任何偏差。
- 在RTC域重置后,所有RTC寄存器都受到保护,防止可能的寄生写访问。
- 只要电源电压保持在工作范围内,无论设备状态(运行模式、低功耗模式或复位),RTC都不会停止。
🔅时钟与分频(十分重要‼️)
RTC时钟源(RTCCLK)是通过LSE时钟、LSI振荡器时钟和HSE时钟之间的时钟控制器来选择的。
一个可编程的预分频器阶段产生一个1Hz的时钟,用于更新日历。为了尽量减少功耗,预分频器被分成2个可编程的预分频器:
- 通过RTC_PRER寄存器的PREDIV_A位配置的7位异步预分频器;
- 通过RTC_PRER寄存器的PREDIV_S位配置的15位同步预分频器;
⚠️注意:当同时使用两个预分频器时,建议将异步预分频器配置为较大的值,以减少消耗。
LSE频率为32.768 kHz时,将异步预分频器的分频因子设置为128,将同步预分频器的分频因子设置为256,得到的内部时钟频率为1Hz(ck_spre) 。即:(默认参数)
PREDIV_A = 127;
PREDIV_S = 255;
但是,在蓝桥杯物联网竞赛实训平台上,RTC的时钟只能通过LSI RC(37kHz)来获得,所以默认的参数不适宜本平台,需要进行修改‼️
在这里,根据以异步预分频器值较大为优先原则,计算出一个合理的参数值,即:
PREDIV_A = 124;
PREDIV_S = 295;
(2)STM32CubeMX 软件配置
🔅“工程建立、时钟树配置、Debug 串行线配置、代码生成配置” 在下文中有讲解,这里不再赘述❗️
【蓝桥杯——物联网设计与开发】基础模块1- GPIO输出
https://blog.csdn.net/m0_63116406/article/details/135604705?spm=1001.2014.3001.5502
1️⃣点击"Timers" → 点击"RTC" → 勾选"Activate Clock Source" 和 "Activate Calendar" → 修改异步预分配值为124,同步预分频值为295 → 修改日历时间23时59分55秒;
2️⃣使能OLED;
3️⃣使能TIM2;
4️⃣生成代码即可;
(3)代码编写
🟢️main 函数
/* USER CODE BEGIN PV */
uint8_t puc_buf[17]; // OLED显示缓存区
RTC_TimeTypeDef now_time; // RTC时间结构体
RTC_DateTypeDef now_date; // RTC日期结构体
uint8_t hour = 23, minute = 59, second = 55; // 定时器计时
uint16_t cnt_1s; // 定时器计时1秒
/* USER CODE END PV */
/* USER CODE BEGIN 0 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance == TIM2){/* 定时器计时1000次1ms,即1秒,更新一次数据 */if(++cnt_1s == 1000){cnt_1s = 0;if(++second == 60){second = 0;if(++minute == 60){minute = 0;if(++hour == 24)hour = 0;}}}}
}
/*** @brief The application entry point.* @retval int*/
int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init */HAL_RCC_EnableCSS();/* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_I2C3_Init();MX_RTC_Init();MX_TIM2_Init();/* USER CODE BEGIN 2 */OLED_Init();HAL_TIM_Base_Start_IT(&htim2); // 开启定时器2中断/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* 获取RTC值 */HAL_RTC_GetTime(&hrtc, &now_time, RTC_FORMAT_BIN);HAL_RTC_GetDate(&hrtc, &now_date, RTC_FORMAT_BIN);/* OLED显示 */// 第一行显示RTC的时间sprintf((char*)puc_buf, " %2d : %2d : %2d ", now_time.Hours, now_time.Minutes, now_time.Seconds);OLED_ShowString(0, 0, puc_buf, 16);// 第二行显示定时器的时间sprintf((char*)puc_buf, " %2d : %2d : %2d ", hour, minute, second);OLED_ShowString(0, 2, puc_buf, 16); HAL_Delay(200);/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}
(4)实验现象
- RTC更新的时间较快;
- 计时器更新的时间与手机时钟相同;
二、RTC接口函数封装
🟡️RTC更新时钟函数
void RTC_Get(void)
{HAL_RTC_GetTime(&hrtc, &now_time, RTC_FORMAT_BIN);HAL_RTC_GetDate(&hrtc, &now_date, RTC_FORMAT_BIN);
}
🟡️定时器中断更新时钟函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance == TIM2){/* 定时器计时1000次1ms,即1秒,更新一次数据 */if(++cnt_1s == 1000){cnt_1s = 0;if(++second == 60){second = 0;if(++minute == 60){minute = 0;if(++hour == 24)hour = 0;}}}}
}
三、踩坑日记
(1)RTC时间读取问题
🔅RTC读取需要先读取时间,后必须读取日期,否则读取的时间不能更新❗️❗️❗️
即需要调用下面两个函数,否则无法正常更新时间:
HAL_RTC_GetTime(&hrtc, &now_time, RTC_FORMAT_BIN);
HAL_RTC_GetDate(&hrtc, &now_date, RTC_FORMAT_BIN);
(2)RTC分频系数修改问题
🔅由于开发板上RTC的时钟不为32.768kHz,所以不能使用默认的分频系数,根据其LSI RC(37kHz)时钟源,计算出合理的分频系数:
PREDIV_A = 124;
PREDIV_S = 295;
而官方例程给出的分频系数为:
PREDIV_A = 127;
PREDIV_S = 290;
由(127 + 1) * (290 + 1) = 37248,可知,该数据不太合理;
❗️但是,无论是本文给出的参数还是官方给出的参数,亦或是默认参数,在实际测试时,频率都不准确❗️
(3)RTC时钟不准确问题
🔅针对这一问题,上文已经给出另外一种解决方案,即使用一个1ms定时器来模拟RTC,实测效果与手机时钟基本一致,能够满足赛题精准要求;
相关文章:
【蓝桥杯——物联网设计与开发】基础模块8 - RTC
目录 一、RTC (1)资源介绍 🔅简介 🔅时钟与分频(十分重要‼️) (2)STM32CubeMX 软件配置 (3)代码编写 (4)实验现象 二、RTC接口…...
聚类算法DBSCAN 改进总结
目录 DBSCAN(Density-Based Spatial Clustering of Applications with Noise) 1. HDBSCAN (Hierarchical DBSCAN) 优点: 安装: 使用实例1 效果失败 使用实例2 3. DBSCAN++ (DBSCAN with Preprocessing) 4. DBSCAN with k-distance 5. Density Peaks Clustering (DP…...
uniapp开发微信小程序实现获取“我的位置”
1. 创建GetLocation项目 使用HBuilder X创建一个项目GetLocation,使用Vue3。 2. 在腾讯地图开放平台中创建应用 要获取位置,在小程序中需要使用腾讯地图或是高德地图。下面以腾讯地图为例。 (1)打开腾讯地图开放平台官方网址:腾讯位置服务 - 立足生态,连接未来 (2)注册…...
java中两个系统进行非对称加密,两个系统的公私钥可以用一套吗?
在非对称加密中,每个参与方应该拥有自己独立的一套公钥和私钥。非对称加密的基础在于公钥和私钥的配对使用:一个密钥用于加密信息,则另一个对应的密钥用于解密信息。具体来说: 如果A要发送一条保密消息给B,那么A会使用…...
无人设备遥控器之定向天线篇
一、定义与功能 定向天线,顾名思义,是通过改变天线的辐射方向,实现信号发射、接收和增强的天线。它可以让信号以更高的功率、更远的距离传输到指定区域,同时也能够降低与周围天线之间的干扰。在无人设备遥控器中,定向天…...
【电路笔记 信号】Metastability 平均故障间隔时间(MTBF)公式推导:进入亚稳态+退出亚稳态+同步器的可靠性计算
这是一个简化的电路分析模型。图2中的典型触发器包括主锁存器、从锁存器和去耦反相器(这个结构类似 主从边沿触发器)。 在亚稳态中,主锁存器的节点A、B的电压电平大致在逻辑“1”(VDD)和“0”(GND)之间。确切的电压电平…...
计算机视觉:原理、分类与应用
计算机视觉是当今科技领域中一个至关重要的分支,它赋予了计算机通过视觉感知和理解世界的能力。简单来说,计算机视觉实现了对图像、视频等视觉数据的分析、处理、识别和理解。这是一个跨学科的研究领域,涉及计算机科学、信息工程、数学、物理…...
Vue.js组件开发-使用watch进行深度观察
在Vue.js中,watch选项允许观察和响应Vue实例上数据的变化。当需要对某个数据属性进行深度观察,即在其内部嵌套的对象或数组发生变化时也能触发回调时,可以使用deep选项。 示例: new Vue({el: #app,data: {user: {name: John,age…...
明厨亮灶系统
校园食堂明厨亮灶AI分析系统通过yolov5网络模型技术,校园食堂明厨亮灶监控分析系统针对校园餐厅后厨不按要求戴口罩、不穿厨师帽、陌生人员进入后厨、厨师不穿厨师服、上班时间玩手机、老鼠识别等行为校园食堂明厨亮灶监控分析系统自动识别抓拍告警。Yolo算法&#…...
虚幻引擎结构之AActor
在虚幻引擎中,AActor 是一个核心类,作为游戏世界内所有可交互对象的基础。任何可以在关卡中放置或动态生成的对象,几乎都是从 AActor 类派生而来。这包括但不限于角色、道具、特效、静态和动态物体等。 1. AActor 的基本概念 AActor 作为基类…...
基于JAVA+SpringBoot+Vue的制造装备物联及生产管理ERP系统
基于JAVASpringBootVue的制造装备物联及生产管理ERP系统 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末附源码下载链接&am…...
JAVA HTTP压缩数据
/*** 压缩数据包** param code* param data* param resp* throws IOException*/protected void writeZipResult(int code, Object data, HttpServletResponse resp) throws IOException {resp.setHeader("Content-Encoding", "gzip");// write到客户端resp…...
VSCode 配置远程连接免密登录 插件
自我存档 远程连接免密登录 远程连接 在扩展界面搜remote ssh 安装完成后可以在侧边栏找到远程资源管理器 通过来添加或者点击打开ssh配置文件 点击的话以这种方式, 手动添加则按照相同格式输入即可 格式如下所示, Host后添加IP, User是登录ssh的用户, hostname是显示在…...
VIVO C++开发面试题及参考答案
面向过程与面向对象的区别,面向对象后的好处 面向过程编程主要关注的是程序的流程,它将一个问题分解为一系列的步骤,通过函数来实现这些步骤,数据和操作这些数据的函数是分离的。例如,在一个简单的计算学生成绩平均值的程序中,我们可能会有一些函数来输入成绩、计算总和、…...
Unity3D用正则判断身份证号或邮箱
系列文章目录 unity工具 文章目录 系列文章目录👉前言👉一、正则判断邮箱格式👉二、正则判断身份证号👉壁纸分享👉总结👉前言 C#正则表达式(Regex)是一种用来匹配字符串模式的强大工具。在C#中,可以使用System.Text.RegularExpressions命名空间下的Regex类来处…...
【终端工具】FinalShell v4.5.12 官方版
1.下载地址 【终端工具】FinalShell v4.5.12 官方版 2.简介 FinalShell是一款免费的跨平台远程管理工具,专为开发者和运维人员设计。它支持通过 SSH、SFTP 等方式连接到 Linux 和 Windows 服务器,提供类似于终端的操作界面。除了常规的远程登录功能&a…...
【阅读记录-章节6】Build a Large Language Model (From Scratch)
系列文章目录 【阅读记录-章节1】Build a Large Language Model (From Scratch) 【阅读记录-章节2】Build a Large Language Model (From Scratch) 【阅读记录-章节3】Build a Large Language Model (From Scratch) 【阅读记录-章节4】Build a Large Language Model (From Scr…...
面向未来的教育技术:智能成绩管理系统的开发
3.1 可行性研究 成绩管理系统开发实现分析需要从不同的角度来进行分析可行性,比如从时间角度,经济角度,甚至操作角度。从不同的角度分析可行性会让成绩管理系统开发具体化,进而达到辩证开发的正确性。 3.1.1 经济可行性 从经济方面…...
Mac系统下 IDEA配置Maven本地仓库
1.为什么需要配置本地仓库? 在软件开发过程中,使用Maven工具进行依赖管理是常见的做法。Maven通过集中管理各种依赖库,能够帮助开发者在项目中轻松地引入所需的第三方库,并确保项目能够顺利构建和部署。然而,在使用Mav…...
shell脚本定义特殊字符导致执行mysql文件错误的问题
记得有一次版本发布过程中有提供一个sh脚本用于一键执行sql文件,遇到一个shell脚本定义特殊字符的问题,sh脚本的内容类似以下内容: # 数据库ip地址 ip"127.0.0.1" # 数据库密码 cmdbcmdb!#$! smsm!#$!# 执行脚本文件(参…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...
让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...
【网络安全】开源系统getshell漏洞挖掘
审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...
人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent
安全大模型训练计划:基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标:为安全大模型创建高质量、去偏、符合伦理的训练数据集,涵盖安全相关任务(如有害内容检测、隐私保护、道德推理等)。 1.1 数据收集 描…...
PostgreSQL 与 SQL 基础:为 Fast API 打下数据基础
在构建任何动态、数据驱动的Web API时,一个稳定高效的数据存储方案是不可或缺的。对于使用Python FastAPI的开发者来说,深入理解关系型数据库的工作原理、掌握SQL这门与数据库“对话”的语言,以及学会如何在Python中操作数据库,是…...
标注工具核心架构分析——主窗口的图像显示
🏗️ 标注工具核心架构分析 📋 系统概述 主要有两个核心类,采用经典的 Scene-View 架构模式: 🎯 核心类结构 1. AnnotationScene (QGraphicsScene子类) 主要负责标注场景的管理和交互 🔧 关键函数&…...
【大厂机试题解法笔记】矩阵匹配
题目 从一个 N * M(N ≤ M)的矩阵中选出 N 个数,任意两个数字不能在同一行或同一列,求选出来的 N 个数中第 K 大的数字的最小值是多少。 输入描述 输入矩阵要求:1 ≤ K ≤ N ≤ M ≤ 150 输入格式 N M K N*M矩阵 输…...
