【蓝桥杯——物联网设计与开发】基础模块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!#$!# 执行脚本文件(参…...

【C++ 基础】构造和析构
构造和析构 1.养成一个习惯,只要是变量,定义后要初始化 2.在C当中要完成对象的初始化工作,可以借助构造来完成,如果要完成对象的清理操作,借助析构来完成 3.在C里面对于对象的初始化有4种方式: 1、直接…...

C语言项目 天天酷跑(上篇)
前言 这里讲述这个天天酷跑是怎么实现的,我会在天天酷跑的下篇添加源代码,这里会讲述天天酷跑这个项目是如何实现的每一个思路,都是作者自己学习于别人的代码而创作的项目和思路,这个代码和网上有些许不一样,因为掺杂了…...

Python读取Excel批量写入到PPT生成词卡
一、问题的提出 有网友想把Excel表中的三列数据,分别是:单词、音标和释义分别写入到PPT当中,每一张PPT写一个单词的内容。这种批量操作是python的强项,尤其是在办公领域,它能较好地解放双手,读取Excel表后…...

NS3学习——tcpVegas算法代码详解(1)
目录 一、源码 二、详解 1.定义日志和命名空间 2.注册Typeld类:TcpVegas和GetTypeId方法的实现 3.构造函数和析构函数 4.TcpVegas类中成员函数 (1) Fork函数 (2) PktsAcked函数 (3) EnableVegas函数 (4) DisableVegas函数 一、源码 /* -*- Mode:C; c-file-style:&qu…...

相机雷达外参标定综述“Automatic targetless LiDAR–camera calibration: a survey“
相机雷达外参标定综述--Automatic targetless LiDAR–camera calibration: a survey 前言1 Introduction2 Background3 Automatic targetless LiDAR–camera calibration3.1 Information theory based method(信息论方法)3.1.1 Pairs of point cloud and image attributes(属性…...

【Java基础-27】Java中的访问修饰符:分类、作用及应用场景
在Java编程中,访问修饰符(Access Modifiers)是控制类、方法、变量和构造函数访问权限的关键工具。通过合理使用访问修饰符,可以有效地封装代码,保护数据,并确保代码的安全性和可维护性。本文将详细介绍Java…...

Redis+注解实现限流机制(IP、自定义等)
简介 在项目的使用过程中,限流的场景是很多的,尤其是要提供接口给外部使用的时候,但是自己去封装的话,相对比较耗时。 本方式可以使用默认(方法),ip、自定义参数进行限流,根据时间…...

SAP从入门到放弃系列之委外分包(Subcontracting)-Part1
以前写过一篇委外相关的文章,没有很详细的写。只是一个概念的概述ERP实施-委外业务-委外采购业务 最近看PA教材,遇到了这块内容,就再详细的整理一下SAP关于委外的理论知识。 文章目录 概述分包和物料需求计划 (MRP)委外分包订单分包委外业务…...

nlp新词发现——浅析 TF·IDF
传统nlp任务处理文本及其依赖已有的词表,只有在词表里出现的词才能被识别并加以处理。但这也带来了一些问题: 假设没有词表,如何从文本中发现新词? 随着时间推移,新词会不断出现,固有词表会过时࿰…...

WebGL2示例项目常见问题解决方案
WebGL2示例项目常见问题解决方案 webgl2examples Rendering algorithms implemented in raw WebGL 2. [这里是图片001] 项目地址: https://gitcode.com/gh_mirrors/we/webgl2examples 项目基础介绍 WebGL2示例项目(https://github.com/tsherif/webgl2examples.gi…...