STM32F407单片机编程入门(十四) 内部RTC实时时钟详解及实战含源码

news2024/12/27 15:27:57

文章目录

    • 一.概要
    • 二.RTC基本介绍
    • 三.STM32单片机RTC内部结构图
    • 四.CubeMX配置一个RTC时间例程
    • 五.CubeMX工程源代码下载
    • 六.小结

一.概要

RTC(Real-Time Clock)是一种用于追踪和记录实际时间的时钟系统。在STM32中,RTC通常用于提供实时时钟和日期信息,例如年、月、日、时、分、秒等。RTC在许多应用中都是重要的,尤其是需要记录事件发生时间的系统,如数据日志、定时器等。
RTC位于系统的后备区域,这意味着在系统复位时,其数据不会清零。此外,即使在电源VDD(2.0-3.6V)断开的情况下,RTC仍可以通过备份电源VBAT(1.8~3.6V)供电,继续运行。

本文介绍了STM32 RTC实时时钟的基本概念,内部结构,以及用内部RTC进行时间计时的例程。

二.RTC基本介绍

实时时钟 (RTC) 是一个独立的 BCD 定时器/计数器。RTC 提供一个日历时钟、两个可编程
闹钟中断,以及一个具有中断功能的周期性可编程唤醒标志。RTC 还包含用于管理低功耗模 式的自动唤醒单元。
两个 32 位寄存器包含二进码十进数格式 (BCD) 的秒、分钟、小时(12 或 24 小时制)、星
期几、日期、月份和年份。此外,还可提供二进制格式的亚秒值。
系统可以自动将月份的天数补偿为 28、29(闰年)、30 和 31 天。并且还可以进行夏令时
补偿。
其它 32 位寄存器还包含可编程的闹钟亚秒、秒、分钟、小时、星期几和日期。
此外,还可以使用数字校准功能对晶振精度的偏差进行补偿。
上电复位后,所有 RTC 寄存器都会受到保护,以防止可能的非正常写访问。
无论器件状态如何(运行模式、低功耗模式或处于复位状态),只要电源电压保持在工作范
围内,RTC 便不会停止工作。

三.STM32单片机RTC内部结构图

RTC内部结构图如下

在这里插入图片描述
RTC 时钟源 (RTCCLK) 通过时钟控制器从 LSE 时钟、LSI 振荡器时钟以及 HSE 时钟三者中选择。
可编程的预分频器阶段可生成 1 Hz 的时钟,用于更新日历。为最大程度地降低功耗,预分
频器分为 2 个可编程的预分频器。
RTC 日历时间和日期寄存器可通过与 PCLK1(APB1 时钟)同步的影子寄存器来访问。这
些时间和日期寄存器也可以直接访问,这样可避免等待同步的持续时间,每隔两个RTCCLK 周期,便将当前日历值复制到影子寄存器。
● RTC_SSR 对应于亚秒
● RTC_TR 对应于时间
● RTC_DR 对应于日期

当应用读取日历寄存器时,它会访问影子寄存器的内容。也可以通过将 RTC_CR 寄存器的
BYPSHAD 控制位置 1 来直接访问日历寄存器。默认情况下,该位被清零,用户访问影子寄存器。

日历时间读取:
当 RTC_CR 寄存器中的 BYPSHAD 控制位清零时
要正确读取 RTC 日历寄存器(RTC_SSR、RTC_TR 和 RTC_DR),APB1 时钟频率 (fPCLK1) 必须等于或大于 RTCCLK RTC 时钟频率的七倍。这可以确保同步机制行为的安全性。
如果 APB1 时钟频率低于 RTC 时钟频率的七倍,则软件必须分两次读取日历时间寄存器和
日期寄存器。这样,当两次读取的 RTC_TR 结果相同时,才能确保数据正确。否则必须执
行第三次读访问。任何情况下,APB1 的时钟频率都不能低于 RTC 的时钟频率。

四.CubeMX配置一个RTC时间例程

硬件准备:

STLINK接STM32F407VET6开发板,STLINK接电脑USB口。
在这里插入图片描述

打开STM32CubeMX软件,新建工程
在这里插入图片描述
Part Number处输入STM32F407VE,再双击就创建新的工程
在这里插入图片描述

配置下载口引脚
在这里插入图片描述

配置外部晶振引脚
在这里插入图片描述
在这里插入图片描述
配置RTC
在这里插入图片描述

配置系统主频168Mhz,使用外部晶振
在这里插入图片描述
配置RTC使能LSE晶振
在这里插入图片描述

配置工程文件名,保存路径,KEIL5工程输出方式
在这里插入图片描述

生成工程
在这里插入图片描述

用Keil5打开工程
在这里插入图片描述

添加代码

在这里插入图片描述
在这里插入图片描述

static void RTC_CalendarShow(uint8_t *showtime, uint8_t *showdate)
{
  RTC_DateTypeDef sdatestructureget;
  RTC_TimeTypeDef stimestructureget;

  /* Get the RTC current Time */
  HAL_RTC_GetTime(&hrtc, &stimestructureget, RTC_FORMAT_BIN);
  /* Get the RTC current Date */
  HAL_RTC_GetDate(&hrtc, &sdatestructureget, RTC_FORMAT_BIN);
//  /* Display time Format : hh:mm:ss */
  sprintf((char *)showtime, "%2d:%2d:%2d", stimestructureget.Hours, stimestructureget.Minutes, stimestructureget.Seconds);
//  /* Display date Format : mm-dd-yy */
  sprintf((char *)showdate, "%2d-%2d-%2d", sdatestructureget.Month, sdatestructureget.Date, 2000 + sdatestructureget.Year);
}
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 */

  /* 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_RTC_Init();//采用LSE 32.768K外部晶振
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
	RTC_CalendarShow(aShowTime, aShowDate);//读取时间,日期保存到数组
  }
  /* USER CODE END 3 */
}


实验效果
查看aShowTime数组,能看到时间会一秒一秒走
在这里插入图片描述

五.CubeMX工程源代码下载

通过网盘分享的文件:16.RTC实时时钟实验.zip
链接: https://pan.baidu.com/s/193aLDBXAbOPq42eP-hYryw 提取码: k9qk

如果链接失效,可以联系博主给最新链接
程序下载下来之后解压就行

六.小结

RTC 可以为嵌入式系统提供精确的时间基准,用于各种定时任务和事件。RTC 可以用于智能家居设备中的时间控制,如智能门锁、智能照明等。

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

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

相关文章

【python】修改字典的内容

person {"name": "John", "age": 30, "city": "New York"} print("最开始的信息:",person)def process_person_info(person):# 检查对象中是否包含所有必要的键if name in person and age in person …

MySQL缓冲池详解

Buffer Pool 本文参考开源项目:小林coding在线文档; 01-缓冲池概述 ​ 在MySQL查询数据的时候,是通过存储引擎去磁盘做IO来获取数据库中的数据,这样每次查询一条数据都要去做一次或者多次磁盘的IO,无疑是非常慢的。…

(C++23) expected 基础使用

文章目录 ⭐前言⭐expected🎛️基础使用🎛️单子操作 (Monadic operations)🎚️and_then & or_else🎚️transform & transform_error ⭐END🌟跋🌟交流方式 ⭐前言 在 C17 中,提出了 op…

量化交易backtrader实践(二)_基础加强篇(4)_交易设置与自定义绘图

这一节我们来深入实践交易的设置以及自定义绘图。 01_交易设置 参考文档: Backtrader系列教程④:交易篇(上)_backtrader撤单操作-CSDN博客量化投资之工具篇一:Backtrader从入门到精通(8)-交易…

记软件开发者画图(UML),使用WPS应用制图

目录 前言 一、什么是UML 二、使用什么画图工具 三、示例 ​四、IntelliJ IDEA 2021快速生成UML图 前言 做软件开发的从写第一个示例程序到最后写项目程序避不开的需要设计画图,所以今天我们就来梳理一下‌UML(统一建模语言)图形需要画…

《深度学习》卷积神经网络CNN 原理及其流程解析

目录 一、CNN图像原理 1、了解图像的原理 2、举例 二、CNN图像识别 1、画面不变性 2、主要表现 1)平移不变性 2)尺度不变性 3)旋转不变性 3、传统神经网络识别 1)数据预处理 2)特征提取 3)搭建神经网…

C++基础(8.继承_多态)

目录 继承: 继承的概念: 继承的定义: 基类和派生类对象赋值转换 : 继承中的作用域: 派生类的默认成员函数: 例题: ​编辑​编辑​编辑 继承与友元: 继承与静态成员&#xff1…

图片马赛克处理(Java)

1.需求 给图片的指定区域打码给整张图片打码马赛克方格取色支持中心点取色和随机取色马赛克支持灰度处理 2.源码 package com.visy.utils;import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOE…

Rabbitmq消息队列,安装,使用,三种工作模式

产品 消息队列技术介绍 消息队列概述 消息队列中间件是分布式系统中重要的组件,主要解决应用耦合、异步消息、流量削锋等问题。实现高性能、高可用、可伸缩和最终一致性架构。是大型分布式系统不可缺少的中间件。 目前在生产环境,使用较多的消息队列有…

基于51单片机的汽车倒车防撞报警器系统

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 本课题基于微控制器控制器, 设计一款汽车倒车防撞报警器系统。 要求: 要求:1.配有距离, 用于把车和障碍物之间的距离信号送入控制器。 2.配有报警系…

2024AI做PPT软件如何重塑演示文稿的创作

现在AI技术的发展已经可以帮我们写作、绘画,最近我发现了不少ai做ppt的工具!不体验不知道,原来合理使用AI工具可以有效的帮我们进行一些办公文件的编写,提高了不少工作效率。如果你也有这方面的需求就接着往下看吧。 1.笔灵AIPPT…

内网穿透out了?黑群晖+IPv6+NAS公网助手的访问体验

科技宅最带折腾黑群晖,这不,尝试一下ipv6动态域名解析,远程访问群晖NAS的方法千千万,这个方法我早就想到了,今天终于体验了一把,把经验分享一下: 目录 黑群晖的魅力 IPv6的加入:无…

Python办公自动化教程(003):PDF的加密

【1】代码 from PyPDF2 import PdfReader, PdfWriter# 读取PDF文件 pdf_reader PdfReader(./file/Python教程_1.pdf) pdf_writer PdfWriter()# 对第1页进行加密 page pdf_reader.pages[0]pdf_writer.add_page(page) # 设置密码 pdf_writer.encrypt(3535)with open(./file/P…

上位机图像处理和嵌入式模块部署(linux小系统开发)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 和若干年前相比较,现在嵌入式linux开发要简单得多。稍微贵一点的有树莓派,国产的有各种水果派,基本上都可以按照…

苍穹外卖学习日志 -----20天项目从零到完结-----含软件下载,环境配置,框架学习,代码编写,报错处理,测试联调,每日总结,心路历程等等......

年份 2024 基础:Javase Javaweb 已完结 2024 8.25---9.14 20天 Day-01 8.25 今天开始学习已经晚了,网盘下载了一下文件,做了一些开始项目的准备工作。 本来其实打算用notepad来写学习日志的,但是那个传…

如何给bat文件替换好看的图标

最近遇到软件运行在Windows系统,通过bat文件启动,但是bat文件的图标不好看,而且作为启动快捷方式放桌面看上去跟其他软件不搭调,于是得给bat文件换个软件图标。 软件ico图标 Windows系统下使用.ico文件作为软件图标。另外favicon…

go libreoffice word 转pdf

一、main.go 关键代码 完整代码 package mainimport ("fmt""github.com/jmoiron/sqlx""github.com/tealeg/xlsx""log""os/exec""path/filepath" ) import _ "github.com/go-sql-driver/mysql"import &q…

Python练习宝典:Day 1 - 选择题 - 基础知识

目录 一、踏上Python之旅二、Python语言基础三、流程控制语句四、序列的应用 一、踏上Python之旅 1.想要输出 I Love Python,应该使用()函数。 A.printf() B.print() C.println() D.Print()2.Python安装成功的标志是在控制台(终端)输入python/python3后,命令提示符变为: A.&…

数业智能心大陆:职场倦怠的新解法

什么是职业倦怠? 在职场中,职业倦怠的表现形式丰富多样。从数业智能心大陆 AI 心理咨询平台的数据来看,职业倦怠呈现出多种状态。教师可能对教学不再满怀热情,精心备课也成为过去式;情绪上容易烦躁、易怒,在…

【d47_2】【Java】【力扣】1791.找出星型图的中心节点

思路 直接判断 edges[0][0] edges[0][1] edges[1][0] edges[1][1] 谁重复了 例如&#xff1a; [ [1,2] [2,3] ....],那么中心节点一定是2 代码 class Solution {public int findCenter(int[][] edges) {for (int i0;i<1;i){if (edges[1][0]edges[0][i]) {return edg…