STM32F4系列芯片RTC模块介绍
RTC是“实时时钟”的缩写,它是一种芯片,在计算机等电子产品中广泛应用。RTC提供了实时时钟计时功能和存储时间的能力,即时钟模块,常用于控制和记录时间的应用场合。
RTC的工作原理
RTC主要由时钟电路、电源管理电路、晶振电路、计时单元和控制接口等部分组成。其中,时钟电路是实现时间精度的关键,而计时单元则负责计算时间并存储时间的信息。晶振电路,则通过晶振的振荡来提供系统主频,从而保证时钟精度。
RTC的工作方式简单,通常由振荡器驱动,通过预设的计时器和计数器进行计时,不受操作系统的影响也不需要额外的电源支持。此外,RTC不仅可以计时,还能够提供闹钟功能、日期记录、节假日计算等功能。
RTC的用法
RTC在很多嵌入式系统和电子产品中都有广泛的应用,它的使用方法也比较简单,一般需要经历以下几个步骤:
-
初始化RTC:首先需要对RTC进行初始化设置,包括时钟精度、时区、启用哪些功能等。
-
发布闹钟:RTC一般都带有闹钟功能,可以设置闹钟时间并将其发布。当闹钟时间到达时,RTC会发出中断信号,通知系统处理。
-
计时功能:RTC的主要功能是计时,可以用于记录时间、日期等信息。一般常用的RTC芯片数据格式包括BCD码和二进制码,在使用计时功能时需要根据芯片的格式进行设置。
-
节假日计算:一些高端的RTC芯片可以进行节假日计算,可以根据不同的国家、地区、宗教等计算出对应的节假日并输出。
总的来说,RTC在现代电子产品中应用很广泛,除了常规的计时功能外,还提供了一些辅助功能,可以根据实际需求进行配置和使用。
以STM32F4系列芯片及其标准外设库为例,详细介绍如何使用其RTC模块。
首先,需要初始化RTC模块。可以使用以下代码:
#include "stm32f4xx.h"
#include "stm32f4xx_rtc.h"RTC_InitTypeDef RTC_InitStructure;void RTC_Config(void)
{/* Enable the PWR clock */RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); //开启PWR时钟PWR_BackupAccessCmd(ENABLE); //开启后备寄存器访问/* Enable the LSI OSC */RCC_LSICmd(ENABLE);/* Wait till LSI is ready */while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET);/* Select the RTC Clock Source */RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);/* Enable the RTC Clock */RCC_RTCCLKCmd(ENABLE);/* Wait for RTC APB registers synchronisation */RTC_WaitForSynchro();/* Configure the RTC data register and RTC prescaler */RTC_InitStructure.RTC_AsynchPrediv = 0x7F;RTC_InitStructure.RTC_SynchPrediv = 0xFF;RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24;RTC_Init(&RTC_InitStructure);
}
此代码将启用PWR时钟和后备寄存器存储器访问,并使能LSI振荡器。它等待LSI稳定后,将RTC时钟源设置为LSI,在启用RTC时钟后等待RTC APB寄存器的同步。最后,将RTC数据寄存器和RTC预分频器进行配置。
由于RTC模块操作比较复杂,使用外设库可以简化编程工作。下面是一些使用RTC外设库的例子。
- 此代码演示如何声明一个变量并初始化一个RTC结构:
RTC_InitTypeDef RTC_InitStructure;/* Configure the RTC data register and RTC prescaler */
RTC_InitStructure.RTC_AsynchPrediv = 0x7F;
RTC_InitStructure.RTC_SynchPrediv = 0xFF;
RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24;
/* Initialize the RTC */
RTC_Init(&RTC_InitStructure);
- 以下代码演示如何获取RTC时间和日期:
RTC_TimeStructure RTC_TimeStruct;
RTC_DateTypeDef RTC_DateStruct;RTC_GetTime(RTC_Format_BIN, &RTC_TimeStruct);
RTC_GetDate(RTC_Format_BIN, &RTC_DateStruct);
其中,RTC_Format_BIN表示获取二进制格式的时间和日期,而RTC_Format_BCD表示获取BCD格式的时间和日期。
- 以下代码演示如何设定闹钟:
RTC_AlarmTypeDef RTC_AlarmStructure;/* Configure Alarm */
RTC_AlarmStructure.RTC_AlarmTime.RTC_Hours = 0x08;
RTC_AlarmStructure.RTC_AlarmTime.RTC_Minutes = 0x30;
RTC_AlarmStructure.RTC_AlarmTime.RTC_Seconds = 0x00;
RTC_AlarmStructure.RTC_AlarmMask = RTC_AlarmMask_DateWeekDay;
RTC_SetAlarm(RTC_Format_BIN, RTC_Alarm_A, &RTC_AlarmStructure);
这将在每天的8:30触发闹钟。可以使用RTC_AlarmMask_DateWeekDay选项来指定只在星期和日期不匹配时触发闹钟。
除了上述示例代码外,还有许多其他的RTC操作和功能,开发人员可以根据具体需求进行调整和使用。
以下是使用HAL库函数的RTC初始化例子。
#include "stm32f4xx_hal.h"
#include "stm32f4xx_hal_rtc.h"/* RTC handle declaration */
RTC_HandleTypeDef RTCHandle;void RTC_Init(void)
{/* Enable the RTC Clock */__HAL_RCC_RTC_ENABLE();/* Configure RTC */RTCHandle.Instance = RTC; // Select RTC as the instanceRTCHandle.Init.HourFormat = RTC_HOURFORMAT_24; // Set the hour formatRTCHandle.Init.AsynchPrediv = 0x7F; // Set the asynchronous prescalerRTCHandle.Init.SynchPrediv = 0xFF; // Set the synchronous prescalerRTCHandle.Init.OutPut = RTC_OUTPUT_DISABLE; // Disable RTC outputRTCHandle.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH; // Set RTC output polarityRTCHandle.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN; // Set RTC output type/* Initialize RTC */HAL_RTC_Init(&RTCHandle);
}
此代码使用了HAL库函数来初始化RTC模块。它首先启用了RTC时钟,然后配置了RTC参数,包括小时格式、异步预分频器、同步预分频器、输出来源、输出极性和输出类型。最后,使用HAL_RTC_Init函数初始化RTC。
与标准库不同,HAL库使用了统一的函数接口,这些函数接口可以用于所有支持的微控制器。这些函数有许多参数,因此它们需要一定的学习成本,但是它们可以大幅减少开发时间并增加代码重用性。
详细讲解一下上面的代码。
- 引入HAL库文件和RTC头文件
#include "stm32f4xx_hal.h"
#include "stm32f4xx_hal_rtc.h"
这两行代码分别引入STM32F4系列芯片的HAL库文件和RTC头文件。
- 声明RTC句柄
RTC_HandleTypeDef RTCHandle;
这行代码声明了一个名为RTCHandle的struct类型变量,用于存储RTC句柄。
- 初始化RTC
void RTC_Init(void)
{/* Enable the RTC Clock */__HAL_RCC_RTC_ENABLE();/* Configure RTC */RTCHandle.Instance = RTC; // Select RTC as the instanceRTCHandle.Init.HourFormat = RTC_HOURFORMAT_24; // Set the hour formatRTCHandle.Init.AsynchPrediv = 0x7F; // Set the asynchronous prescalerRTCHandle.Init.SynchPrediv = 0xFF; // Set the synchronous prescalerRTCHandle.Init.OutPut = RTC_OUTPUT_DISABLE; // Disable RTC outputRTCHandle.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH; // Set RTC output polarityRTCHandle.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN; // Set RTC output type/* Initialize RTC */HAL_RTC_Init(&RTCHandle);
}
该代码定义了一个名为RTC_Init的函数,它用于初始化RTC模块。此函数的主要步骤如下:
- 首先启用RTC时钟,以确保RTC模块正常工作。
__HAL_RCC_RTC_ENABLE();
- 然后,配置RTC的参数。该代码标识RTC实例并设置其他参数,如小时格式,异步预分频器,同步预分频器,输出来源,输出极性和输出类型。
RTCHandle.Instance = RTC; // 选择RTC实例
RTCHandle.Init.HourFormat = RTC_HOURFORMAT_24; // 设置小时格式
RTCHandle.Init.AsynchPrediv = 0x7F; // 设置异步预分频器
RTCHandle.Init.SynchPrediv = 0xFF; // 设置同步预分频器
RTCHandle.Init.OutPut = RTC_OUTPUT_DISABLE; // 禁用RTC输出
RTCHandle.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH; // 设置RTC输出极性
RTCHandle.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN; // 设置RTC输出类型
- 最后,使用HAL_RTC_Init函数初始化RTC,即启用RTC并根据先前设置的参数进行配置。
HAL_RTC_Init(&RTCHandle);
总之,这段代码使用了STM32F4系列芯片的HAL库提供的函数,以较少的代码为代价大大简化了RTC初始化的过程。
相关文章:
STM32F4系列芯片RTC模块介绍
RTC是“实时时钟”的缩写,它是一种芯片,在计算机等电子产品中广泛应用。RTC提供了实时时钟计时功能和存储时间的能力,即时钟模块,常用于控制和记录时间的应用场合。 RTC的工作原理 RTC主要由时钟电路、电源管理电路、晶振电路、…...
MySQL 在线人数 场景分析
一般在直播或者游戏中经常会统计用户在线人数,主要分为求每个时刻的在线人数和求某个时刻的在线人数两种。 【场景】:某个时刻的在线人数、每个时刻的在线人数 【知识点】:窗口函数、时间函数、sum(tag) over (order by dt,tag desc rows b…...
使用mybatis和dynamic-datasource-spring-boot-starter动态切换数据源操作数据库
记录:415 场景:使用mybatis和dynamic-datasource-spring-boot-starter动态切换数据源操作数据库。 版本:JDK 1.8,Spring Boot 2.6.3,dynamic-datasource-spring-boot-starter-3.3.2,mybatis-3.5.9。 源码:https://github.com/b…...
【日常刷题】迷宫问题
描述 定义一个二维数组 N*M ,如 5 5 数组下所示: int maze[5][5] { 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, }; 它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走…...
【Python童年游戏】满满的回忆杀—那些年玩过的童年游戏你还记得吗?那个才是你的菜?看到第一个我就泪奔了(致我们逝去的青春)
导语 滴一一学生卡🙌 结伴上车的学生仔子们 用笑声打破车厢的沉默 大人眼里的晚高峰 是给放学后快乐😀时光的加时 下车的学生匆匆起身带起 一阵熟悉的栀子香于💓 是关于校园的记忆 开始零零散散地闪现 放学后集合的秘密基地/跟着城…...
C++ | 认识标准库string和vector
本文概要 本篇文章主要介绍C的标准库类型string和vector,文中描述和代码示例很详细,看完即可掌握,感兴趣的小伙伴快来一起学习吧。 🌟🌟🌟个人简介 🌟🌟🌟 ☀️大家好&a…...
JAVA面试宝典: SpringCloud知识点(通俗易懂易背)
1、什么是 Spring Cloud? Spring Cloud 是基于 Spring Boot 的微服务架构开发工具箱,提供了在分布式系统中构建可靠的、弹性的、灵活的应用所需的大多数工具。Spring Cloud 中包含的子项目如下: Spring Cloud Config:配置管理工具…...
es学习笔记
集群环境下数据往哪个节点放? 路由计算:hash(id) %主分片的数量 集群环境下查数据怎么查? 分配控制:访问任何一个节点都能获取数据,随机访问到的这个节点称为协调节点(访问了当前节点,不一定从当前节点…...
SAS学习第9章:卡方检验之适合性检验与独立性检验
卡方检验就是统计样本的实际观测值与理论推断值之间的偏离程度,实际观测值与理论推断值之间的偏离程度就决定卡方值的大小,如果卡方值越大,二者偏差程度越大;反之,二者偏差越小;若两个值完全相等时…...
马斯克爆料Twitter裁了八成员工;OpenAI CEO:GPT-5根本不存在;小鹏被曝年终奖打0.5折 | AI一周资讯
来源: AI前线 微信号:ai-front 整理 | 凌敏 微软宣布开源 Deep Speed Chat;消息称软银旗下 Arm 启动赴美 IPO;国家网信办出台生成式 AI 管理办法;前理想 AI 芯片一号位骄旸加入三星,负责组建 GPU 团队…… 资 讯 Op…...
ASEMI代理ADG1408YRUZ-REEL7原装ADI车规级ADG1408YRUZ-REEL7
编辑:ll ASEMI代理ADG1408YRUZ-REEL7原装ADI车规级ADG1408YRUZ-REEL7 型号:ADG1408YRUZ-REEL7 品牌:ADI /亚德诺 封装:TSSOP-16 批号:2023 安装类型:表面贴装型 引脚数量:16 类型&#…...
phpstudy本地环境搭建图文教程
作者:Eason_LYC 悲观者预言失败,十言九中。 乐观者创造奇迹,一次即可。 一个人的价值,在于他所拥有的。可以不学无术,但不能一无所有! 技术领域:WEB安全、网络攻防 关注WEB安全、网络攻防。我的…...
【UE 控件蓝图】菜单及功能实现
素材资源连接:百度网盘 请输入提取码 密码:fvcw 效果 步骤 1. 创建蓝图,父类为“HUD” 命名为“MainMenuHUD”并打开 在事件图表中添加如下节点: 2. 创建控件蓝图,命名为“MainMenuWidget” 此时在“MainMenuHUD”的…...
Java 并发编程面试题——Future
目录 1.什么是 Future 模式?Java 中是如何实现的?2.Callable、Future 与 FutureTask 分别是什么?2.1.Callable 接口2.2.Future 接口2.3.FutureTask 类 3.CompletableFuture 类有什么用? 1.什么是 Future 模式?Java 中是…...
SpringBoot 介绍
1.简介 SpringBoot最开始基于Spring4.0设计,是由Pivotal公司提供的框架。 SpringBoot发展史: 2003年Rod Johnson成立Interface公司,产品是SpringFramework2004年,Spring框架开源,公司改名为Spring Source2008年&…...
自动驾驶作业手册
1 总 则 目的为保障港口内自动驾驶车辆安全使用,预防和减少事故,保护人民生命和财产安全,促进港口内业务开展。 含义和范围港口内自动驾驶车辆,是指电脑驾驶车辆,为一种运输动力的无人地面载具,与有人驾驶车辆不同,其具备不需要人类操作即可以感测其环境及导航功能,能…...
MySQL调优笔记——慢SQL优化记录(2)
今天调优的原因是,有一个统计报表业务,查询的时间太慢;同时由于数据库的压力是随机性的,这个业务的执行下限和上限相差近20倍;快的时候可以达到600ms,慢的时候有9秒之多; 接下来详细介绍&#x…...
二叉排序树的插入和删除操作(python实现)
二叉排序树的插入和删除操作都是在保持二叉排序树特性的前提下进行的。 插入操作: 在二叉排序树中插入一个新节点时,先比较新节点的值和当前节点的值的大小关系,若小于当前节点,则继续在当前节点的左子树中查找;若大…...
算法记录 | Day35 贪心算法
860.柠檬水找零 思路: 只需要维护三种金额的数量,5,10和20。 有如下三种情况: 情况一:账单是5,直接收下。情况二:账单是10,消耗一个5,增加一个10情况三:账…...
coinex // 撮合引擎 逻辑流程 (两种数据源 初始化源和前端源)
目录 1 生产者 数据源 1.1. match-server 一启动 初始化数据 自动查询数据库 查询level2要展示的数据 1.2 match-server接收 前端发给Exchange-server的数据 2. 将查询/接受的数据EntrustOrder 转成 Order 解耦 过滤掉不要的属性 3.Order转成 OrderEvent 4. 分配序号发布…...
基于MATLAB的数字图像处理系统:预处理、特征提取与语义分割全流程实现
数字图像处理系统(基于matlab) 此系统包括预处理,特征提取,语义分割 使用机器学习算法knn和svm 预处理包括线性灰度级变化,指数灰度级变化,直方图均衡化,高斯滤波,中值滤波ÿ…...
CANdb++ Editor高效使用技巧:5个隐藏功能大幅提升dbc编辑效率
CANdb Editor高效使用技巧:5个隐藏功能大幅提升dbc编辑效率 在汽车电子开发领域,Vector的CANdb Editor堪称dbc文件编辑的行业标准工具。大多数工程师都能熟练使用其基础功能,但真正的高手往往掌握着那些鲜为人知的"秘密武器"。本文…...
MQTT通信中的QoS级别详解:SpringBoot如何选择最适合的传输质量?
MQTT通信中的QoS级别详解:SpringBoot如何选择最适合的传输质量? 在物联网和分布式系统架构中,消息传输的可靠性往往直接关系到业务逻辑的正确性。MQTT协议作为轻量级发布/订阅模式的通信标准,其QoS(服务质量࿰…...
正点原子IMX6ULL史诗级新内核Linux7.0移植教程(5)梭哈配置主线设备树
正点原子IMX6ULL史诗级新内核Linux7.0移植教程(5)梭哈配置主线设备树 仓库已经开源,可以研究补丁和直接看完整教程:https://github.com/Awesome-Embedded-Learning-Studio/imx-forge 有任何意见欢迎提出 PR!会第一时间…...
LibreHardwareMonitor:5分钟掌握免费开源硬件监控的终极指南
LibreHardwareMonitor:5分钟掌握免费开源硬件监控的终极指南 【免费下载链接】LibreHardwareMonitor Libre Hardware Monitor, home of the fork of Open Hardware Monitor 项目地址: https://gitcode.com/GitHub_Trending/li/LibreHardwareMonitor 想要实时…...
ArduPilot电机控制逻辑与PWM输出机制剖析
1. ArduPilot电机控制基础概念 当你第一次接触无人机飞控时,最让人困惑的莫过于电机控制逻辑了。想象一下,你手里拿着遥控器,轻轻推动摇杆,无人机就能平稳地上升、下降或者转向。这背后到底发生了什么?让我用最直白的…...
Cursor功能增强工具使用指南
Cursor功能增强工具使用指南 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached your trial request limit. / Too many free t…...
如何突破Windows权限壁垒?系统管理专家的秘密武器
如何突破Windows权限壁垒?系统管理专家的秘密武器 【免费下载链接】NSudo [Deprecated, work in progress alternative: https://github.com/M2Team/NanaRun] Series of System Administration Tools 项目地址: https://gitcode.com/gh_mirrors/ns/NSudo 在W…...
硬件工程师职业发展路径与核心技术解析
硬件工程师的职业发展路径与技术深度探讨1. 行业现状与职业定位1.1 硬件工程师的职责演变现代硬件工程师的职责范围已从传统的电路设计扩展到系统集成、信号完整性分析、EMC设计等多个领域。典型的职责矩阵包括:职责类别传统要求现代扩展要求电路设计原理图绘制、PC…...
七牛云图床避坑指南:如何避免CNAME解析和HTTPS配置中的常见错误
七牛云图床高阶配置实战:CNAME与HTTPS深度排错手册 第一次用七牛云图床时,我在凌晨三点对着屏幕上的404错误发呆——明明按照文档一步步操作,为什么图片死活加载不出来?后来才发现是CNAME解析的TTL缓存问题。这种看似简单的配置背…...
