RTC讲解

news2025/2/25 23:18:20

RTC(Real Time Clock)实时时钟

RTC实时时钟本质上是一个独立的定时器。RTC模块拥有一组连续计数的32位无符号计数器,在相应软件配置下,可提供时钟日历的功能。修改计数器的值可以重新设置系统当前的时间和日期。

RTC模块和时钟配置系统(RCC_BDCR寄存器)处于后备区域,即在系统复位或从待机模式唤醒 后,RTC的设置和时间维持不变,需要注意前提得有备用电源VBAT供电保持走时,即VDD(2.0~3.6V)断电后可借助VBAT(1.8~3.6V)供电继续走时。

参考手册给出的结构框图如下:

简单介绍流程,就是一个定时器根据时钟确定每秒钟增加多少秒,往往我们是用于看时间,也就是说对于实际分频过后的时钟要有为:1HZ,才能使得定时器每秒钟加1。我们可以通过time.h对时间戳/计数值处理来得到当前的日期时间。

1.时钟来源:我们实际选择时钟源,可选择三种RTC时钟源HSE时钟除以128(通常为8MHz/128)    , LSE振荡器时钟(通常为32.768KHz)    , LSI振荡器时钟(40KHz)三种

对照手册:

我们也可以通过时钟树看出:

2.RTC实际配置步骤:

1.开启RTC访问权

对于stm32来说,实际正常运行不会启动RTC,因为RTC主要由备份电源VBAT供电使用,所以我们使用时候需要开启访问,而BKP和RTC在stm32当中是统一的,开启RTC就相当于开启BKP同样开启BKP也相当于开启RTC。

2.设置寄存器PWR_CR的DBP位,使能对后备寄存器和RTC的访问,需要我们手动开启PWR的DBP位,这样才能对RTC写入操作。

3.选择时钟源:对于RTC来说,我们实际上LSE是专门用于RTC的时钟信号,对应外部晶振32.768KHZ。其他主要是作为当第一种无法使用的备份选择。本质上它主要是由备份电源VBAT供电。

4.等待时钟同步,以及写入完成

注意:每一次写入操作都需要我们对等待写入完成,调用库等待函数,或者等待相应标志位RTOFF置0。

5.配置计数器CNT(如果需要余数寄存器也可以在此配置,不过写入后需要等待写入完成)

主要是写入当前时间戳,不知道可以参考之前时间戳讲解。

6.等待写入完成。

实际也可以使用寄存器,不过我使用的是库函数,寄存器可以参考手册如下:

实例代码:

我使用了两种,一种数组,一种时间戳,具体可以根据需要采用

方案一:时间戳:

MYRTC.h

#ifndef __MYRTC_H__
#define __MYRTC_H__
extern struct tm tm_RTC;

void MyRTC_Init(void);

void RTC_SetTime(void);

void RTC_readtime(void);
#endif

MYRTC.c


uint32_t RTC_time=1705582640;//此时此刻的时间戳
struct tm tm_RTC;
void RTC_SetTime(void);
void MyRTC_Init(void)
{
		RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);//开启PWR
		RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP,ENABLE);//开启RTC时钟
		
	  PWR_BackupAccessCmd(ENABLE);;//设置寄存器PWR_CR的DBP位,使能对后备寄存器和RTC的访问
		
			RCC_LSEConfig(RCC_LSE_ON);//开启LSE

		 while(RCC_GetFlagStatus(RCC_FLAG_LSERDY)!= SET);
			RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);//选择RTC时钟源:外部时钟源
			RCC_RTCCLKCmd(ENABLE);//使能时钟
		
			RTC_WaitForSynchro();//等待RTC_CNT, RTC_ALR and RTC_PRL同步
			RTC_WaitForLastTask();//等待RTOFF置1,写操作完成
		
		
			RTC_SetPrescaler(32768-1);//配置预分频器系数
			RTC_WaitForLastTask();
			
			RTC_SetTime();
			RTC_WaitForLastTask();
			BKP_WriteBackupRegister(BKP_DR1, 0xFFFF);
	
	
	
}
void RTC_SetTime(void)
{
	RTC_SetCounter(RTC_time+8*60*60);
	
}
void RTC_readtime(void)
{
	uint32_t Read_time=0;
	Read_time=RTC_GetCounter();
	RTC_WaitForLastTask();
	tm_RTC=*localtime(&Read_time);
}

方案二:数组

MYRTC.h:

#ifndef __MYRTC_H
#define __MYRTC_H

extern uint16_t MYRTC_Time[];

void MYRTC_Init(void);
void MYRTC_SetTime(void);
void MYRTC_ReadTime(void);

#endif

MYRTC.c:

#include "stm32f10x.h"                  // Device header
#include <time.h>

uint16_t MYRTC_Time[] = {2024, 1, 18, 22, 53, 55};

void MYRTC_SetTime(void);

void MYRTC_Init(void)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP, ENABLE);
	
	PWR_BackupAccessCmd(ENABLE);
	

		RCC_LSEConfig(RCC_LSE_ON);
		while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) != SET);
		
		RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
		RCC_RTCCLKCmd(ENABLE);
		
		RTC_WaitForSynchro();
		RTC_WaitForLastTask();
		
		RTC_SetPrescaler(32768 - 1);
		RTC_WaitForLastTask();
		
		MYRTC_SetTime();


}
void MYRTC_SetTime(void)
{
	time_t time_cnt;
	struct tm time_date;
	
	time_date.tm_year = MYRTC_Time[0] - 1900;
	time_date.tm_mon = MYRTC_Time[1] - 1;
	time_date.tm_mday = MYRTC_Time[2];
	time_date.tm_hour = MYRTC_Time[3];
	time_date.tm_min = MYRTC_Time[4];
	time_date.tm_sec = MYRTC_Time[5];
	
	time_cnt = mktime(&time_date) - 8 * 60 * 60;
	
	RTC_SetCounter(time_cnt);
	RTC_WaitForLastTask();
}

void MyRTC_ReadTime(void)
{
	time_t time_cnt;
	struct tm time_date;
	
	time_cnt = RTC_GetCounter() + 8 * 60 * 60;
	
	time_date = *localtime(&time_cnt);
	
	MYRTC_Time[0] = time_date.tm_year + 1900;
	MYRTC_Time[1] = time_date.tm_mon + 1;
	MYRTC_Time[2] = time_date.tm_mday;
	MYRTC_Time[3] = time_date.tm_hour;
	MYRTC_Time[4] = time_date.tm_min;
	MYRTC_Time[5] = time_date.tm_sec;
}

时间的转化当中涉及一定偏移,不知道可以参考之前时间戳讲解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1394716.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

uniapp APP接入Paypal

1. 登录paypal开发者中心&#xff0c; 2. 选择 Apps & Credentials 点击 Create App创建应用&#xff0c;创建后点击编辑按钮&#xff0c;如图&#xff1a; 3. 进入应用详情&#xff0c;勾选Log in with PayPal点击 Advanced Settings 添加return URL等信息并保存。如图&a…

C++(13)——string

上篇文章中介绍了中部分函数的用法&#xff0c;本篇文章将继续对其他的函数进行介绍&#xff1a; 1. substr: string substr (size_t pos 0, size_t len npos) const; 函数的两个参数如上述代码所示&#xff0c;此函数的主要作用是根据一个已有的的对象的起始坐标开始&a…

快手二面:节流和防抖知道吗?

面试官:节流与防抖&#xff0c;说说两者各自适用场景&#xff1f; 回答&#xff1a;面试官&#xff0c;在前端开发中&#xff0c;节流&#xff08;Throttle&#xff09;和防抖&#xff08;Debounce&#xff09;是两种常用的优化高频率执行JavaScript代码的技术。我将分别阐述它…

ICC2:channel power plan/power switch的添加方法

更多学习内容请关注「拾陆楼」知识星球 拾陆楼知识星球入口 往期文章链接: low power与pg strategy (lib cell pin connect) low power与pg strategy(pg mesh) low power与pg

什么是技术架构?架构和框架之间的区别是什么?怎样去做好架构设计?(一)

什么是技术架构?架构和框架之间的区别是什么?怎样去做好架构设计?(一)。 在软件行业,对于什么是架构,都有很多的争论,每个人都有自己的理解。在不同的书籍上, 不同的作者, 对于架构的定义也不统一, 角度不同, 定义不同。 一、架构是什么 Linux 有架构,MySQL 有架构,J…

关于接口的安全性测试,这方法你学会了吗?

01、接口防刷 1.为什么会有人要刷接口&#xff1f; 牟利&#xff1a;黄牛在 12306 网上抢票再倒卖。 恶意攻击竞争对手&#xff1a;如短信接口被请求一次&#xff0c;会触发几分钱的运营商费用&#xff0c;当量级大了也很可观。 压测&#xff1a;用apache bench 做压力测试…

鸿蒙开发实战-(ArkUI)List组件和Grid组件的使用

在我们常用的手机应用中&#xff0c;经常会见到一些数据列表&#xff0c;如设置页面、通讯录、商品列表等。下图中两个页面都包含列表&#xff0c;“首页”页面中包含两个网格布局&#xff0c;“商城”页面中包含一个商品列表。 上图中的列表中都包含一系列相同宽度的列表项&am…

python使用贪心算法求最大整数问题

对于使用贪心算法的一个比较经典的问题&#xff0c;主要是为了解决最大整数的拼接问题&#xff0c;如果给定一个列表&#xff0c;这个列表中所包括的是一些非负整数&#xff0c;如果对这些整数进行组合&#xff0c;怎样才能组合出一个最大的整数&#xff0c;这里要注意一个问题…

自动派单系统哪家好?实现自动派单对于管理有什么帮助?

随着科技的发展&#xff0c;自动化管理已成为各行各业追求效率与精准的关键。在维修服务领域&#xff0c;自动派单系统的出现为管理员和用户带来了前所未有的便捷。通过自动匹配维修人员、实时通知用户进度等功能&#xff0c;自动派单系统不仅提高了派单的准确性和效率&#xf…

django后台进行加密手机号字段,加密存储,解密显示

需求: 1 &#xff1a;员工在填写用户的手机号时&#xff0c;直接填写&#xff0c;在django后台中输入 2&#xff1a;当员工在后台确认要存储到数据库时&#xff0c;后台将会把手机号进行加密存储&#xff0c;当数据库被黑之后&#xff0c;手机号字段为加密字符 3&#xff1a;员…

Python基础第一篇(Python概念介绍)

文章目录 一、前言&#xff1a;二、第一个Python程序三&#xff0c;理解Python的解释器四&#xff0c;Python解释器的使用五&#xff0c;Python开发环境 一、前言&#xff1a; 欢迎来到我们的Python学习专栏。在这里&#xff0c;我们将一起探索Python这门强大、灵活、易于学习…

微信小程序+前后端开发学习材料2-(视图+基本内容+表单组件)

学习来源 视图 1.swiper 滑块视图容器。其中只可放置swiper-item组件&#xff0c;否则会导致未定义的行为。 显示面板指示点indicator-dots 基础内容 1.icon 图标组件 实例演示 2.progress 进度条。组件属性的长度单位默认为px&#xff0c;咱用rpx。 实例演示 这…

SVO编译

文章目录 软件版本错误编译运行轨迹路径保存运行TUM数据集 附录针对svo slam的/svo/pose_imu转为tum格式代码 软件版本 ubuntu 20 rosnoeticSVO SLAM虚拟机 windows 11 错误 常见的git clone问题可以使用DevSidecar解决&#xff0c;在 加速服务-基本设置-绑定IP 设置为0.0.0…

Cinder对接NFS文件系统实验详解

2、对接NFS&#xff08;Network File System&#xff1a;网络文件系统&#xff09;实验 实验前的准备&#xff1a; 完整克隆一台虚拟机作为Cinder的后端存储&#xff08;IP为192.168.100.40&#xff09; Cinder节点作为服务端&#xff0c;把Controller作为客户端 Controlle…

git仓库使用说明

Git软件使用 1.先下载git相关软件 下载地址&#xff1a; Git - Downloading Package (git-scm.com) 下载其中一个安装 2.打开gitee网站&#xff0c;注册账号 3.打开个人中心&#xff0c;选择ssh公钥&#xff0c;查看如何生成公钥 4.生成公钥后&#xff0c;添加相应的公钥 …

Docker 安装 PHP

Docker 安装 PHP 安装 PHP 镜像 方法一、docker pull php 查找 Docker Hub 上的 php 镜像: 可以通过 Sort by 查看其他版本的 php&#xff0c;默认是最新版本 php:latest。 此外&#xff0c;我们还可以用 docker search php 命令来查看可用版本&#xff1a; runoobrunoob:…

AI 视频 | HiDream.ai 支持长视频,突破 4 秒限制!

2024 年&#xff0c;AI 视频领域大有可为。那么想卷 AI 视频领域&#xff0c;首先得掌握几个 AI 视频的工具。 之前的文章已经分享了一些常用的 AI 视频工具&#xff0c;比如 Pika、Runway Gen-2、Moonvalley、NeverEnds、DomoAI 以及 Stable Video Diffusion。 这些「往期 A…

关于Access中列的冻结的知识,看这篇就够了

在Microsoft Access中&#xff0c;有一个名为“冻结”的功能&#xff0c;使用户可以在滚动到另一个区域时保持数据表的某个区域可见。 可以使用冻结功能冻结数据表中的表、查询、窗体、视图或存储过程中的一个或多个字段。你冻结的字段将移动到数据表的左侧位置。 如何在Micr…

Unity关于纹理图片格式带来的内存问题和对预制体批量格式和大小减半处理

我们经常会遇到内存问题&#xff0c;这次就是遇到很多图片的默认格式被改成了RGB32&#xff0c;导致Android打包后运行内存明显增加。 发生了什么 打包Android后&#xff0c;发现经常崩溃&#xff0c;明显内存可能除了问题&#xff0c;看了内存后发现了问题。 见下图&#xf…

学习python仅此一篇就够了(使用python操作数据库)

python操作mysql SQL语言的分类 数据定义&#xff1a;DDL 数据操作&#xff1a;DML 数据控制&#xff1a;DCL 数据查询&#xff1a;DQL SQL支持注释&#xff1a;单行注释&#xff1a;--&#xff1b;单行注释#&#xff1b;多行注释&#xff1a;/* */ #查看数据库 show da…