【蓝桥杯——物联网设计与开发】基础模块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都不会停止。
图1        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;

f_{CK\_ APRE}=\frac{f_{RTCCLK}}{PREDIV\_A+1}

f_{CK\_SPRE}=\frac{f_{RTCCLK}}{\left ( PREDIV\_S+1 \right )\times \left ( PREDIV\_A+1 \right )}

        但是,在蓝桥杯物联网竞赛实训平台上,RTC的时钟只能通过LSI RC(37kHz)来获得,所以默认的参数不适宜本平台,需要进行修改‼️

        在这里,根据以异步预分频器值较大为优先原则,计算出一个合理的参数值,即:

        PREDIV_A = 124;

        PREDIV_S = 295;

图2        时钟树

(2)STM32CubeMX 软件配置


🔅“工程建立、时钟树配置、Debug 串行线配置、代码生成配置” 在下文中有讲解,这里不再赘述❗️

【蓝桥杯——物联网设计与开发】基础模块1- GPIO输出icon-default.png?t=O83Ahttps://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秒

图3        RTC配置


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 RC37kHz)时钟源,计算出合理的分频系数:

        PREDIV_A = 124;

        PREDIV_S = 295;

而官方例程给出的分频系数为:

        PREDIV_A = 127;

        PREDIV_S = 290;

(127 + 1) * (290 + 1) = 37248,可知,该数据不太合理;

❗️但是,无论是本文给出的参数还是官方给出的参数,亦或是默认参数在实际测试时,频率都不准确❗️

(3)RTC时钟不准确问题

        🔅针对这一问题,上文已经给出另外一种解决方案,即使用一个1ms定时器来模拟RTC,实测效果与手机时钟基本一致,能够满足赛题精准要求;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/494935.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

k8s dashboard可视化操作界面的安装

一、官方安装方法 根据官网的安装配置可以选择如下安装: kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0/aio/deploy/recommended.yaml 二、添加阿里云加速进行安装 #修改recommended.yaml拉取镜像的链接 vim recommended.yam…

【目标跟踪综述及关键技术】

1.多目标跟踪任务介绍 定义 多目标跟踪旨在将视频序列中感兴趣的目标检测出来,并赋予每个目标单独的编号,在整个序列中形成目标的轨迹。 分类 online:算法在推理目标身份过程中,只能看见当前帧以及之前的帧(关联&a…

webrtc音频模块(三) windows Core Audio API及声音的播放

在前面介绍了ADM(Audio Device Module),它用于抽象音频设备管理和音频数据采集/播放接口。windows的实现是AudioDeviceWinowCode,它封装了Core Audio APIs实现了对音频设备的操作。 Core Audio APIs windows提供了多种音频操作API,比如最常…

在linux系统的docker中安装GitLab

一、安装GitLab: 在安装了docker之后就是下载安装GitLab了,在linux系统中输入命令:docker search gitlab就可以看到很多项目,一般安装第一个,它是英文版的,如果英文不好可以安装twang2218/gitlab-ce-zh。 …

uniapp跨平台开发---webview调用app方法

1.app端实现 注意:为了实现实时通信,app端页面是.nvue 代码实现 <template><view class"content"><view class"web-view"><web-view class"web-view" :src"url" ref"webview" onPostMessage"o…

LeetCode 343.整数拆分

1.题目要求: 2.题目代码: class Solution { public:int integerBreak(int n) {//先确定dp数组vector<int> dp;//1.确定dp数组的含义//2.确定dp的递推公式//3.初始化dp数组//4.遍历顺序dp.resize(n 1);dp[0] 0;dp[1] 0;dp[2] 1;for(int i 3;i < n;i){for(int j …

【Linux探索学习】第二十三弹——理解文件系统:认识硬件、探索文件在硬件上的存储问题

Linux学习笔记&#xff1a;https://blog.csdn.net/2301_80220607/category_12805278.html?spm1001.2014.3001.5482 前言&#xff1a; 我们前面讲过了文件的组成是由文件内容和文件属性两者组成的&#xff0c;但是我们前面接触的文件都是系统中的文件&#xff0c;都是已经在进…

Flask中@app.route()的methods参数详解

诸神缄默不语-个人CSDN博文目录 在 Flask 中&#xff0c;app.route 是用于定义路由的核心装饰器&#xff0c;开发者可以通过它为应用指定 URL 映射及相应的处理函数。在处理 HTTP 请求时&#xff0c;不同的业务场景需要支持不同的 HTTP 方法&#xff0c;而 app.route 的 metho…

工业相机镜头选型知识详解

工业相机在机器视觉、自动化生产和检测等领域扮演着重要角色&#xff0c;而镜头作为工业相机的关键组件&#xff0c;其选型直接影响到成像效果和系统的整体性能。在本篇博客中&#xff0c;我们将详细讲解工业相机镜头选型的相关知识&#xff0c;帮助您在实际应用中选择最合适的…

羊城杯2020 easycon

打开是这样一个页面&#xff0c;这样情况一般先想到的就是目录扫描了 好吧&#xff0c;不知道为什么gobuster扫不出来 dirsearch扫出个index.php和index.php/login&#xff0c;都访问一下 提醒我这个文件有一句话木马 怪怪的&#xff0c;不知道为什么weevely连接不上 蚁剑吧&am…

顶顶通呼叫中心中间件mod_cti模块安全增强,预防盗打风险(mod_cti基于FreeSWITCH)

文章目录 前言联系我们mod_cti版本支持安全加强说明 前言 FreeSWITCH暴露在公网最大的风险就是被不法之人盗打 出现盗打的主要原因以下几点&#xff1a; 分机密码太简单或者密码泄露了拨号方案配置不合理sofia配置错误 所以我们给顶顶通呼叫中心中间件添加了安全加强功能&am…

面试基础篇---迭代器,yield, tcp, 等

1.谈谈python的装饰器&#xff0c;迭代器&#xff0c;yield&#xff1f; 迭代器在内存中通常是一次性遍历的&#xff0c;也就是说&#xff0c;一旦遍历完所有元素&#xff0c;它就会停止工作&#xff0c;不可再用。 惰性计算&#xff1a;生成器按需生成数据&#xff0c;即只有在…

软件测试之测试用例

文章目录 测试用例测试用例的编写总结 测试用例 测试用例:描述测试点执行的文档(测试输入、执行条件、预期结果等) 作用 1.测试点能被精准执行 2.便于团队合作测试用例核心内容 用例编号、用例标题、所属模块、优先级、前置条件、测试步骤、测试数据、预期结果 测试用例的编写…

微机接口课设——基于Proteus和8086的打地鼠设计(8255、8253、8259)

原理图设计 汇编代码 ; I/O 端口地址定义 IOY0 EQU 0600H IOY1 EQU 0640H IOY2 EQU 0680HMY8255_A EQU IOY000H*2 ; 8255 A 口端口地址 MY8255_B EQU IOY001H*2 ; 8255 B 口端口地址 MY8255_C EQU IOY002H*2 ; 8255 C 口端口地址 MY8255_MODE EQU IOY003H*2 ; …

I.MX6U 启动方式详解

一、启动方式选择 BOOT 的处理过程是发生在 I.MX6U 芯片上电以后,芯片会根据 BOOT_MODE[1:0]的设置 来选择 BOOT 方式。 BOOT_MODE[1:0]的值是可以改变的,有两种方式,一种是改写 eFUSE(熔 丝),一种是修改相应的 GPIO 高低电平。第一种修改 eFUSE 的方式只能修改一次,后面就…

下载运行Vue开源项目vue-pure-admin

git地址&#xff1a;GitHub - pure-admin/vue-pure-admin: 全面ESMVue3ViteElement-PlusTypeScript编写的一款后台管理系统&#xff08;兼容移动端&#xff09; 安装pnpm npm install -g pnpm # 国内 淘宝 镜像源 pnpm config set registry https://registry.npmmirror.com/…

springboot-starter版本升级es版本问题

一、背景说明 版本漏洞处理&#xff0c;springboot版本升级&#xff0c;es版本暂不升级&#xff0c;但是pom引用中es版本一直为7.17.15高版本&#xff0c;不想显示声明版本&#xff0c;定位具体问题&#xff0c;最后还是重新定义了版本进行处理。 二、异常情况 这里看4.4.18是…

模型优化之知识蒸馏

文章目录 知识蒸馏优点工作原理示例代码 知识蒸馏优点 把老师模型中的规律迁移到学生模型中&#xff0c;相比从头训练&#xff0c;加快了训练速度。另一方面&#xff0c;如果学生模型的训练精度和老师模型差不多&#xff0c;相当于得到了规模更小的学生模型&#xff0c;起到模…

Hadoop集群(HDFS集群、YARN集群、MapReduce​计算框架)

一、 简介 Hadoop主要在分布式环境下集群机器&#xff0c;获取海量数据的处理能力&#xff0c;实现分布式集群下的大数据存储和计算。 其中三大核心组件: HDFS存储分布式文件存储、YARN分布式资源管理、MapReduce分布式计算。 二、工作原理 2.1 HDFS集群 Web访问地址&…

使用 acme.sh 申请域名 SSL/TLS 证书完整指南

使用 acme.sh 申请域名 SSL/TLS 证书完整指南 简介为什么选择 acme.sh 和 ZeroSSL&#xff1f;前置要求安装过程 步骤一&#xff1a;安装 acme.sh步骤二&#xff1a;配置 ZeroSSL 证书申请 方法一&#xff1a;手动 DNS 验证&#xff08;推荐新手使用&#xff09;方法二&#xf…