STM32 的 RTC(实时时钟)详解

目录

一、引言

二、RTC 概述

三、RTC 的工作原理

1.时钟源

2.计数器

3.闹钟功能

4.备份寄存器

四、RTC 寄存器

1.RTC_TR(Time Register,时间寄存器)

2.RTC_DR(Date Register,日期寄存器) 

3.RTC_SSR(Subsecond Register,亚秒寄存器) 

4.RTC_PRER(Prescaler Register,预分频器寄存器) 

5.RTC_CR(Control Register,控制寄存器) 

6.RTC_ISR(Interrupt Status Register,中断状态寄存器) 

7.RTC_BKPxR(Backup Register,备份寄存器)

五、实际应用

1.时间记录

2.定时任务

3.低功耗模式下的时间保持

六、代码实现 

七、总结 


一、引言

        在嵌入式系统中,准确的时间信息往往是至关重要的。STM32 系列微控制器内置的实时时钟(RTC)模块为系统提供了可靠的时间基准。本文将深入探讨 STM32 的 RTC 的功能、工作原理以及在实际应用中的使用方法

二、RTC 概述

RTC 是一种能够独立运行的时钟模块,即使在微控制器进入低功耗模式时也能保持时间的准确性。STM32 的 RTC 具有以下主要特点:

  1. 高精度计时:能够提供准确的时间信息,包括年、月、日、时、分、秒等。
  2. 低功耗运行:在电池供电的系统中,RTC 可以以极低的功耗运行,延长电池寿命。
  3. 闹钟功能:可以设置闹钟,在特定时间触发中断。
  4. 备份寄存器:用于存储关键数据,即使在系统电源关闭时也能保持数据不丢失。

三、RTC 的工作原理

1.时钟源

  • STM32 的 RTC 可以使用外部低速时钟源(LSE)或内部低速时钟源(LSI)。LSE 通常是一个 32.768kHz 的石英晶体振荡器,具有较高的精度。LSI 是一个内部的低功耗 RC 振荡器,精度相对较低,但在没有外部晶体的情况下可以作为备用时钟源。
  • 时钟源经过分频后为 RTC 提供计时脉冲。

2.计数器

  • RTC 包含一个可编程的预分频器和一个 32 位的计数器。预分频器用于将时钟源的频率分频到合适的频率,以满足不同的计时需求。计数器则根据预分频器输出的脉冲进行计数,从而实现时间的累加。
  • 通过读取计数器的值,可以获取当前的时间信息。

3.闹钟功能

  • RTC 可以设置多个闹钟,每个闹钟可以独立配置。闹钟可以基于特定的时间(如小时、分钟、秒)或日期(年、月、日)触发中断。
  • 当闹钟时间到达时,RTC 会产生一个中断信号,通知微控制器进行相应的处理。

4.备份寄存器

  • STM32 的 RTC 具有多个备份寄存器,可以用于存储关键数据。这些寄存器在系统电源关闭时由备用电源(如电池)供电,以确保数据不丢失。
  • 备份寄存器可以用于存储系统配置参数、校准数据等重要信息。

四、RTC 寄存器

1.RTC_TR(Time Register,时间寄存器)

  • 功能:用于存储当前的时间信息,包括小时、分钟、秒等。
  • 位定义
    • pm:占 1 位,用于表示上午 / 下午(AM/PM)符号,0 表示 AM/24 小时制,1 表示 PM。
    • ht(1:0):占 2 位,是小时的十位部分。
    • hu(3:0):占 4 位,是小时的个位部分。
    • mnt(2:0):占 3 位,为分钟的十位部分。
    • mnu(3:0):占 4 位,是分钟的个位部分。
    • st(2:0):占 3 位,代表秒的十位部分。
    • su(3:0):占 4 位,是秒的个位部分。
  • 操作注意事项:数据是以 BCD 码格式存储的,读取之后需要进行转换才能得到常规的十进制时间数据。在初始化模式下,对该寄存器进行写操作可以设置时间。

2.RTC_DR(Date Register,日期寄存器) 

  • 功能:保存当前的日期信息,包含年、月、日、星期等。
  • 位定义
    • yt(1:0):占 2 位,是年份的十位部分。
    • yu(3:0):占 4 位,为年份的个位部分。
    • wdu(2:0):占 3 位,表示星期几的个位,000 表示禁止,001 表示星期一,以此类推,111 表示星期日。
    • mt:占 1 位,是月份的十位部分。
    • mu:占 4 位,为月份的个位部分。
    • dt(1:0):占 2 位,代表日期的十位部分。
    • du(3:0):占 4 位,是日期的个位部分。
  • 操作要点:同样以 BCD 码格式存储数据,写操作可设置日期。

3.RTC_SSR(Subsecond Register,亚秒寄存器) 

  • 功能:用于记录亚秒值,能够提供更高精度的时间信息,通常用于精确到毫秒或更短时间单位的时间记录。
  • 计算亚秒值:亚秒值的计算需要结合同步预分频器的值。公式为亚秒值 = (prediv_s – ss(15:0)) / (prediv_s + 1),其中 ss(15:0) 是同步预分频器计数器的值,prediv_s 是同步预分频器的值。

4.RTC_PRER(Prescaler Register,预分频器寄存器) 

  • 组成:由 7 位的异步预分频器 apre 和 15 位的同步预分频器 spre 组成。
  • 功能:对输入的时钟源进行分频,以得到合适的时钟频率用于 RTC 的时间和日期更新。异步预分频器时钟 ck_apre 用于为二进制 RTC_SSR 亚秒递减计数器提供时钟,同步预分频器时钟 ck_spre 用于更新日历。
  • 时钟频率计算:异步预分频器时钟 fck_apre = frtc_clk / (prediv_a + 1),同步预分频器时钟 fck_spre = frtc_clk / (prediv_s + 1)。为了最大程度降低功耗,一般将异步预分频器配置为较高的值。

5.RTC_CR(Control Register,控制寄存器) 

  • 功能:用于控制 RTC 的各种功能,如开启或关闭 RTC、设置闹钟使能、选择时钟源等。
  • 具体位的作用:不同的位具有不同的功能,例如可能有位用于使能闹钟输出、配置闹钟输出的极性、设置时间戳功能等。

6.RTC_ISR(Interrupt Status Register,中断状态寄存器) 

  • 功能:反映 RTC 的各种中断状态,例如闹钟中断标志位、时间戳中断标志位等。当相应的事件发生时,对应的标志位会被置位,通过读取该寄存器可以判断中断是否发生以及发生的是哪种中断。

7.RTC_BKPxR(Backup Register,备份寄存器)

  • 功能:STM32 的 RTC 有备份寄存器,包括 20 个 32 位寄存器,用于存储用户应用数据。这些寄存器在备份域中实现,可在 VDD 电源关闭时通过 VBAT 保持上电状态。备份寄存器不会在系统复位或电源复位时复位,也不会在器件从待机模式唤醒时复位。它可用于在掉电等情况下保存一些关键数据。

五、实际应用

1.时间记录

  • 在数据采集系统中,RTC 可以用于记录数据的采集时间,以便后续分析和处理。
  • 在日志记录系统中,RTC 可以为每条日志记录添加时间戳,方便查看和分析系统的运行情况。

2.定时任务

  • 可以使用 RTC 的闹钟功能来实现定时任务,如在特定时间执行特定的操作。例如,在智能家居系统中,可以设置在特定时间打开或关闭电器设备。
  • 在工业自动化系统中,RTC 可以用于定时控制生产过程中的各个环节。

3.低功耗模式下的时间保持

在低功耗应用中,当微控制器进入低功耗模式时,RTC 可以继续运行,保持时间的准确性。当系统从低功耗模式唤醒时,可以通过 RTC 获取当前的时间信息,无需重新初始化时间。

六、代码实现 

以下是一个使用 STM32F429 的 RTC(实时时钟)的代码示例:

#include "stm32f4xx.h"
#include "stm32f4xx_hal.h"void RTC_Init(void)
{// 使能电源时钟和备份区域时钟__HAL_RCC_PWR_CLK_ENABLE();__HAL_RCC_BKPSRAM_CLK_ENABLE();// 允许访问备份寄存器HAL_PWR_EnableBkUpAccess();// 检查是否已经配置过 RTCif ((RCC->BDCR & RCC_BDCR_RTCEN)!= 0){// RTC 已经配置过,无需再次初始化return;}// 选择 LSE 作为 RTC 时钟源__HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW);RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSE;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;if (HAL_RCC_OscConfig(&RCC_OscInitStruct)!= HAL_OK){Error_Handler();}// 使能 RTC 时钟RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC;PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct)!= HAL_OK){Error_Handler();}// 初始化 RTCRTC_HandleTypeDef hrtc;hrtc.Instance = RTC;hrtc.Init.HourFormat = RTC_HOURFORMAT_24;hrtc.Init.AsynchPrediv = 0x7F;hrtc.Init.SynchPrediv = 0xFF;hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;if (HAL_RTC_Init(&hrtc)!= HAL_OK){Error_Handler();}
}void RTC_SetTime(uint8_t hour, uint8_t minute, uint8_t second)
{RTC_TimeTypeDef sTime = {0};sTime.Hours = hour;sTime.Minutes = minute;sTime.Seconds = second;sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;sTime.StoreOperation = RTC_STOREOPERATION_RESET;if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN)!= HAL_OK){Error_Handler();}
}void RTC_SetDate(uint8_t year, uint8_t month, uint8_t day)
{RTC_DateTypeDef sDate = {0};sDate.Year = year;sDate.Month = month;sDate.Date = day;sDate.WeekDay = RTC_WEEKDAY_MONDAY;if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN)!= HAL_OK){Error_Handler();}
}void RTC_GetTime(uint8_t *hour, uint8_t *minute, uint8_t *second)
{RTC_TimeTypeDef sTime;if (HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BIN)!= HAL_OK){Error_Handler();}*hour = sTime.Hours;*minute = sTime.Minutes;*second = sTime.Seconds;
}void RTC_GetDate(uint8_t *year, uint8_t *month, uint8_t *day)
{RTC_DateTypeDef sDate;if (HAL_RTC_GetDate(&hrtc, &sDate, RTC_FORMAT_BIN)!= HAL_OK){Error_Handler();}*year = sDate.Year;*month = sDate.Month;*day = sDate.Date;
}void Error_Handler(void)
{// 处理错误while (1){}
}

在主函数中,可以这样调用:

int main(void)
{HAL_Init();RTC_Init();// 设置时间为 12:30:00RTC_SetTime(12, 30, 0);// 设置日期为 2023 年 9 月 14 日RTC_SetDate(23, 9, 14);uint8_t hour, minute, second;uint8_t year, month, day;// 获取时间和日期并打印RTC_GetTime(&hour, &minute, &second);RTC_GetDate(&year, &month, &day);while (1){}
}

七、总结 

        STM32 的 RTC 模块为嵌入式系统提供了可靠的时间基准。通过了解 RTC 的工作原理、配置方法和应用场景,开发者可以充分利用 RTC 的功能,为系统添加时间记录、定时任务等功能,提高系统的实用性和可靠性。在使用 RTC 时,需要注意时钟源的选择、时间的初始化和校准以及备份寄存器的使用等问题,以确保 RTC 的正常运行和数据的安全性。

希望本文对大家在使用 STM32 的 RTC 模块时有所帮助。

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

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

相关文章

TCP 拥塞控制:一场网络数据的交通故事

从前有条“高速公路”,我们叫它互联网,而这条公路上的车辆,则是数据包。你可以把 TCP(传输控制协议)想象成一位交通警察,负责管理这些车辆的行驶速度,以防止交通堵塞——也就是网络拥塞。 第一…

【MPC】无人机模型预测控制复现Data-Driven MPC for Quadrotors项目(Part 1)

无人机模型预测控制复现Data-Driven MPC for Quadrotors项目 参考链接背景和问题方法与贡献实验结果安装ROS创建工作空间下载RotorS仿真器源码和依赖创建Python虚拟环境下载data_driven_mpc仓库代码下载并配置ACADO求解器下载并配置ACADO求解器的Python接口下载并配置rpg_quadr…

基于密码的大模型安全治理的思考

文章目录 前言一、大模型发展现状1.1 大模型技术的发展历程1.2 大模型技术的产业发展二、大模型安全政策与标准现状2.1 国外大模型安全政策与标准2.2 我国大模型安全政策与标准前言 随着大模型技术的迅速发展和广泛应用,其安全性问题日益凸显。密码学作为网络空间安全的核心技…

如何简化机器人模型,加速仿真计算与可视化

通常,我们希望将自己设计的机器人模型导入仿真环境。由于是通过 CAD 软件设计的,导出的 urdf 使用 STL 或 DAE 文件来表示 3D 几何。但原始的 STL 或 DAE 文件通常过于复杂(由数十万个三角面片组成),这会减慢仿真速度,有时也会导致仿真软件报错(如Webots)。为了在正确描述…

【Linux】调试和Git及进度条实现

这里是阿川的博客,祝您变得更强 ✨ 个人主页:在线OJ的阿川 💖文章专栏:Linux入门到进阶 🌏代码仓库: 写在开头 现在您看到的是我的结论或想法,但在这背后凝结了大量的思考、经验和讨论 目录 1.…

KVM创建的虚拟机无法访问外网

基础环境如下: [rootlocalhost ~]# virsh domifaddr CentOS7_YFName MAC address Protocol Address -------------------------------------------------------------------------------vnet0 52:54:00:cb:a6:0d ipv4 192.168.…

Java中的事务管理

1.1 事务管理 1.1 事务回顾 事务是一组操作的集合,它是一个不可分割的工作单位。事务会把所有的操作作为一个整体,一起向数据库提交或者是撤销操作请求。所以这组操作要么同时成功,要么同时失败。 怎么样来控制这组操作,让这组操…

OpenCV高阶操作

在图像处理与计算机视觉领域,OpenCV(Open Source Computer Vision Library)无疑是最为强大且广泛使用的工具之一。从基础的图像读取、 1.图片的上下,采样 下采样(Downsampling) 下采样通常用于减小图像的…

RabbitMQ(高阶使用)延时任务

文章内容是学习过程中的知识总结,如有纰漏,欢迎指正 文章目录 1. 什么是延时任务? 1.1 和定时任务区别 2. 延时队列使用场景 3. 常见方案 3.1 数据库轮询 优点 缺点 3.2 JDK的延迟队列 优点 缺点 3.3 netty时间轮算法 优点 缺点 3.4 使用消息…

安卓BLE蓝牙通讯

蓝牙测试demo 简介   Android手机间通过蓝牙方式进行通信,有两种常见的方式,一种是socket方式(传统蓝牙),另一种是通过GATT(BLE蓝牙)。与传统蓝牙相比,BLE 旨在大幅降低功耗。这样…

【Obsidian】当笔记接入AI,Copilot插件推荐

当笔记接入AI,Copilot插件推荐 自己的知识库笔记如果增加AI功能会怎样?AI的回答完全基于你自己的知识库余料,是不是很有趣。在插件库中有Copilot插件这款插件,可以实现这个梦想。 一、什么是Copilot? 我们知道githu…

香橙派zero2w上手——环境配置添加OLED小屏幕

0 硬件参数 origin pi zero2W 硬件参数 CPU全志 H618 四核 64 位 1.5GHz Cortex-A53 处理器GPUMali G31 MP2,支持OpenGL ES 1.0/2.0/3.2,OpenCL 2.0,Vulkan 1.1内存LPDDR4:1GB/1.5GB/2GB/4GB (可选)存储SPI Flash: 16MBWiFi蓝牙WiFi蓝牙二合…

将硬盘的GPT 转化为MBR格式

遇到的问题 在重新安装系统时,磁盘遇到无法空间分配给系统。 解决方式 使用Windows10镜像 U盘安装,选择磁盘时,转换磁盘格式为MBR。然后退出安装程序。 Shift F10# 输入 diskpart# 查看磁盘信息 list disk# 选择需要转换的磁盘&#xff0…

【网络安全的神秘世界】攻防环境搭建及漏洞原理学习

🌝博客主页:泥菩萨 💖专栏:Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 Kali安装docker 安装教程 PHP攻防环境搭建 中间件 介于应用系统和系统软件之间的软件。 能为多种应用程序合作互通、资源…

一、机器学习算法与实践_02KNN算法笔记

1、KNN基本介绍 1.1 定义 KNN(K-NearestNeighbor,即:K最邻近算法)是一种基于实例的学习方法,用于分类和回归任务,它通过查找一个数据点的最近邻居来预测该数据点的标签或数值。 所谓K最近邻,…

Golang | Leetcode Golang题解之第402题移掉K位数字

题目&#xff1a; 题解&#xff1a; func removeKdigits(num string, k int) string {stack : []byte{}for i : range num {digit : num[i]for k > 0 && len(stack) > 0 && digit < stack[len(stack)-1] {stack stack[:len(stack)-1]k--}stack app…

python-简单的数据结构

题目描述 小理有一天在网上冲浪的时候发现了一道很有意思的数据结构题。 该数据结构形如长条形。 一开始该容器为空&#xff0c;有以下七种操作。 1 a从前面插入元素 a ; 2 从前面删除一个元素; 3 a从后面插入一个元素; 4 从后面删除一个元素; 5 将整个容器头尾翻转; 6 输出个…

Mysql调优之性能监控(一)

前言&#xff1a; 官网就是最好的老师&#xff1a;MySQL&#xff0c;里面各种语法跟参数跟性能调试工具 一、使用show profile查询剖析工具 -- 开启 SET profiling 1; -- 关闭 SET profiling 0; -- 显示查询的性能分析信息 show profiles; -- 显示具体查询id的执行步骤耗时 S…

【视频教程】基于python深度学习遥感影像地物分类与目标识别、分割实践技术应用

我国高分辨率对地观测系统重大专项已全面启动&#xff0c;高空间、高光谱、高时间分辨率和宽地面覆盖于一体的全球天空地一体化立体对地观测网逐步形成&#xff0c;将成为保障国家安全的基础性和战略性资源。未来10年全球每天获取的观测数据将超过10PB&#xff0c;遥感大数据时…

直流无刷电机霍尔线序自学习解释

直流无刷电机霍尔线序自学习 步骤详解 1. 初始连接 连接电机的三相线&#xff1a;A、B、C。连接霍尔传感器线&#xff1a;HA、HB、HC。 2. 输入电压组合与霍尔信号记录 电机的电压输入组合和霍尔信号记录是电机控制系统中至关重要的一部分&#xff0c;它们决定了电机的运转…