RTC时钟实现实时日历

article/2025/8/6 23:33:16

文章目录

    • 1、RTC时钟简介
        • 1.2、初识RTC
        • 1.2、相关寄存器
    • 2、创建项目2
    • 3、完善代码
    • 4、总结


1、RTC时钟简介

1.2、初识RTC

    1、简介:
RTC—real time clock,实时时钟,主要包含日历、闹钟和自动唤醒这三部分的功能,其中的日历功能我们使用的最多。日历包含两个32bit的时间寄存器,可直接输出时分秒,星期、月、日、年。比起F103系列的RTC只能输出秒中断,剩下的其他时间需要软件来实现,429的RTC可谓是脱胎换骨,让我们在软件编程时大大降低了难度。RTC功能框图分析

    2、功能框图
在这里插入图片描述
    3、组成:
    APB1接口:用来和APB1总线相连。通过APB1接口可以访问RTC的相关寄存器(预分频值,计数器值,闹钟值)。
    RTC核心:由一组可编程计数器组成,它又分两个主要模块:
        RTC预分频模块,它可以编程产生最长1秒的RTC时间基TR_CLK。如果设置了秒中断允许位,可以产生秒中断;
        32位的可编程计数器,可被初始化为当前时间。系统时间按TR_CLK周期累加并与存储在RTC_ALR寄存器中的可编程时间相比,当匹配时候如果设置了闹钟中断允许位,可以产生闹钟中断;如果溢出,可以产生溢出中断。

    4、主要特征:
(1)可编程的预分频系数:分频系数最高为220;
(2)32位的可编程计数器,可用于较长时间段的测量;
(3)2个分离的时钟:用于APB1接口的PCLK1和RTC时钟(RTC时钟的频率必须小于PCLK1时钟频率的四分之一以上);

1.2、相关寄存器

    1、读RTC寄存器:
RTC内核完全独立于APB1接口,软件通过APB1接口对RTC相关寄存器访问。但是相关寄存器只在RTC APB1时钟进行重新同步的RTC时钟的上升沿被更新。所以软件必须先等待寄存器同步标志位(RTC_CRL的RSF位)被硬件置1才读。
这意味着,如果APB1接口曾经被关闭,而读操作又是在刚刚重新开启APB1之后,则在第一次的内部寄存器更新之前,从APB1上读出的RTC寄存器数值可能被破坏了(通常读到0)。简单地讲,在APB1接口被禁止(复位、无时钟或断电)的情况下,RTC核仍保持运行状态。接着,重新打开APB1接口,此时必须等待RTC_CRL寄存器中的RSF位(寄存器同步标志)被硬件置1,同步之后,读RTC寄存器的值才不会有误。
因此,若在读取RTC寄存器时,RTC的APB1接口曾经处于禁止状态,则软件首先必须等待RTC_CRL寄存器的RSF位被硬件置1。

    2、写RTC寄存器:
必须设置RTC_CRL寄存器中的CNF位,使RTC进入配置模式后,才能写入RTC_PRL、RTC_CNT、RTC_ALR寄存器。
另外,对RTC任何寄存器的写操作,都必须在前一次写操作结束后进行。可以通过查询RTC_CR寄存器中的RTOFF状态位,判断RTC寄存器是否处于更新中。仅当RTOFF状态位是1时,才可以写入RTC寄存器。

    3、RTC预分频装载寄存器(RTC_PRLH、RTC_PRLL):
在这里插入图片描述
作用:配置RTC预分频装载值,这个值是20bit长度。
    4、RTC预分频器余数寄存器(RTC_DIVH、RTC_DIVL):
在这里插入图片描述
作用:获得预分频计数器的当前值,也就是从RTC预分频装载寄存器倒数到0之间的一个值(以RTCCLK为时钟)。

    5、RTC计数器寄存器(RTC_CNTH、RTC_CNTL):
在这里插入图片描述
作用:存放计数器内的计数值(以TR_CLK为时钟)。

    6、RTC闹钟寄存器(RTC_ALRH、RTC_ALRL)
在这里插入图片描述

作用:当RTC计数器寄存器的值与RTC闹钟寄存器的值相等的时候,触发一个闹钟事件,产生一个闹钟中断。

2、创建项目2

    1选择STM32F103
C8开发板,创建项目进行配置。
    2、配置RCC:设置高速外部时钟HSE 并使能外部晶振LSE
在这里插入图片描述

    2、配置RTC时钟:Activate Clock Source 激活时钟源、Activate calendar激活日历
在这里插入图片描述

这两个都要选择,作用也很明显,先是使能时钟源,再使能RTC日历
RTC_OUT: Not RTC_OUT
Tamper: ×
第一个是是否使能 tamper(PC13)引脚上输出校正的秒脉冲时钟,
第二个: RTC入侵检测校验功能

    3、配置两个RTC的中断:
RTC全局中断RTC_IRQHandler()
闹钟中断函数RTCAlarm_IRQHandler()
在这里插入图片描述
    设置初始时间为2021-12-03,13:00:00

    4、时钟设置为最大72Hz
在这里插入图片描述

    4、使能串口一
在这里插入图片描述

    5、生成项目文件
在这里插入图片描述

3、完善代码

在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;
}

    1、在main.c的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);

    2、运行结果
在这里插入图片描述

    3、添加星期几的输出在输出年月日的代码printf("%02d/%02d/%02d\r\n",2000 + GetData.Year, GetData.Month, GetData.Date);后面添加代码

/* 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");}

    4、添加之后的运行结果
在这里插入图片描述

4、总结

    初次了解RTC,使用它能够实现实时试件的实现,能够帮助我们获得正确的环境时间,这对于我们后面的应用帮助是非常大的,我们的数据采集、定时等等操作都需要用到实时时钟。

参考:
https://blog.csdn.net/qq_38410730/article/details/80050619
https://blog.csdn.net/as480133937/article/details/105741893


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

相关文章

STM32之RTC时钟

前言 了解实时时钟RTC的原理。STM32芯片自带RTC,因此不须像其他MCU需外接RTC模块。请编程实现STM32的日历读取、设置和输出。要求: 1)读取RTC初始时间,验证是否为 1970年1月1日零分零秒; 2)将RTC时间调整为…

【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. 文章标记颜色说明: 黄色:重要标题红色:用来标记结论绿色:用来标记一级论点蓝色:用…