ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

STM32G4之RTC实时时钟

2022-01-28 13:06:34  阅读:214  来源: 互联网

标签:分频 RTC 掉电 闹钟 寄存器 STM32G4 时钟


文章目录


前言


# 一、RTC介绍

STM32 的 RTC 外设(Real Time Clock)实质是一个掉电后还继续运行的定时器。STM32G4 的 RTC,是一个独立的 BCD 定时器/计数器。 RTC 提供一个日历时钟(包含年月日时分秒信息)、两个可编程闹钟(ALARM A 和 ALARM B)中断,以及一个具有中断功能的周期性可编程唤醒标志。 RTC 还包含用于管理低功耗模 式的自动唤醒单元

从定时器的角度来说,相对于通用定时器 TIM 外设,它十分简单,只有很纯粹的计时和触发中断的功能;但从掉电还继续运行的角度来说,它却是 STM32 中唯一一个具有如此强大功能的外设。所以 RTC 外设的复杂之处并不在于它的定时功能,而在于它掉电还继续运行的特性

以上所说的掉电,是指主电源 VDD 断开的情况,为了 RTC 外设掉电继续运行,必须接上锂电池给 STM32 的 RTC、备份发卡通过 VBAT 引脚供电

当主电源 VDD 有效时,由VDD给 RTC 外设供电; 而当 VDD掉电后,由 VBAT给 RTC 外设供电。但无论由什么电源供电,== RTC 中的数据都保存在属于 RTC 的备份域中,若主电源 VDD和 VBAT都掉电,那么备份域中保存的所有数据将丢失==。

备份域除了 RTC 模块的寄存器,还有 42 个 16 位的寄存器可以在 VDD 掉电的情况下保存用户程序的数据,系统复位或电源复位时,这些数据也不会被复位

在这里插入图片描述

从 RTC 的定时器特性来说,它是一个 32 位的计数器,只能向上计数。它使用的时钟源有三种,分别为高速外部时钟的, 低速内部时钟 LSI 以及低速外部时钟 LSE

这里使用的高速外部时钟HSE32分频得到750khz,在主电源 VDD有效的情况下(待机), RTC 还可以配置闹钟事件使 STM32 退出待机模式

由于 RTC_CNT 是 32 位寄存器,可存储的最大值为(232-1),即这样计时的话,在 232秒后溢出,即它将在今后的 136 年时溢出:
N = 232/365/24/60/60 ≈136 年

在这里插入图片描述

时钟分频来自HSE32分频得到750khz,然后经过7位异步分频(125)和15位同步分频(6000),得到ck_spre(一般要使这个值为1hz), ck_spre 即可用于更新日历时间等信息

日历时间(RTC_TR)和日期(RTC_DR)寄存器两个 32 位寄存器包含二进码/B十进数格式 (BCD) 的秒、分钟、小时(12 或24 小时制)、星期、日期、月份和年份。此外,还可提供二进制格式的亚秒值

可以读取 RTC_TR 和 RTC_DR 来得到当前时间和日期信息,不过需要注意的是:时间和日期都是以 BCD 码的格式存储的,读出来要转换一下,才可以得到十进制的数据,在读的时侯,以二进制格式读出来的数据可以直接使用。

STM32G4 提供两个可编程闹钟:闹钟 A(ALARM_A)和闹钟 B(ALARM_B)。通过 RTC_CR寄存器的 ALRAE 和 ALRBE 位置 1 来使能可编程闹钟功能。当日历的亚秒、秒、分、小时、日期分别与闹钟寄存器 RTC_ALRMASSR/RTC_ALRMAR 和 RTC_ALRMBSSR/RTC_ALRMBR中的值匹配时,则可以产生闹钟(需要适当配置)

小结:
RTC配置一般步骤:

① 使能PWR和BKP时钟
② 使能后备寄存器访问
③ 配置RTC时钟源,使能RTC时钟:
如果使用LSE,要打开LSE:RCC_LSEConfig(RCC_LSE_ON);
④ 设置RTC预分频系数
⑤ 设置时间
⑥开启相关中断(如果需要)
⑦编写中断服务函数
⑧部分操作要等待写操作完成和同步。

二、STM32CubeMX配置

(1)RTC使能时钟源和日历
在这里插入图片描述
(2)配置时钟来源,选择外部时钟HSE,经32分频,得到750Khz


(3)设置分频和时间
在这里插入图片描述

注意,一定要选择好两次分频的系数,使经过两次分频后的时钟频率为1hz

750 000 / 125 / 6000 = 1

三、部分源码

RTC_TimeTypeDef  H_S_M_Time; // 时间结构体
RTC_DateTypeDef  Y_M_D_Data; // 日期结构体

// 获取日期和时间必须同时使用,注意这里的编码方式选择二进制,可以直接使用
	// 若选择BCD编码,需要自己处理数据
	HAL_RTC_GetTime(&hrtc, &H_S_M_Time,RTC_FORMAT_BIN);
	HAL_RTC_GetDate(&hrtc, &Y_M_D_Data,RTC_FORMAT_BIN);
	sprintf((char *)Lcd_Display_String,"TIME:%2d-%2d-%2d",H_S_M_Time.Hours,H_S_M_Time.Minutes,H_S_M_Time.Seconds);
	LCD_DisplayStringLine(Line0, Lcd_Display_String);

总结

提示:这里对文章进行总结:

标签:分频,RTC,掉电,闹钟,寄存器,STM32G4,时钟
来源: https://blog.csdn.net/qq_53144843/article/details/122727539

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有