RTC讲解

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);//开启PWRRCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP,ENABLE);//开启RTC时钟PWR_BackupAccessCmd(ENABLE);;//设置寄存器PWR_CR的DBP位,使能对后备寄存器和RTC的访问RCC_LSEConfig(RCC_LSE_ON);//开启LSEwhile(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_Hextern 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.rhkb.cn/news/242002.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【llm 使用llama 小案例】

huggingfacehttps://huggingface.co/meta-llama from transformers import AutoTokenizer, LlamaForCausalLMPATH_TO_CONVERTED_WEIGHTS PATH_TO_CONVERTED_TOKENIZER # 一般和模型地址一样model LlamaForCausalLM.from_pretrained(PATH_TO_CONVERTED_WEIGHTS) tokenize…

XHCMS靶场小记(熊海)

文件包含漏洞 template下的header.php中存在文件包含漏洞&#xff08;该文件被file文件夹下的多数文件进行包含&#xff09; f参数可以包含任意文件通过php格式解析&#xff08;这是文件包含点&#xff09; 代码分析 根目录下的index.php文件&#xff1b;r参数用于获取包含文…

计算机网络 网络安全

网络安全 网络安全问题概述 计算机网络面临的女全性威胁 计算机网络的通信而临两大类威胁&#xff0c;即被动攻击和主动攻击 被动攻击是指攻击者从网络上窃听他人的通信内容。通常把这类攻击称为截获。在被动攻击中&#xff0c;攻击者只是观察和分析某一个协议数据单元 PDU…

POKT Network (POKT) :进军百亿美元市场规模的人工智能推理市场

POKT Network&#xff08;又称 Pocket Network&#xff09;是一个去中心化的物理基础设施网络&#xff08;DePIN&#xff09;&#xff0c;它能够协调并激励对任何开放数据源的访问&#xff0c;最初专注于向应用程序和服务提供商提供区块链数据。 自 2020 年主网上线以来&#x…

Python笔记10-数据可视化练习折线图

文章目录 JSON数据Python数据和Json数据的相互转化pyecharts模块构建折线图全局配置绘制疫情数据折线图 JSON数据 JSON是一种轻量级的数据交互格式。可以按照JSON指定的格式去组织和封装数据 。本质上是一个带有特定格式的字符串 主要功能&#xff1a;可以在各个编程语言中流通…

spring data mongo 在事务中,无法自动创建collection

spring data mongo 在事务中,无法自动创建collection org.springframework.dao.DataIntegrityViolationException: Write operation error on server xxx:30001. Write error: WriteError{code=263, message=Cannot create namespace xxx.xxxin multi-document transaction.…

【计算机网络】2、传输介质、通信方向、通信方式、交换方式、IP地址表示、子网划分

文章目录 传输介质双绞线无屏蔽双绞线UTP屏蔽双绞线STP 网线光纤多模光纤MMF单模光纤SMF 无线信道无线电波红外光波 通信方向单工半双工全双工 通信方式异步传输同步传输串行传输并行传输 交换方式电路交换报文交换分组交换 IP地址表示IP地址的定义IP地址的分类无分类编址特殊I…

基于 UniAPP 社区论坛项目多端开发实战

社区论坛项目多端开发实战 基于 UniAPP 社区论坛项目多端开发实战一、项目准备1.1 ThinkSNS 简介及相关文档1.2 使用 UniAPP 构建项目1.3 构建项目文件结构1.4 配置页面 TabBar 导航1.5 使用 npm 引入 uView UI 插件库 二、首页功能实现2.1 首页 header 广告位轮播图功能实现2.…

【占用网络】FlashOcc:基于2D卷积的占用预测模型

前言 FlashOcc是一个它只需2D卷积就能实现“占用预测模型”&#xff0c;具有快速、节约内存、易部署的特点&#xff0c;偏工程方向的工作。 它首先采用2D卷积提取图形信息&#xff0c;生成BEV特征。然后通过通道到高度变换&#xff0c;将BEV特征提升到3D空间特征。 对于常规…

C#,入门教程(20)——列表(List)的基础知识

上一篇&#xff1a; C#&#xff0c;入门教程(19)——循环语句&#xff08;for&#xff0c;while&#xff0c;foreach&#xff09;的基础知识https://blog.csdn.net/beijinghorn/article/details/124060844 List顾名思义就是数据列表&#xff0c;区别于数据数组&#xff08;arr…

分析Unity崩溃日志(Android)

Unity版本&#xff1a; 这里Unity版本是Unity 2019.4.30f1 崩溃信息&#xff1a; 错误信息如下&#xff1a; Exception Appversion: versionName 1.0.1 versionCode 1 Process: sg.atla.f.c PID: 22716 UID: 10749 Flags: 0x3088be44 Package: sg.atla.f.c v1 (1.0.1) Fo…

CentOS安装Flume

CentOS安装Flume 一、简介二、安装1、下载2、解压3、创建配置文件4、启动flume agent5、验证 一、简介 Flume is a distributed, reliable, and available service for efficiently collecting, aggregating, and moving large amounts of log data. It has a simple and flexi…

Java多线程知识汇总(二)

目录 一、Java多线程1、进程与线程2、并行与并发二、线程的礼让三、线程的优先级四、守护线程五、线程的阻塞 六、线程的打断 七、线程的相关方法总结同步锁线程安全synchronized线程通信waitnotify 一、Java多线程 1、进程与线程 进程 当一个程序被运行&#xff0c;就开启…

SQL性能分析

SQL性能分析 1、SQL执行频率 ​ MySQL 客户端连接成功后&#xff0c;通过 show [session|global] status 命令可以提供服务器状态信 息。通过如下指令&#xff0c;可以查看当前数据库的INSERT、UPDATE、DELETE、SELECT的访问频次&#xff1a; -- session 是查看当前会话 ; …

《游戏-02_2D-开发》

基于《游戏-01_2D-开发》&#xff0c; 继续制作游戏&#xff1a; 首先给人物添加一个2D重力效果 在编辑的项目设置中&#xff0c; 可以看出unity默认给的2D重力数值是-9.81&#xff0c;模拟现实社会中的重力效果 下方可以设置帧率 而Gravity Scale代表 这个数值会 * 重力 还…

erlang (OS 操作模块)学习笔记

cmd: env: 返回所有环境变量的列表。 每个环境变量都表示为元组 {VarName&#xff0c;Value}&#xff0c;其中 VarName 是 变量和 Value 其值。 例: {VarName&#xff0c;Value} {"ERLANG_HOME","C:\\Program Files\\erl-24.3.4.2\\bin\\erl-24.3.4.2"}…

Linux多线程——互斥锁

本质Gitee仓库:互斥锁、锁封装 文章目录 1. 线程互斥2. 互斥锁2.1 锁的初始化与释放2.2 加锁与解锁 3. 锁的原理4. 锁的封装5. 线程安全与可重入函数 1. 线程互斥 一个共享资源在被多个线程并发访问的时候&#xff0c;可能会出现一个线程正在访问&#xff0c;而另一个线程又来…

Elasticsearch 分布式架构剖析及扩展性优化

1. 背景 Elasticsearch 是一个实时的分布式搜索分析引擎&#xff0c;简称 ES。一个集群由多个节点组成&#xff0c;节点的角色可以根据用户的使用场景自由配置&#xff0c;集群可以以节点为单位自由扩缩容&#xff0c;数据以索引、分片的形式散列在各个节点上。本文介绍 ES 分布…

交叉编译工具 aarch64-linux-gnu-gcc 的介绍与安装

AArch64 是随 ARMv8 ISA 一起引入的 64 位架构&#xff0c;用于执行 A64 指令的计算机。而且在 AArch64 状态下执行的代码只能使用 A64 指令集。&#xff0c;而不能执行 A32 或 T32 指令。但是&#xff0c;与 AArch32 中不同&#xff0c;在64位状态下&#xff0c;指令可以访问 …

离线数据仓库-关于增量和全量

数据同步策略 数据仓库同步策略概述一、数据的全量同步二、数据的增量同步三、数据同步策略的选择 数据仓库同步策略概述 应用系统所产生的业务数据是数据仓库的重要数据来源&#xff0c;我们需要每日定时从业务数据库中抽取数据&#xff0c;传输到数据仓库中&#xff0c;之后…