STM32 RTC实现日历读取以及设置输出时间

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

一、所用工具

1、芯片: STM32F103C8T6系统最小板
2、STM32CubeMx软件
3、IDE: MDK-Keil软件
4、STM32F1xx/STM32F4xxHAL库
5、烧录软件:FlyMcu
6、串口接收软件:FireTools野火多功能调试助手

二、了解RTC

RTC (Real Time Clock):实时时钟

RTC是个独立的定时器。RTC模块拥有一个连续计数的计数器,在相应的软件配置下,可以提供时钟日历的功能。修改计数器的值可以重新设置当前时间和日期 RTC还包含用于管理低功耗模式的自动唤醒单元。
Alt
在断电情况下 RTC仍可以独立运行 只要芯片的备用电源一直供电,RTC上的时间会一直走。

RTC实质是一个掉电后还继续运行的定时器,从定时器的角度来看,相对于通用定时器TIM外设,它的功能十分简单,只有计时功能(也可以触发中断)。但其高级指出也就在于掉电之后还可以正常运行。

两个 32 位寄存器包含二进码十进数格式 (BCD) 的秒、分钟、小时( 12 或 24 小时制)、星期几、日期、月份和年份。此外,还可提供二进制格式的亚秒值。系统可以自动将月份的天数补偿为 28、29(闰年)、30 和 31 天。

上电复位后,所有RTC寄存器都会受到保护,以防止可能的非正常写访问。

无论器件状态如何(运行模式、低功耗模式或处于复位状态),只要电源电压保持在工作范围内,RTC使不会停止工作。

RCT特征:
● 可编程的预分频系数:分频系数高为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原理框图:
Alt
RTC时钟的框图还是比较简单的,这里我们把他分成 两个部分:

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

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

RTC 核心接口:由一组可编程计数器组成,分成 两个主要模块
Alt
第一个模块是 RTC 的 预分频模块,它可编程产生 1 秒的 RTC 时间基准 TR_CLK。RTC 的预分频模块包含了一个 20 位的可编程分频器(RTC 预分频器)。如果在 RTC_CR 寄存器中设置了相应的允许位,则在每个 TR_CLK 周期中 RTC 产生一个中断(秒中断)。
Alt
第二个模块是一个 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秒钟中断一次。我们通过往秒中断里写更新时间的函数来达到时间同步的效果

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

三、STM32CubeMX创建新项目

1、配置RCC(设置高速外部时钟,使能外部晶振LSE)
Alt
2、配置RTC(激活时钟源(Activate Clock Source)和日历(Activate Calendar))
Alt
RTC_OUT: Not RTC_OUT
Tamper: ×
第一个是是否使能 tamper(PC13)引脚上输出校正的秒脉冲时钟,

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

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

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

3、下面是两个RTC的中断:

RTC全局中断RTC_IRQHandler()
闹钟中断函数RTCAlarm_IRQHandler()
Alt
设置任意时间,这里把时间为创建时间2022/11/2 19:41

4、使能串口
Alt
5、时钟树配置
Alt
6、创建项目

四、keil软件编写代码

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

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

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

RTC_DateTypeDef GetData;  //获取日期结构体

RTC_TimeTypeDef GetTime;   //获取时间结构体

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

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

4、在while 循环中 添加输出星期几

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

五、实验效果及总结

Alt
添加输出星期几:
Alt
总结:总的来说,这次实验学到了RTC时钟相关知识,如何使用RTC以及如何配置。采用RTC读取输出日历,非常好用。

参考资料:
https://blog.csdn.net/qq_45659777/article/details/121621521
https://www.cnblogs.com/dreamrj/p/14046598.html

STM32自学笔记-11-RTC3-掉电后日期清零的解决 F103单片机掉电后日期清零问题 阅读详情

相关推荐

STM32RTC实时时钟

STM32RTC实时时钟

weixin_52483742的博客 5956

STM32CubeMX RTC配置STM32 RTC时钟掉电日期不更新

STM32 RTC实时时钟是一个独立的定时器。 RTC模块拥有一组连续计数的计数器,在相应软件配置下,可提供时钟日历的功能。修改计数器的值可以重新设置系统当前的时间和日期。 STM32CubeMX RTC配置 STM32 RTC时钟掉电日期不更新 STM32CubeMX 串口配置 STM32CubeMX CAN配置 STM32CubeMX SPI配置 STM32CubeMX 定时器配置 STM32CubeMX 时钟配置 STM32CubeMX 输出工程配置 STM32CubeMX FreeRTOS工程配置 STM32CubeMX开发 FreeRTOS移植开发 STM32参考

STM32RTC时钟

前言 了解实时时钟RTC的原理。STM32芯片自带RTC,因此不须像其他MCU需外接RTC模块。请编程实现STM32日历读取设置输出。要求: 1)读取RTC初始时间,验证是否为 1970年1月1日零分零秒; 2)将RTC时间调整为当前时间,并以 2021年x月x日x分x秒的格式从串口输出(或输出到OLED屏),每1s改变一次; 3)如果输出内容中需加入“星期x”,请修改代码。 一.RTC时钟介绍 RTC (Real Time Clock):实时时钟 RTC是个独立的定时器。..

IT23131的博客 5583

STM32日历读取设置输出

一、了解时钟RTC RTC (Real Time Clock):实时时钟 RTC是个独立的定时器。RTC模块拥有一个连续计数的计数器,在相应的软件配置下,可以提供时钟日历的功能。修改计数器的值可以重新设置当前时间和日期 RTC还包含用于管理低功耗模式的自动唤醒单元。 在断电情况下 RTC仍可以独立运行 只要芯片的备用电源一直供电,RTC上的时间会一直走。 RTC实质是一个掉电后还继续运行的定时器,从定时器的角度来看,相对于通用定时器TIM外设,它的功能十分简单,只有计时功能(也可以触发中断)。但其高

qq_45874317的博客 6020

STM32学习】实时时钟 —— RTC

stm32RTC详解

一年之内毫无半点成绩,想起来做人真是没趣。 2万+

STM32F103学习笔记(六) RTC实时时钟(原理篇)

实时时钟(RTC)是嵌入式系统中的一种重要组件,在嵌入式系统中,RTC的应用非常广泛。它被用于记录事件的时间戳、执行定时任务、调度系统操作等等。比如,您可能在计时器中使用RTC来定时执行某个任务,或者在数据记录应用中使用它来标记数据的时间戳。

全社区最菜的博客 6087

通过RTC实现STM32日历读取设置输出

STM32芯片自带RTC,因此不须像其他MCU需外接RTC模块。通过此次实验,我了解了实时时钟RTC的原理。并且知道了如何去实现STM32日历读取设置输出

Stephen的博客 813

STM32F103基于HAL库实现日历读取设置输出---RTC时钟

文章目录一、二、使用CubeMX配置RTC三、总结参考 一、 二、使用CubeMX配置RTC 设置RCC 配置RTC 初始化时间和日期 USART1配置 时钟源设置 配置项目 三、 总结 参考

m0_59416558的博客 4474

实现STM32日历读取设置输出

配置RTC(激活时钟源(Activate Clock Source)和日历(Activate Calendar))这里时钟配置可以更改为23年,但是本人考虑先照做一遍,以防出错,所以还是为21年 O.o嘻嘻。当 TAMPER引脚上的信号从 0变成1或者从 1变成 0(取决于备份控制寄存器BKP_CR的 TPAL位),会产生一个侵入检测事件。2)将RTC时间调整为当前时间,并以 2021年x月x日x分x秒的格式从串口输出(或输出到OLED屏),每1s改变一次;RTC校验功能,使能侵入检测功能。

qq_68130187的博客 908

第8周-定时器与日历时钟

1

w_pig的博客 130

定时器与日历时钟

定时器与日历时钟

m0_53525274的博客 241

STM32 RTC日历功能工程实现与可靠性设计

实时时钟(RTC)是嵌入式系统中提供高精度、低功耗、断电保持时间基准的核心外设。其工作原理依赖于独立时钟源(如32.768kHz LSE)、备份域供电及硬件日历逻辑,技术价值在于支撑工业控制、智能仪表等对时间连续性严苛的场景。关键实现环节包括时间/日期的原子化设置、基于备份寄存器的首次校准状态持久化,以及抗撕裂读取与安全格式化输出。本文聚焦STM32平台,深入解析HAL库下RTC_TimeTypeDef与RTC_DateTypeDef结构体的硬件映射关系、BCD/BIN格式差异、WeekDay校验机制及Da

weixin_42584507的博客 314

数字温度计

后备区域:RTC模块和时钟配置系统(RCC_BDCR寄存器)位于后备区域,即在系统复位或从待机模式唤醒后,RTC设置时间保持不变。时钟来源:RTC的时钟来源有三种,分别是高速外部时钟(HSE)、低速外部时钟(LSE)和低速内部时钟(LSI)。RTC_Alarm:RTC还提供了闹钟功能,可以设置一个闹钟时间RTC_Alarm),当计数器的值与闹钟时间相等时,会触发中断,执行相应的操作。时钟来源:RTC的时钟来源有三种,分别是高速外部时钟(HSE)、低速外部时钟(LSE)和低速内部时钟(LSI)。

QingQiuZuiMeng的博客 171

STM32】基于实时时钟RTC实现STM32F103的日历读取设置输出

目录一、RTC简介1. RTC实时时钟特征与原理2. RTC组成二、基于STM32CubeMX建立工程三、代码编写四、总结五、参考 一、RTC简介 1. RTC实时时钟特征与原理 RTC (Real Time Clock):实时时钟   实时时钟是一个独立的定时器。RTC模块拥有一组连续计数的计数器,在相应软件配置下,可提供时钟日历的功能。修改计数器的值可以重新设置系统当前的时间和日期。   RTC模块和时钟配置系统(RCC_BDCR寄存器)处于后备区域,即在系统复位或从待机模式唤醒后, RTC设置时间

YangMax1的博客 5261

STM32F103C8T6基于HAL库制作RTC时钟

目录一、RTC时钟原理二、新建工程三、修改代码四、烧录运行参考文献 了解实时时钟RTC的原理。STM32芯片自带RTC,因此不须像其他MCU需外接RTC模块。请编程实现STM32日历读取设置输出。要求: 1)读取RTC初始时间,验证是否为 1970年1月1日零分零秒; 2)将RTC时间调整为当前时间,并以 2021年x月x日x分x秒的格式从串口输出(或输出到OLED屏),每1s改变一次; 3)如果输出内容中需加入“星期x”,请修改代码。 一、RTC时钟原理 1.简介 RTC (Real Time

Uaena.&的博客 7372
上一篇: STM32F103使用定时器控制led周期闪烁及串口发送信息
下一篇: STM32F103输出PWM波形实现两个LED的呼吸灯效果
chenyu128
博客等级 码龄4年 43粉丝 45原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值