STM32F103学习笔记(六) RTC实时时钟(应用篇)

目录

1. RTC 实时时钟的应用场景

2. RTC 的配置与初始化

2.1 设置 RTC 时钟源

2.2 初始化 RTC 寄存器

2.3 中断配置

2.4 备份寄存器配置

2.5 校准 RTC

3. 实例演示代码

4. 总结

1. RTC 实时时钟的应用场景

        实时时钟(RTC)在嵌入式系统中具有广泛的应用场景,特别是对于需要准确跟踪时间的应用。下面是一些常见的 RTC 应用场景:

        时钟显示: RTC 可用于驱动液晶显示屏上的时钟模块,以在设备上显示当前时间。

        日历功能: RTC 可用于记录日期,包括年、月、日等信息,从而实现日历功能。

        定时任务: 在需要周期性执行任务的应用中,RTC 可以作为触发定时任务执行的时钟源。

        事件记录: RTC 可用于记录系统中的事件发生时间,例如记录故障发生的时间戳。

        定时器功能: RTC 还可以用作定时器,实现定时触发操作,例如定时启动警报等。

        电源管理: RTC 可以在设备休眠时运行,唤醒时提供时间信息,从而实现高效的电源管理。

        日志记录: RTC 可以用于记录系统运行状态或用户操作记录的时间信息,以便后续分析。

2. RTC 的配置与初始化

        配置和初始化 RTC 模块是使用实时时钟功能的关键步骤。下面是配置和初始化 RTC 的一般步骤:

2.1 设置 RTC 时钟源

        RTC 的时钟源通常有两种选择:外部晶体振荡器(LSE)和内部振荡器(LSI)。外部晶体振荡器(通常是32.768kHz)提供更高的精度和稳定性,而内部振荡器则更为节省成本,可以在LSE失效时使用。

2.2 初始化 RTC 寄存器

        RTC 模块通常包含多个寄存器,用于存储时间、日期和控制信息。在初始化过程中,需要设置这些寄存器的初始值,以确保 RTC 模块能够正确地工作。

2.3 中断配置

        如果需要使用 RTC 中断功能,例如定时器中断或闹钟中断,还需要配置相应的中断使能位和中断优先级。这样,当 RTC 模块产生中断时,系统可以及时响应并处理中断事件。

2.4 备份寄存器配置

        RTC 模块通常还包含一些备份寄存器(BKP),用于存储关键信息,例如设备状态、配置参数等。在初始化过程中,可以根据需要对这些备份寄存器进行配置,以实现数据的备份和恢复功能。

2.5 校准 RTC

        通过下列RTC简图可知,后备区域的时钟与APB1总线的时钟是不相同的,为了确保 RTC 模块提供的时间信息准确可靠,需要对 RTC 进行周期性的校准。校准过程包括校正 RTC 时钟源的偏差,以及对 RTC 寄存器的时间值进行校准,以确保与外部时间标准的一致性。

3. 实例演示代码

        本节我们将利用RTC实现一个时钟显示的功能,通过读取时间戳来获取当前时间(主供电断开依然可以由备用电池供电,故主供电断开依然可以记时),本程序可以通过动态传参的方法来配置当前的初始时间。
        首先是等待RTC同步函数

void rtc_wait(void)
{RTC_WaitForSynchro();								//等待同步RTC_WaitForLastTask();								//等待上一次操作完成
}

        接着是RTC的初始化

void rtc_Init(uint16_t year,uint16_t mouth,uint16_t day,uint16_t hour,uint16_t min,uint16_t sec)
{time_t time_cnt;struct tm time_date;	BKP_Init();//备份寄存器初始化,同时使能PWR的时钟if (R_Save_data(BKP_DR10) != 0x2024)			//判断是否是第一次设置备份寄存器{RCC_LSEConfig(RCC_LSE_ON);							//LSE时钟,通常是32.768kHzwhile (RCC_GetFlagStatus(RCC_FLAG_LSERDY) != SET);	//LSE准备就绪RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);				//配置LSE来源RCC_RTCCLKCmd(ENABLE);								//RTC时钟使能rtc_wait();//等待同步(主时钟和低速时钟的同步)RTC_SetPrescaler(32768 - 1);						//把32.768kHz分频到1HzRTC_WaitForLastTask();								//等待上一次操作完成time_date.tm_year = year - 1900;  //time库中,年是从1900年算起的time_date.tm_mon = mouth - 1; 		//time库中,月是从1月算起的time_date.tm_mday = day;time_date.tm_hour = hour;time_date.tm_min = min;time_date.tm_sec = sec;time_cnt = mktime(&time_date) - 8 * 60 * 60;	//将日期转换为秒计数器,并减8个时区(东8)RTC_SetCounter(time_cnt);						//更新到计数器RTC_WaitForLastTask();							//等待上一次操作完成BKP_WriteBackupRegister(BKP_DR10, 0x2024);			//第一次设置完成,写入标志位}else	rtc_wait();//第一次已经配置好了,后期主上电只需等待时钟同步
}

        接着是RTC读取时间的函数

void Read_RTC(uint16_t *year,uint16_t *mouth,uint16_t *day,uint16_t *hour,uint16_t *min,uint16_t *sec)
{time_t time_cnt;		struct tm time_date;	time_cnt = RTC_GetCounter() + 8 * 60 * 60;		//获取当前的秒计数器time_date = *localtime(&time_cnt);				//将秒计数器转换为日期*year = time_date.tm_year + 1900;		//将日期时间结构体赋值给数组的时间*mouth = time_date.tm_mon + 1;*day = time_date.tm_mday;*hour = time_date.tm_hour;*min = time_date.tm_min;*sec = time_date.tm_sec;
}

        在这里我们要注意,需要在文件的开头包含time.h文件,因为在函数中使用到了该头文件中包含的结构体和其他有关时间戳的函数,通过该头文件我们可以避免自己编写闰年等等的程序逻辑

#include <time.h>

        在获取函数之前,我们还需要定义全局变量,一定要全局变量哈,不要写在main函数或者其他功能函数中了

uint16_t year,mouth,day,hour,min,sec;

接着,我们只需要在初始化时将当前时间作为参数传入初始化函数,就可以在获取函数中通过全局变量实时获取到当前的时间了

rtc_Init(2024,2,19,4,27,55); //RTC初始化,当前时间2024年2月19日4点27分55秒
Read_RTC(&year,&mouth,&day,&hour,&min,&sec);//获取函数,将日期信息分别赋值到全局变量中

        最后程序中如果出现函数未定义的,可能是在BKP篇中封装好的函数,下附BKP篇的.c文件

#include "bkp.h"//备份寄存器初始化
void BKP_Init(void)
{//备份寄存器通常需要在Vbat电压下工作(Vbat是用于保持备份寄存器内容的电源),而PWR模块负责监测Vbat电压RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);		//开启PWR的时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP, ENABLE);		//开启BKP的时钟PWR_BackupAccessCmd(ENABLE);							//用PWR使能备份寄存器
}/*在f103c8t6中,有20个字节的后备数据空间,对应10个16位的备份寄存器
BKP_DR对应BKP_DR1 - BKP_DR10
*/
uint16_t W_Save_data(uint16_t BKP_DR, uint16_t data)
{BKP_WriteBackupRegister(BKP_DR, data);	//将需要掉电保存的数据写入备份寄存器if(data == BKP_ReadBackupRegister(BKP_DR))		//读取写入的备份寄存器的数据{return 1; //如果正确读取到备份寄存器的数据,返回1}else return 0;
}uint16_t R_Save_data(uint16_t BKP_DR)
{return BKP_ReadBackupRegister(BKP_DR);
}

4. 总结

        RTC(实时时钟)模块在嵌入式系统中扮演着重要角色,通过提供精确时间和日期信息,帮助系统实现定时任务、时间戳记录、闹钟等功能。我们学习了RTC的原理、配置和应用场景。在配置和初始化RTC时,需要注意时钟源选择、寄存器初始化和异常处理,以确保模块的稳定可靠运行。通过掌握RTC知识,我们能够提升系统性能和稳定性。

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

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

相关文章

用C#开发Excel插件的强大开源工具

推荐一个开源项目&#xff0c;方便我们使用C#为Excel开发插件。 01 项目简介 Excel-DNA是一个.Net开源项目&#xff0c;为开发者提供了一种便利的方法&#xff0c;可以将.Net代码与Excel集成&#xff0c;能够轻松的为Excel创建自定义函数、图表、表单等&#xff0c;一方面不仅…

VS2022调试技巧(一)

什么是bug&#xff1f; 在1945年&#xff0c;美国科学家Grace Hopper在进行计算机编程时&#xff0c;发现一只小虫子钻进了一个真空管&#xff0c;导致计算机无法正常工作。她取出虫子后&#xff0c;计算机恢复了正常&#xff0c;由此&#xff0c;她首次将“Bug”这个词用来描…

【C语言基础】:操作符详解(二)

文章目录 操作符详解一、上期扩展二、单目操作符三、逗号表达式四、下标访问[]、 函数调用()五、结构成员访问操作符六、操作符的属性&#xff1a;优先级、结合性1. 优先级2. 结合性 操作符详解 上期回顾&#xff1a;【C语言基础】&#xff1a;操作符详解(一) 一、上期扩展 …

https://htmlunit.sourceforge.io/

https://htmlunit.sourceforge.io/ 爬虫 HtmlUnit – Welcome to HtmlUnit HtmlUnit 3.11.0 API https://mvnrepository.com/artifact/net.sourceforge.htmlunit/htmlunit/2.70.0 https://s01.oss.sonatype.org/service/local/repositories/releases/content/org/htmlunit…

进程间通信学习笔记(有名管道和无名管道)

进程间通信方式&#xff1a; 无名管道(pipe)有名管道(fifo)信号(signal)共享内存(mmap)套接字(socket) 无名管道&#xff1a; 在内核里面开辟一片内存&#xff0c;进程1和进程2都可以通过这片内存进行通信 无名管道特点&#xff1a; 只能用于具有亲缘关系的进程之间的通信&am…

YOLOv9图像标注和格式转换

一、软件安装 labelimg安装&#xff08;anaconda&#xff09; 方法一、 pip install labelImg 方法二、 pip install PyQt5 -i https://pypi.tuna.tsinghua.edu.cn/simple/ pip install pyqt5-tools -i https://pypi.tuna.tsinghua.edu.cn/simple/ pip install lxml -i ht…

系统找不到xinput1_3.dll怎么办?试试这五种解决方法轻松搞定

在计算机系统运行过程中&#xff0c;当我们遭遇“找不到xinput1_3.dll”这一错误提示时&#xff0c;实际上正面临一个软件兼容性、系统组件缺失以及游戏或应用程序无法正常启动的关键问题。深入探究这一现象&#xff0c;我们会发现它可能引发一系列连带问题&#xff0c;例如某些…

linux之前后端项目部署与发布

目录 前言 简介 一、安装Nginx 二、后端部署 2.1多个tomcat负载均衡 2.2 负载均衡 2.3 后端项目部署 三、前端部署 1.解压前端 2.Nginx配置文件修改 3.IP域名映射 4.重启Nginx服务 前言 上篇博主已经讲解过了单机项目的部署linux之JAVA环境配置JDK&Tomcat&a…

车载终端_联发科MTK6762车载平板电脑解决方案

智能车载终端方案搭载了MTK联发科8xARM Cortex-A53(64bit)高速CPU&#xff0c;采用12nm工艺制程&#xff0c;提供更快的数据采集速度和APP响应速度&#xff0c;能够快速满足用户的应用需求。配备3GB RAM32GB ROM的低功耗EMCP一体化存储&#xff0c;性能良好&#xff0c;支持多任…

【LeetCode:2476. 二叉搜索树最近节点查询 + 中序遍历 + 有序表】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

python使用winio控制x86工控机的gpio

视频讲解 https://www.bilibili.com/video/BV1Nu4m1w7iv/?vd_source5ba34935b7845cd15c65ef62c64ba82f pywinio库 https://pypi.org/project/pywinio/ 安装库 pip install pywinio寄存器地址 测试代码 import pywinio winio get_winio() # 设置排针2输出1,0x40是bit6置…

嵌入式中逻辑分析仪基本操作方法

前期准备 1.一块能触摸的屏对应的主板机 2.逻辑分析仪对应的软件工具 3.对应的拓展板 4.确定拓展板的引脚分布情况 第一步&#xff1a;逻辑分析仪j基本操作 1.数据捕捉需要先进行对应软件安装,并按照需求进行配置 2.这里以A20为例:此手机使用显示驱动芯片CST148,触摸屏分辨…

插件废土课:打造属于你的“智能笔记”!

哎呀嘞&#xff0c;亲爱的网页冲浪者们&#xff0c;抓紧浮板&#xff0c;我们要继续在Chrome插件的海浪上翻滚啦&#xff01;上次我们玩了个小把戏&#xff0c;搞了个显示时间的Hello World插件&#xff0c;这次我们要把游戏玩大&#xff0c;准备打造一个能让你在网页上乱涂乱画…

数学建模【GM(1, 1)灰色预测】

一、GM(1, 1)灰色预测简介 乍一看&#xff0c;这个名字好奇怪&#xff0c;其实是有含义的 G&#xff1a;Grey&#xff08;灰色&#xff09;M&#xff1a;Model&#xff08;模型&#xff09;(1, 1)&#xff1a;只含有一个变量的一阶微分方程模型 提到灰色&#xff0c;就得先说…

大数据开发项目--音乐排行榜

环境&#xff1a;windows10&#xff0c;centos7.9&#xff0c;hadoop3.2、hbase2.5.3和zookeeper3.8完全分布式&#xff1b; 环境搭建具体操作请参考以下文章&#xff1a; CentOS7 Hadoop3.X完全分布式环境搭建 Hadoop3.x完全分布式环境搭建Zookeeper和Hbase 1. 集成MapReduce…

消息中间件之RocketMQ源码分析(十八)

Broker CommitLog索引机制中的构建过程 1.创建ConsumeQueue和IndexFile。 ConsumeQueue和IndexFile两个索引都是由ReputMessageService类创建的 RequestMessageService类图 ReputMessageService服务启动后的执行过程。 doReput()方法用于创建索引的入口&#xff0c;通常通过…

运用工具Postman快速导出python接口测试脚本

Postman的脚本可以导出多种语言的脚本&#xff0c;方便二次维护开发。 Python的requests库&#xff0c;支持python2和python3&#xff0c;用于发送http/https请求 使用unittest进行接口自动化测试 一、环境准备 1、安装python&#xff08;使用python2或3都可以&#xff09;…

【数据结构与算法】常用算法 前缀和

&#x1f389;&#x1f389;欢迎光临&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;特别推荐给大家我的最新专栏《数据结构与算法&#xff1a;初学者入门指南》&#x1f4d8;&am…

离散数学——树思维导图

离散数学——树思维导图 文章目录 前言内容大纲参考 前言 这是当初学习离散数学时整理的笔记大纲&#xff0c;其中包含了自己对于一些知识点的体悟。现将其放在这里作为备份&#xff0c;也希望能够对你有所帮助。 当初记录这些笔记只是为了在复习时更快地找到对应的知识点。…

Python爬虫之极验滑动验证码的识别

极验滑动验证码的识别 上节我们了解了可以直接利用 tesserocr 来识别简单的图形验证码。近几年出现了一些新型验证码&#xff0c;其中比较有代表性的就是极验验证码&#xff0c;它需要拖动拼合滑块才可以完成验证&#xff0c;相对图形验证码来说识别难度上升了几个等级。本节将…