STM32之RTC时钟

article/2025/8/6 23:40:19

前言 

了解实时时钟RTC的原理。STM32芯片自带RTC,因此不须像其他MCU需外接RTC模块。请编程实现STM32的日历读取、设置和输出。要求:

1)读取RTC初始时间,验证是否为 1970年1月1日零分零秒;

2)将RTC时间调整为当前时间,并以 2021年x月x日x分x秒的格式从串口输出(或输出到OLED屏),每1s改变一次;

3)如果输出内容中需加入“星期x”,请修改代码。

目录

前言 

一.RTC时钟介绍

RTC原理框图

RTC具体流程:

RTC时钟选择

RTC复位过程

RTC中断

二.创建cubemax

1.设置RCC

2.配置RTC

三.修改代码

四.总结


一.RTC时钟介绍

RTC (Real Time Clock):实时时钟

RTC是个独立的定时器。RTC模块拥有一个连续计数的计数器,在相应的软件配置下,可以提供时钟日历的功能。修改计数器的值可以重新设置当前时间和日期 RTC还包含用于管理低功耗模式的自动唤醒单元。

å¨è¿éæå¥å¾çæè¿°

 可编程的预分频系数:分频系数高为220。
● 32位的可编程计数器,可用于较长时间段的测量。
● 2个分离的时钟:用于APB1接口的PCLK1和RTC时钟(RTC时钟的频率必须小于PCLK1时钟 频率的四分之一以上)。
● 可以选择以下三种RTC的时钟源
     ● HSE时钟除以128;
     ● LSE振荡器时钟;
     ● LSI振荡器时钟

● 2个独立的复位类型:
     ● APB1接口由系统复位;
     ● RTC核心(预分频器、闹钟、计数器和分频器)只能由后备域复位

● 3个专门的可屏蔽中断:
     ● 1.闹钟中断,用来产生一个软件可编程的闹钟中断。

     ● 2.秒中断,用来产生一个可编程的周期性中断信号(长可达1秒)。

     ● 3.溢出中断,指示内部可编程计数器溢出并回转为0的状态。

RTC时钟源:
三种不同的时钟源可被用来驱动系统时钟(SYSCLK):

● HSI振荡器时钟
● HSE振荡器时钟
● PLL时钟

这些设备有以下2种二级时钟源:

● 40kHz低速内部RC,可以用于驱动独立看门狗和通过程序选择驱动RTC。 RTC用于从停机/待机模式下自动唤醒系统。
● 32.768kHz低速外部晶体也可用来通过程序选择驱动RTC(RTCCLK)。



RTC原理框图

在这里插入图片描述
RTC时钟的框图还是比较简单的,这里我们把他分成 两个部分:

APB1 接口:用来和 APB1 总线相连。 此单元还包含一组 16 位寄存器,可通过 APB1 总线对其进行读写操作。APB1 接口由 APB1 总 线时钟驱动,用来与 APB1 总线连接。

通过APB1接口可以访问RTC的相关寄存器(预分频值,计数器值,闹钟值)。

RTC 核心接口:由一组可编程计数器组成,分成 两个主要模块 。
在这里插入图片描述g

第二个模块是一个 32 位的可编程计数器 (RTC_CNT),可被初始化为当前的系统时间,一个 32 位的时钟计数器,按秒钟计算,可以记 录 4294967296 秒,约合 136 年左右,作为一般应用,这已经是足够了的。



RTC具体流程:

RTCCLK经过RTC_DIV预分频,RTC_PRL设置预分频系数,然后得到TR_CLK时钟信号,我们一般设置其周期为1s,RTC_CNT计数器计数,假如1970设置为时间起点为0s,通过当前时间的秒数计算得到当前的时间。RTC_ALR是设置闹钟时间,RTC_CNT计数到RTC_ALR就会产生计数中断,

  • RTC_Second为秒中断,用于刷新时间,
  • RTC_Overflow是溢出中断。
  • RTC Alarm 控制开关机



RTC时钟选择

使用HSE分频时钟或者LSI的时候,在主电源VDD掉电的情况下,这两个时钟来源都会受到影响,因此没法保证RTC正常工作.所以RTC一般都时钟低速外部时钟LSE,频率为实时时钟模块中常用的32.768KHz,因为32768 = 2^15,分频容易实现,所以被广泛应用到RTC模块.(在主电源VDD有效的情况下(待机),RTC还可以配置闹钟事件使STM32退出待机模式).



RTC复位过程

除了RTC_PRL、RTC_ALR、RTC_CNT和RTC_DIV寄存器外,所有的系统寄存器都由系统复位或电源复位进行异步复位。
RTC_PRL、RTC_ALR、RTC_CNT和RTC_DIV寄存器仅能通过备份域复位信号复位。

系统复位后,禁止访问后备寄存器和RCT,防止对后卫区域(BKP)的意外写操作



RTC中断

秒中断:
这里时钟自带一个秒中断,每当计数加一的时候就会触发一次秒中断,。注意,这里所说的秒中断并非一定是一秒的时间,它是由RTC时钟源和分频值决定的“秒”的时间,当然也是可以做到1秒钟中断一次。我们通过往秒中断

里写更新时间的函数来达到时间同步的效果

闹钟中断:
闹钟中断就是设置一个预设定的值,计数每自加多少次触发一次闹钟中断

二.创建cubemax

1.设置RCC

 

 

  • 设置高速外部时钟HSE 选择外部时钟源
  • 使能外部晶振LSE

RTC设备因为其独特的运行方式(即掉电依旧运行)使用HSE分频时钟或者LSI的时候,在主电源VDD掉电的情况下,这两个时钟来源都会受到影响,资源消耗太大,小小的纽扣电池根本吃不消。没法保证RTC正常工作.所以RTC一般都时钟低速外部时钟LSE

2.配置RTC

å¨è¿éæå¥å¾çæè¿°

 

  • Activate Clock Source 激活时钟源
  • Activate calendar激活日历

这两个都要点,作用也很明显,先是使能时钟源,再使能RTC日历

  • RTC_OUT: Not RTC_OUT
  • Tamper: ×

第一个是是否使能 tamper(PC13)引脚上输出校正的秒脉冲时钟,

第二个: RTC入侵检测校验功能

RTC校验功能,使能侵入检测功能。RTC时钟经64分频输出到侵入检测引脚TAMPER上
当 TAMPER引脚上的信号从 0变成1或者从 1变成 0(取决于备份控制寄存器BKP_CR的 TPAL位),会产生一个侵入检测事件。侵入检测事件将所有数据备份寄存器内容清除。

  1. 也就是第一个是使能tamper(PC13)引脚作为时钟脉冲输出
  2. 第二个是使能tamper(PC13)引脚作为入侵检测功能

下面是两个RTC的中断:

  • RTC全局中断RTC_IRQHandler()
  • 闹钟中断函数RTCAlarm_IRQHandler()

 

此处设置时间为2020/04/25 13:30:00

  • Data Format: 日期格式

Binary data format 十六进制
BCD data format BCD码进制

使用自动配置,初始化时间必须使用BCD data format,原因是库函数存在bug,如果使用Binary data format,月份配置会出错,比如说11月,配置时会赋值为RTC_MONTH_NOVEMBER,而此宏定义值为0x11,也就是说其十进制值为17

  • Hours: 小时

  • Minutes: 分钟

  • Seconds: 秒

  • Week Day: 星期

  • Month 月份

  • Date: 日期

  • Year: 年份

3 使能串口
在这里插入图片描述

使能一下串口,因为发送日期到上位机

4时钟源设置

我的是 外部晶振为8MHz

  • 1选择外部时钟HSE 8MHz
  • 2PLL锁相环倍频9倍
  • 3系统时钟来源选择为PLL
  • 4设置APB1分频器为 /2
  • 5 使能CSS监视时钟
  • 6 设置RTC时钟为LSE

32的时钟树框图 如果不懂的话请看《【STM32】系统时钟RCC详解(超详细,超全面)》

 5项目文件设置

 

 

三.修改代码

在main.c文件中重写fputc函数,完成printf函数的重定向

//添加头文件#include "stdio.h"
int fputc(int ch,FILE *f){uint8_t temp[1]={ch};HAL_UART_Transmit(&huart1,temp,1,2);return ch;
}

在main.c中定义时间和日期的结构体用来获取时间和日期

RTC_DateTypeDef GetData;  //获取日期结构体RTC_TimeTypeDef GetTime;   //获取时间结构体

在main函数的while循环中添加以下代码

/* Get the RTC current Time */HAL_RTC_GetTime(&hrtc, &GetTime, RTC_FORMAT_BIN);/* Get the RTC current Date */HAL_RTC_GetDate(&hrtc, &GetData, RTC_FORMAT_BIN);/* Display date Format : yy/mm/dd */printf("%02d/%02d/%02d\r\n",2000 + GetData.Year, GetData.Month, GetData.Date);/* Display time Format : hh:mm:ss */printf("%02d:%02d:%02d\r\n",GetTime.Hours, GetTime.Minutes, GetTime.Seconds);printf("\r\n");HAL_Delay(1000);

编译运行,效果如下:

 添加输出星期几

/* Display date Format : weekday */if(GetData.WeekDay==1){printf("星期一\r\n");}else if(GetData.WeekDay==2){printf("星期二\r\n");}else if(GetData.WeekDay==3){printf("星期三\r\n");}else if(GetData.WeekDay==4){printf("星期四\r\n");}else if(GetData.WeekDay==5){printf("星期五\r\n");}else if(GetData.WeekDay==6){printf("星期六\r\n");}else if(GetData.WeekDay==7){printf("星期日\r\n");}

 运行编译

å¨è¿éæå¥å¾çæè¿°

 

四.总结

练习熟悉了RTC。


http://chatgpt.dhexx.cn/article/q8vnX6qw.shtml

相关文章

【STM32】HAL库 STM32CubeMX教程十三---RTC时钟

前言: 本系列教程将 对应外设原理,HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 所用工具: 1、芯片: STM32F407ZET6/ STM32F103ZET6 2、STM32CubeMx软件 3、IDE: MDK-Keil软…

【STM32】详解RTC实时时钟的概念和配置示例代码

一、什么是RTC RTC(Real-time Clock):实时时钟,本质上是一个支持BCD编码的定时器/计数器。主电源断电后能够由电池供电,使其时钟跳转依然正常。 二、STM32F4芯片内的RTC功能 ①日历时钟(时分秒、年月日、星期) ②两个闹…

android小错误:Failure retrieving text 0x7f050001 in package

1.在启动android应用程序的过程中,logcat打印如下的错误: 报错的原因:资源的id没有找到。资源在R.java文件中,找到0x7f050001 对应的定义 R.java public static final int AppTheme0x7f050001; AppTheme这个文件在AndroidMan…

Windows7系统蓝屏-解决办法, 错误代码:0x0000007F

1.电脑突然蓝屏提示stop:0x0000007F,如下图所示: 2.故障排除 重启电脑,一直按F8,进入“安全模式”,如能正常进入系统,查看系统错误日志。针对系统记录的错误日志,解决问题。如下图,…

java.lang.IllegalArgumentException No view found for id 0x7

java.lang.IllegalArgumentException No view found for id 0x7 布局上找不到这个View,看下ERROR的地方,可以看到是因为Container找不到因此报错了。 从布局入手,参考了很多文章主要分为以下两种原因 1 Fragment 嵌套了 Fragment 例如&…

Fragment报java.lang.IllegalArgumentException:No view found for id 0x7f070250的错误

我用的是Fragment嵌套Fragment做的,放fragment切换快的时候程序就会崩溃,解决这个办法就是在View生成前先将FragemnentManger创建好,就不会报错了

Caused by: android.content.res.Resources$NotFoundException: Resource ID #0x7f解析

先看日志报错这个错误纠结我两天了,真的要崩溃了~_~ 关于android.content.res.Resources$NotFoundException: Resource ID的问题,那行代码是onCreate加载.xml布局,是加载的R.layout.xxxx,不是R.id.xxxx,布局文件存在&a…

关于No view found for id 0x7f080135 (com.xxx.xxx:id/viewpager) for fragment PopupWindow

最近在开发项目中,遇到了一个问题。PopupWindow中无法嵌套viewpagerFragment,现在进行总结一下。 问题描述:在Fragment中弹出一个PopupWindow,PopupWindow中用viewpager加载多个Fragment时出现上面问题。 网上搜的都是那些什么没有设置id之…

流水灯设计

流水灯设计 目的与要求 通过采用单片机控制8个LED发光二极管顺序点亮的流水灯系统设计与制作,让读者了解C语言的数据类型、常量与变量、运算符和表达式等基本概念及使用方法。 设计要求:首先点亮连接到P1.7引脚的发光二极管,延时一定时间后…

IT管理人才必备的十大能力

公众号回复:干货,领取价值58元/套IT管理体系文档 公众号回复:ITIL教材,领取最新ITIL4中文教材 正文 作为IT技术人员,相信没有一个人愿意永远在底层编写程序或做简单的系统维护。经过一段时间的技术和经验的积累&#x…

他,连续 3 年担任新星计划导师,这次的内容有点特别

一、新星计划 新星计划是一个发掘潜力新人、培养优质博主为目标的创作活动,通过为期两周的时间,明白为什么要写博客,写作的意义是什么?制定学习计划,完善Java知识体系。 二、学习计划 创作打卡阶段第1周&#xff08…

Python 彻底甩掉 Java,位居 48 种编程语言之首!

Python 彻底甩掉 Java,位居 48 种编程语言之首! 昨日,IEEE Spectrum 杂志发布了一年一度的编程语言排行榜,这个排行榜已经连续发布了五年。对于每位开发者而言,想要衡量编程语言流行度则需要依赖相对流行的网站统计数据…

java并发问题概述

转自 https://www.jb51.net/article/131411.htm java并发问题概述 转载 更新时间:2017年12月25日 09:28:54 作者:人圭先生 我要评论 这篇文章主要介绍了java并发问题概述,具有一定借鉴价值,需要的朋友可以参考下。 1什么是…

【Java基础系列教程】第一章 编程入门

一、计算机概述 1.1 计算机简介 计算机(computer)俗称电脑,是现代一种用于高速计算的电子计算机器,可以进行数值计算,又可以进行逻辑计算,还具有存储记忆功能。是能够按照程序运行,自动、高速处…

关于程序员这14条经典定律,我全中~

定律1:最难定位的问题要么是最疑难的问题,要么是最低级的问题,这两种问题都有一个共同特征,就是让你意想不到。 举一个例子,一次代码编译不过,报函数没有定义,开始怀疑是类没有“;”结束符,然后怀疑有没有匹配的“{”,折腾了好久,最后才发现是开头的“#ifndef”定义…

系统性能优化的十大策略(强烈推荐,建议收藏)

点击关注公众号,实用技术文章及时了解 上篇 提升系统性能,榨干计算机资源是程序员的极致追求,今天跟大家聊聊性能优化。分为上中下三篇,由浅及深的写了关于性能优化的方方面面,并不仅仅局限于代码层面,希望…

JAVA工程师的十大借口,你知道哪些?

他们是近几十年来出现的新物种。他们的着装可能经常会遭到别人的吐槽,他们的玩笑可能别人也经常get不到笑点,他们心照不宣的执着让外人觉得莫名其妙。但同时,他们也拥有无与伦比的耐力,超越时代的智商,和横穿社会的自虐…

二八定律全面分析

二八定律 也叫 巴莱多定律 ,是19世纪末20世纪初 意大利 经济学家巴莱多发明的。他认为,在任何一组东西中,最重要的只占其中一小部分,约20%,其余80%的尽管是多数,却是次要的,因此又称二八法则。 …

【网络技术】什么是CNI

序言 你只管努力,其他交给时间,时间会证明一切。 Never look back unless you are planning to go that way. 文章标记颜色说明: 黄色:重要标题红色:用来标记结论绿色:用来标记一级论点蓝色:用…

java程序员找工作前需要准备的杀手锏有哪些?

高考前,我们要练兵考试和集训。”临阵磨枪不快也光 ”,找工作前,我们也必须要花很多精力去完成一些必要的准备。 “不打无准备之仗”, 精心准备和训练会对你有相当正面的作用。 有人认为“找工作要靠能力”。这话没错,我要说的是,“临阵磨枪准备的内容也是能力的一部分”…