【STM32 RTC实时时钟如何配置!超详细的解析和超简单的配置,附上寄存器操作】

STM32 里面RTC模块和时钟配置系统(RCC_BDCR寄存器)处于后备区域,即在系统复位或从待机模式唤醒后,RTC的设置和时间维持不变。因为系统对后备寄存器和RTC相关寄存器有写保护,所以如果想要对后备寄存器和RTC进行访问,则需要通过操作相应的寄存器来解除某些限制。

文章有点长,想要理解RTC原理的可以认真阅读。如果只想要源码的,可以直接拉到文章最下面

接下来进入正题:

一、解除寄存器操作限制

第一步首先需要设置RCC_APB1ENR的PWREN和BKPEN位。使能电源和后备接口时钟
在这里插入图片描述
第二步是设置寄存器PWR_CR的DBP位,使能对后备寄存器和RTC的访问
在这里插入图片描述

二、配置RTC

完成上面两步之后,我们就可以操作后备寄存器和RTC相关的寄存器了。但我们先来看看RTC的简单框图吧
在这里插入图片描述
从图可以看出来,要想让RTC工作,得让它先有一个时钟,也就是图中RTCCLK时钟的选择。
1、RTC时钟的选择
RTCCLK时钟源可以由HSE/128、LSE或LSI时钟提供。除非备份域复位,此选择不能被改变。

LSE时钟在备份域里,但HSE和LSI时钟不是。因此:

● 如果LSE被选为RTC时钟:

─ 只要V BAT 维持供电,尽管V DD 供电被切断,RTC仍继续工作。

● 如果LSI被选为自动唤醒单元(AWU)时钟:

─ 如果V DD 供电被切断, AWU状态不能被保证。

● 如果HSE时钟128分频后作为RTC时钟:

─ 如果V DD 供电被切断或内部电压调压器被关闭(1.8V域的供电被切断),则RTC状态不确定。

RTC的时钟源有三个,但只有LSE(外部低速振荡器,一般为32.678kHz)在VDD供电被切断后,仍能继续工作,因此我们一般都选择它。

RTC时钟源的选择需要操作备份域控制寄存器(RCC_BDCR)
在这里插入图片描述
配置时钟步骤

1)打开外部振荡器(LSEON置1)

2)然后等待LSE就绪,也就是等待LSERDY置1

3)选择RTC时钟源,也就是配置RTCSEL[1:0]

4)使能RTC时钟(RTCEN置1)

2、配置RTC相关寄存器
从RTC框图可以知道,RTC时钟选择后就应该配置RTC预分频器(RTC_PRL寄存器)和RTC_CNT计数器和闹钟计数器RTC_ALR。

一般我们通过预分频器将RTCCLK的时钟进行分频,让预分频器的输出时钟TR_CLK的频率变成1Hz,也就是周期为1s。然后RTC_CNT在TR_CLK频率下递增。如果RTC_CNT里面的值和RTC_ALR里面的数值相等,则会触发闹钟标志,即ALRF标志位置1。在每个TR_CLK的周期都会触发一次秒标志,即SECF标志位会置1.

一般如果用于时钟时钟的话,RTC_CNT可以设置为当前的时间。

如果需要配置RTC的 RTC_PRL、RTC_CNT、RTC_ALR寄存器。则必须判断RTC寄存器是否处于更新中,只有RTC寄存器不是处于跟新中才可以进行配置,可以通过RTC_CR寄存器里面的RTOFF位来判断。在配置前还必须将RTC_CRL寄存器里面的CNF位置1,进入配置模式,等待配置后,还要退出配置模式。

配置过程

1)查询RTOFF位,直到RTOFF的值变为‘1’

2)置CNF为1,进入配置模式

3)对一个或多个RTC寄存器进行写操作

4)清除CNF标志位,退出配置模式

5)查询RTOFF,直到RTOFF变为1,才代表写操作完成

注意:只有当CNF标志位被清除时,写操作才能进行,这个过程至少需要3个RTCCLK周期

在正式进入配置之前我们先来看看RTC几个寄存器

RTC控制寄存器高位RTC_CRH

在这里插入图片描述
这几位是用来使能中断的,可以配合前面的RTC框图“食用”

RTC控制寄存器低位RTC_CRL
在这里插入图片描述
在这里插入图片描述
注意:标志位都需要由软件清零

RTC预分频转载寄存器(RTC_PRLH/RTC_PRLL)

该寄存器是用于配置预分频器的分频比的,只有前20位有效,即PRL[19:0]有效,总共20位。

时钟计算公式fTR_CLK = fRTCCLK /(PRL[19:0]+1)。

当LSE位32.678kHz时,只需将RTC_PRLL配置成32677即可。

RTC计数器寄存器(RTC_CNTH/RTC_CNTL)

该32寄存器可以通过配置来设定初值,并且在TR_CLK的基准下进行计数

RTC闹钟寄存器(RTC_ALRH/RTC_ALRL)

该32位寄存器用来配置闹钟的数值。

现在基本知识框架都已经介绍好了正式进入配置阶段

首先我先给出直接操作寄存器的版本,后面我也会给出操作固件库的版本。

我相信通过前面的讲解,直接操作寄存器反而会更简单!代码也很容易看懂

//寄存器版本
void RTC_Init(void)
{
//这里是第一步解除写保护RCC->APB1ENR |= RCC_APB1ENR_PWREN;//电源接口时钟使能RCC->APB1ENR |= RCC_APB1ENR_BKPEN;//备份接口时钟开启PWR->CR |= PWR_CR_DBP;//允许写入RTC和后备寄存器
//这里是第二步进入配置RCC->BDCR |= RCC_BDCR_LSEON;//打开外部32kHz振荡器while(!(RCC->BDCR & RCC_BDCR_LSERDY));//等待外部32kHz振荡器就绪RCC->BDCR |= RCC_BDCR_RTCSEL_LSE;//选择外部32kHz振荡器作为RTC时钟源RCC->BDCR |= RCC_BDCR_RTCEN;//RTC时钟使能while(!(RTC->CRL &RTC_CRL_RTOFF));//等待上一次写操作完成RTC->CRL |= RTC_CRL_CNF;//进入配置模式RTC->PRLL = 32767;//fTR_CLK = fRTCCLK /(PRL[19:0]+1),周期为1HzRTC->CNTL = 0;//配置当前时间RTC->CNTH = 0;RTC->ALRH = 0;//配置闹钟时间RTC->ALRL = 2;RTC->CRH |= (RTC_CRH_ALRIE + RTC_CRH_SECIE);//使能秒中断和闹钟中断	RTC->CRL &= ~(RTC_CRL_CNF);//退出配置模式
}

我们一些喜欢嵌入式的朋友一起建立的一个技术交流平台,本着大家一起互相学习的心态而建立,不太成熟,希望志同道合的朋友一起来。QQ1群372991598

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

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

相关文章

一文详解:什么是企业邮箱?最全百科

什么是企业邮箱?企业邮箱即绑定企业自有域名作为邮箱后缀的邮箱,是企业用于内部成员沟通和客户沟通的邮箱系统。 一、企业邮箱概念拆解 1.什么是企业邮箱? 企业邮箱即使用企业域名作为后缀的邮箱系统。它不仅提供专业的电子邮件收发功能&a…

【学习】使用PyTorch训练与评估自己的ResNet网络教程

参考:保姆级使用PyTorch训练与评估自己的ResNet网络教程_训练自己的图像分类网络resnet101 pytorch-CSDN博客 项目地址:GitHub - Fafa-DL/Awesome-Backbones: Integrate deep learning models for image classification | Backbone learning/comparison…

PyScada(四)构建用户 HMI

构建用户 HMI(前端)的简短说明 在后端HMI部分: 图表,添加新图表页面,添加页面Widget,添加一个 Widget,在 Page 下选择您在 2 中添加的页面,并在Content下选择1 中的图表。小部件控…

【M1/M2】详细说明Parallels Desktop虚拟机的安装使用

希望文章能给到你启发和灵感~ 如果觉得有帮助的话,点赞+关注+收藏支持一下博主哦~ 阅读指南 开篇说明什么是Paralles Desktop一、基础环境说明1.1 硬件环境1.2 软件环境二、安装Parallels DeskTop2.1 下载软件安装包三、Parallels 下配置Windows 11 系统3.1 Windows 11安装3…

PostgreSQL 简介与基础(一)

1. 什么是 PostgreSQL 1.1 概述 PostgreSQL(常简称为Postgres)是一种功能强大的开源关系型数据库管理系统(RDBMS)。它以其可靠性、强大的功能和符合标准的特性著称。PostgreSQL 支持大部分 SQL 标准,并且具有许多现代…

护网面试内容

1.自我介绍 2.如何判断是不是误判 分析请求、响应内容,判断是否攻击成功首先看告警事件名称判断是网络攻击事件还是web攻击事件,网络攻击事件:定位五元组信息(源IP、目的IP、源端口、目的端口、协议),对整…

Docker系列之安全

Docker的安全前言一、Docker 容器与虚拟机的区别 1. 隔离与共享 2. 性能与损耗二、Docker 存在的安全问题 1.Docker 自身漏洞 2.Docker 源码问题三、 Docker 架构缺陷与安全机制 1. 容器之间的局域网攻击 2. DDoS 攻击耗尽资源 3. 有漏…

Vue_cli搭建过程项目创建

概述 vue-cli 官方提供的一个脚手架,用于快速生成一个 vue 的项目模板;预先定义 好的目录结构及基础代码,就好比咱们在创建 Maven 项目时可以选择创建一个 骨架项目,这个骨架项目就是脚手架,我们的开发更加的快速&am…

uni-app的showModal提示框,进行删除的二次确认,可自定义确定或取消操作

实现效果: 此处为删除的二次确认示例,点击删除按钮时出现该提示,该提示写在js script中。 实现方式: 通过uni.showModal进行提示,success为确认状态下的操作自定义,此处调用后端接口进行了删除操作&#…

【Android】App设置开机自启动之后但是无效的原因之一

问题描述 通过监听开机广播,然后启动App,但是在系统开机之后,App并没有启动。 问题原因 当一个App在安装之后,必须要先启动一次,然后这个开机启动的功能才可以正常使用。 但是由于我的这个App是一个服务类的App&am…

如何成为专业的 .NET 开发人员

如今,网上有大量信息,找到正确的信息并非易事。当你开始编程之旅并希望获得全面的指南时,最好寻找一个可以指导你完成整个过程的指南。 本文将帮助您制定一份路线图,告诉您什么是重要的以及什么是需要学习的. 一.一切从软件基础…

【JavaScript】BOM编程

目录 一、BOM编程是什么 二、window对象的常用方法 1、弹窗API方法 2、计时器任务方法 三、window对象的属性对象常用方法 1、history网页浏览历史 2、location地址栏 3、数据存储属性对象 4、console控制台 一、BOM编程是什么 当我们使用浏览器打开一个网页窗口时,…

Volatility 内存取证【信安比赛快速入门】

一、练习基本命令使用 1、获取镜像信息 ./volatility -f Challenge.raw imageinfo 一般取第一个就可以了 2、查看用户 ./volatility -f Challenge.raw --profileWin7SP1x64 printkey -K "SAM\Domains\Account\Users\Names" 3、获取主机名 ./volatility -f Challenge…

探索QCS6490目标检测AI应用开发(二):摄像头视频的拉取和解码

作为《探索QCS6490目标检测AI应用开发》文章,紧接上一期,我们介绍如何在应用程序中拉取视频流,并且用硬件解码,得到逐帧的图像画面。我们使用了高通的Intelligent Multimedia SDK(IM SDK)完成视频的拉流和硬…

Linux杀僵尸进程

ps -A -o stat,ppid,pid,cmd | grep -e ^[Zz] | awk {print $2}1、查看系统是否有僵尸进程 使用Top命令查找,当zombie前的数量不为0时,即系统内存在相应数量的僵尸进程。 2、定位僵尸进程 使用命令 ps -A -ostat,ppid,pid,cmd |grep -e [Zz]定位僵尸…

Kafka入门-分区及压缩

一、生产者消息分区 Kafka的消息组织方式实际上是三级结构:主题-分区-消息。主题下的每条消息只会保存在某一个分区中,而不会在多个分区中被保存多份。 分区的作用就是提供负载均衡的能力,或者说对数据进行分区的主要原因,就是为…

数据库与表的基本操作:构建数据世界的基石(三)

引言:从零构建数据结构的艺术 在上一章节《安装与配置》中,我们成功地在不同的操作系统上安装并配置了MySQL,为实战数据库管理奠定了坚实的基础。本章节,我们将深入探索数据库与表的基本操作,包括如何创建、删除数据库…

RandLA-Net语义分割

项⽬地址: GitHub - tsunghan-wu/RandLA-Net-pytorch: :four_leaf_clover: Pytorch Implementation of RandLA-Net (https://arxiv.org/abs/1911.11236) 搭建环境并配置RandLA-Net 根据Environment Setup 搭建环境(除了requirements.txt中的库&#xf…

畅谈GPT-5

前言 ChatGBT(Chat Generative Bidirectional Transformer)是一种基于自然语言处理技术的对话系统,它的出现是人工智能和自然语言处理技术发展的必然趋势。随着技术的更新和进步,GPT也迎来了一代代的更新迭代。 1.GPT的回顾 1.1 GPT-3的介绍 GPT-3(Gen…

门店客流统计)

门店客流统计 代码部分效果 代码部分 import cv2 import numpy as np from tracker import * import cvzone import timebg_subtractor cv2.createBackgroundSubtractorMOG2(history200, varThreshold140)# Open a video capture video_capture cv2.VideoCapture(r"sto…