STM32CubeMX--RTC时钟
STM32CubeMX–RTC时钟
文章目录
- STM32CubeMX--RTC时钟
- 1. 什么是RTC
- 1.1 RCT特征:
- 1.2 RTC原理框图
- 1.3 **RTC具体流程:**
- 1.4 RTC时钟选择
- 1.5 RTC复位过程
- 1.6 RTC中断
- 2. CubeMX配置RTC
- 2.1 配置RCC
- 2.2 配置SYS
- 2.3 **配置RTC**
- 2.4 配置串口
- 2.5 时钟源设置
- 2.6 项目生成
- 3. Keil代码编写
- 3.1 **printf函数设置**
- 3.2 RTC_HAL库函数
- 3.3 定义两个结构体来获取日期和时间:
- 3.4 在while循环中添加:
- 3.5 添加输出星期几
- 4. 总结
- 5. 参考文章
软件版本:
STM32CubeMX:6.6.0
KEIl:5.37.0.0
FlyMcu:0.188
硬件:
STM32F103c8t6
1. 什么是RTC
RTC (Real Time Clock):实时时钟
RTC是个独立的定时器。
RTC模块拥有一个连续计数的计数器,在相应的软件配置下,可以提供时钟日历的功能。修改计数器的值可以重新设置当前时间和日期 RTC还包含用于管理低功耗模式的自动唤醒单元。
在断电情况下 RTC仍可以独立运行 只要芯片的备用电源一直供电,RTC上的时间会一直走。
RTC实质是一个掉电后还继续运行的定时器,从定时器的角度来看,相对于通用定时器TIM外设,它的功能十分简单,只有计时功能(也可以触发中断)。但其高级之处也就在于掉电之后还可以正常运行。
两个 32 位寄存器包含二进码十进数格式 (BCD) 的秒、分钟、小时( 12 或 24 小时制)、星期几、日期、月份和年份。此外,还可提供二进制格式的亚秒值。系统可以自动将月份的天数补偿为 28、29(闰年)、30 和 31 天。
上电复位后,所有RTC寄存器都会受到保护,以防止可能的非正常写访问。
无论器件状态如何(运行模式、低功耗模式或处于复位状态),只要电源电压保持在工作范围内,RTC使不会停止工作。
1.1 RCT特征:
可编程的预分频系数:分频系数高为220。
32位的可编程计数器,可用于较长时间段的测量。
2个分离的时钟:用于APB1接口的PCLK1和RTC时钟(RTC时钟的频率必须小于PCLK1时钟 频率的四分之一以上)。
可以选择以下三种RTC的时钟源:
- HSE时钟除以128;
- LSE振荡器时钟;
- LSI振荡器时钟
2个独立的复位类型:
- APB1接口由系统复位;
- RTC核心(预分频器、闹钟、计数器和分频器)只能由后备域复位
3个专门的可屏蔽中断:
- 闹钟中断,用来产生一个软件可编程的闹钟中断。
- 秒中断,用来产生一个可编程的周期性中断信号(长可达1秒)。
- 溢出中断,指示内部可编程计数器溢出并回转为0的状态.
RTC时钟源:
三种不同的时钟源可被用来驱动系统时钟(SYSCLK):
● HSI振荡器时钟
● HSE振荡器时钟
● PLL时钟
这些设备有以下2种二级时钟源:
● 40kHz低速内部RC,可以用于驱动独立看门狗和通过程序选择驱动RTC。 RTC用于从停机/待机模式下自动唤醒系统。
● 32.768kHz低速外部晶体也可用来通过程序选择驱动RTC(RTCCLK)。
1.2 RTC原理框图
RTC时钟的框图还是比较简单的,这里我们把他分成 两个部分
:
APB1 接口:用来和 APB1 总线相连。 此单元还包含一组 16 位寄存器,可通过 APB1 总线对其进行读写操作。APB1 接口由 APB1 总 线时钟驱动,用来与 APB1 总线连接。
通过APB1接口可以访问RTC的相关寄存器(预分频值,计数器值,闹钟值)。
RTC 核心接口:由一组可编程计数器组成,分成 两个主要模块
。
第一个模块是 RTC 的 预分频模块,它可编程产生 1 秒的 RTC 时间基准 TR_CLK。RTC 的预分频模块包含了一个 20 位的可编程分频器(RTC 预分频器)。如果在 RTC_CR 寄存器中设置了相应的允许位,则在每个 TR_CLK 周期中 RTC 产生一个中断(秒中断)。
第二个模块是一个 32 位的可编程计数器 (RTC_CNT),可被初始化为当前的系统时间,一个 32 位的时钟计数器,按秒钟计算,可以记 录 4294967296 秒,约合 136 年左右,作为一般应用,这已经是足够了的。
1.3 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 控制开关机
1.4 RTC时钟选择
使用HSE分频时钟或者LSI的时候,在主电源VDD掉电的情况下,这两个时钟来源都会受到影响,因此没法保证RTC正常工作.所以RTC一般都时钟低速外部时钟LSE,频率为实时时钟模块中常用的32.768KHz,因为32768 = 2^15,分频容易实现,所以被广泛应用到RTC模块.(在主电源VDD有效的情况下(待机),RTC还可以配置闹钟事件使STM32退出待机模式).
1.5 RTC复位过程
除了RTC_PRL、RTC_ALR、RTC_CNT和RTC_DIV寄存器外,所有的系统寄存器都由系统复位或电源复位进行异步复位。
RTC_PRL、RTC_ALR、RTC_CNT和RTC_DIV寄存器仅能通过备份域复位信号复位。
系统复位后,禁止访问后备寄存器和RCT,防止对后卫区域(BKP)的意外写操作
1.6 RTC中断
秒中断:
这里时钟自带一个秒中断,每当计数加一的时候就会触发一次秒中断。注意,这里所说的秒中断并非一定是一秒的时间,它是由RTC时钟源和分频值决定的“秒”的时间,当然也是可以做到1秒钟中断一次。我们通过往秒中断里写更新时间的函数来达到时间同步的效果
闹钟中断:
闹钟中断就是设置一个预设定的值,计数每自加多少次触发一次闹钟中断
2. CubeMX配置RTC
2.1 配置RCC
- 设置高速外部时钟HSE 选择外部时钟源
- 使能外部晶振LSE
RTC设备因为其独特的运行方式(即掉电依旧运行)使用HSE分频时钟或者LSI的时候,在主电源VDD掉电的情况下,这两个时钟来源都会受到影响,资源消耗太大,小小的纽扣电池根本吃不消。没法保证RTC正常工作.所以RTC一般都时钟低速外部时钟LSE
2.2 配置SYS
2.3 配置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位),会产生一个侵入检测事件。侵入检测事件将所有数据备份寄存器内容清除。
第一个是使能tamper(PC13)引脚作为时钟脉冲输出
第二个是使能tamper(PC13)引脚作为入侵检测功能
下面是RTC的中断:
RTC全局中断RTC_IRQHandler()
此处设置时间为2022/10/29 17:04: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: 年份
2.4 配置串口
2.5 时钟源设置
2.6 项目生成
3. Keil代码编写
3.1 printf函数设置
在main.c
和usart.c
中添加头文件#include "stdio.h"
之后,勾选Target中的use MicroLIB,在mian.c
文件中,添加如下代码,进行重定义
int fputc(int ch, FILE *f){HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);return ch;}
3.2 RTC_HAL库函数
/*设置系统时间*/
HAL_StatusTypeDef HAL_RTC_SetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format)
/*读取系统时间*/
HAL_StatusTypeDef HAL_RTC_GetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format)
/*设置系统日期*/
HAL_StatusTypeDef HAL_RTC_SetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format)
/*读取系统日期*/
HAL_StatusTypeDef HAL_RTC_GetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format)
/*启动报警功能*/
HAL_StatusTypeDef HAL_RTC_SetAlarm(RTC_HandleTypeDef *hrtc, RTC_AlarmTypeDef *sAlarm, uint32_t Format)
/*设置报警中断*/
HAL_StatusTypeDef HAL_RTC_SetAlarm_IT(RTC_HandleTypeDef *hrtc, RTC_AlarmTypeDef *sAlarm, uint32_t Format)
/*报警时间回调函数*/
__weak void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
/*写入后备储存器*/
void HAL_RTCEx_BKUPWrite(RTC_HandleTypeDef *hrtc, uint32_t BackupRegister, uint32_t Data)
/*读取后备储存器*/
uint32_t HAL_RTCEx_BKUPRead(RTC_HandleTypeDef *hrtc, uint32_t BackupRegister
我们可以看到前面的四个函数,分别是
设置系统时间:HAL_RTC_SetTime();
读取系统时间: HAL_RTC_GetTime();
设置系统日期: HAL_RTC_SetDate();
读取系统日期: HAL_RTC_GetDate();
因为系统的时间和日期开始的时候已经设置过了,所以我们这里只用两个读取函数
读取系统时间函数
/*读取系统时间*/
HAL_StatusTypeDef HAL_RTC_GetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format)
功能: 获取RTC时钟的时间
参数:
*hrtc RTC结构体参数 例:&hi2c2
RTC_TimeTypeDef *sTime: 获取RTC时间的结构体,
Format: 获取时间的格式
RTC_FORMAT_BIN 使用16进制
RTC_FORMAT_BCD 使用BCD进制
读取系统日期函数
/*读取系统日期*/
HAL_StatusTypeDef HAL_RTC_GetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format)
功能: 获取RTC时钟的日期
参数:
*hrtc RTC结构体参数 例:&hi2c2
RTC_DateTypeDef *sTime: 获取RTC日期的结构体,
Format: 获取日期的格式
RTC_FORMAT_BIN 使用16进制
RTC_FORMAT_BCD 使用BCD进制
在stm32f1xx_hal_rtc.h头文件中,可以找到RTC_TimeTypeDef,RTC_DateTypeDef这两个结构体的成员变量。
/*** @brief RTC Time structure definition*/typedef struct{uint8_t Hours; /*!< Specifies the RTC Time Hour.This parameter must be a number between Min_Data = 0 and Max_Data = 23 */uint8_t Minutes; /*!< Specifies the RTC Time Minutes.This parameter must be a number between Min_Data = 0 and Max_Data = 59 */uint8_t Seconds; /*!< Specifies the RTC Time Seconds.This parameter must be a number between Min_Data = 0 and Max_Data = 59 */} RTC_TimeTypeDef;
/*** @brief RTC Date structure definition*/typedef struct{uint8_t WeekDay; /*!< Specifies the RTC Date WeekDay (not necessary for HAL_RTC_SetDate).This parameter can be a value of @ref RTC_WeekDay_Definitions */uint8_t Month; /*!< Specifies the RTC Date Month (in BCD format).This parameter can be a value of @ref RTC_Month_Date_Definitions */uint8_t Date; /*!< Specifies the RTC Date.This parameter must be a number between Min_Data = 1 and Max_Data = 31 */uint8_t Year; /*!< Specifies the RTC Date Year.This parameter must be a number between Min_Data = 0 and Max_Data = 99 */} RTC_DateTypeDef;
3.3 定义两个结构体来获取日期和时间:
RTC_DateTypeDef GetData; //获取日期结构体RTC_TimeTypeDef GetTime; //获取时间结构体
3.4 在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);
运行结果
3.5 添加输出星期几
将while中的代码更改
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 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");}/* 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. 总结
通过这次实验,了解了RTC的相关知识,并能在cubeMX里创建项目,在keil中通过调用HAL库函数,获取时间日期,用printf函数输出到串口。
5. 参考文章
(1条消息) STM32F103C8T6使用RTC实现日历读取、设置和输出_死妖阿的博客-CSDN博客_rtc_gettime
(1条消息) STM32日历读取,设置和输出_镜仔吃柠檬的博客-CSDN博客_stm32 日历
STM32CubeMX--RTC时钟相关推荐
- STM32CubeMX | STM32 F1系列HAL库低功耗STOP和STANDBY模式唤醒(RTC时钟唤醒+外部中断唤醒示例)
STM32CubeMX | STM32 F1系列HAL库低功耗STOP和STANDBY模式唤醒(RTC时钟唤醒+外部中断唤醒示例) 目录 STM32CubeMX | STM32 F1系列HAL库低功耗 ...
- Stm32CubeMX配置RTC时钟
环境: Stm32CubeMX V5.6.0 stm32F412RETx芯片,芯片的VBAT引脚接电池 RTC使用的外部晶振,内部的振荡器配置后断电后不跑,原因未知,下面直接上使用外部晶振的方案 配置 ...
- STM32如何计算RTC时钟异步预分频和同步预分频
实时时钟 (RTC) 是一个独立的 BCD 定时器/计数器,提供具有可编程闹钟中断功能的日历时钟/日历,可用于管理所有低功耗模式的自动唤醒单元.在配置RTC时钟时预分频器是关键指标,通过配置预分频器可 ...
- STM32F103C8T6基于HAL库制作RTC时钟
目录 一.RTC时钟原理 二.新建工程 三.修改代码 四.烧录运行 参考文献 了解实时时钟RTC的原理.STM32芯片自带RTC,因此不须像其他MCU需外接RTC模块.请编程实现STM32的日历读取. ...
- 蓝桥杯嵌入式(G4系列):RTC时钟
前言: 关于RTC时钟的HAL库配置我也是第一次,之前都是用库函数的写法,这里写下这篇博客来记录一下自己的学习过程. STM32Cubemx配置: 首先点击左侧的Timers的RTC,勾选以下选项 进 ...
- STM32读取RTC时钟
STM32读取RTC时钟 一.RTC 1. 简介 2. 特征 3. 组成 二.项目创建 三.代码修改 四.总结 参考 一.RTC 1. 简介 RTC-real time clock,实时时钟,主要包含 ...
- STM32 RTC时钟掉电日期不更新 STM32 HAL库RTC时钟配置
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 STM32 RTC时钟掉电日期不更新 & STM32 HAL库RTC时钟配置 一.STM32CubeMX RTC配置 二.RT ...
- STM32 RTC时钟掉电日期不更新
RTC(Real-Time Clock)实时时钟,是一个独立的定时器.拥有一组连续计数的计数器,在相应软件配置下,可提供时钟日历的功能.修改计数器的值可以重新设置系统当前的时间和日期. RTC 模块和 ...
- 第十三届蓝桥杯嵌入式备赛-STM32G431-进阶模块调试⑦RTC时钟
目录 0.前言 1.功能要求 2.STM32Cubemx初始化 3.程序实现 main.c相关初始化 RTC函数 RTC_CalendarGet()日期时间获取函数 设置日期RTC_SetDate和时 ...
- 纠结的STM32 RTC时钟源LSE
一开始,所有实验都是在神舟板上去完成,根本就没有发现RTC的问题.直到我们自己画板来后调试时,才发现STM32 RTC的外部时钟源存在问题. 这也算是STM32的一个鸡肋,对于LSE外部晶振太过于苛刻 ...
最新文章
- java面向对象电子科大版答案_电子科大17秋《面向对象程序设计》在线作业1
- (转)PJSIP入门:编译,运用PJSIP,PJMEDIA
- pythin怎么根据月份获取月初和月末_信息流是什么?到底应该怎么去做?
- java/php/c#版rsa签名以及java验签实现--转
- 本机向windows服务器传输文件的三种方法
- java中的Calendar
- ANT-build.xml文件详解
- Windows设置HTML,windows怎么添加静态路由
- vim编辑和命令模式、实践
- 支付宝国庆消费报告出炉:景区消费涨9倍
- ERmaster 数据库设计 ,显示中文逻辑名
- UVA12602 Nice Licence Plates【进制】
- c++常引用做参数可以有默认参数吗_最新Pandas.read_excel()全参数详解(案例实操,如何利用python导入excel)...
- 移动 web 1px 边框解决方案
- Matlab 2016a 安装包及破解教程
- 汉字录入到计算机的过程,如何快速把书中文字录入到电脑中
- 360修复高危漏洞可以修复吗_360提示的高危漏洞要不要修复怎样关闭 - 卡饭网
- email 邮件发送源代码(c++实现)
- 【Vue知识点- No5.】生命周期、axios、购物车案例
- EXCEL 自动求和
热门文章
- java 调用mysql视图_java 访问数据库视图 | 学步园
- java camel exchange类_Exchange服务器之camel 基本概念
- 关于eNSP的交换机配置(新手入门款)
- Smaller, faster, cheaper, lighter: Introducing DistilBERT, a distilled version of BERT 翻译
- 【WIN 03】下载安装Cherrytree
- linux使用佳能ip1188,佳能iP1188打印机好吗 佳能ip1188打印机如何安装【介绍】
- 自定义指令与自定义指令的回调函数inserted和componentUpdated
- 2022.10.14 SAP PP 模块学习记录
- 钢笔现代签名设计【图片】
- 树莓水果创意广告文案,朋友圈晒水果走心文案树莓