RTC实时显示时间(备份电源 备份域的作用)

RTC初始化配置

系统复位后,可通过 PWR 电源控制寄存器 (PWR_CR) 的 DBP 位保护 RTC 寄存器以防止

非正常的写访问。必须将 DBP 位置 1 才能使能 RTC 寄存器的写访问。

上电复位后,所有 RTC 寄存器均受到写保护。通过向写保护寄存器 (RTC_WPR) 写入一个

密钥来使能对 RTC 寄存器的写操作。

要解锁所有 RTC 寄存器(RTC_ISR[13:8]、 RTC_TAFCR 和 RTC_BKPxR 除外)的写保护,

需要执行以下步骤:

1. 将“0xCA”写入 RTC_WPR 寄存器。

2. 将“0x53”写入 RTC_WPR 寄存器。

写入一个错误的关键字会再次激活写保护。

保护机制不受系统复位影响。

总结:

①将电源控制寄存器(PWR->CR)的DBP位写1     //解除RTC控制器和备份寄存器的保护

配置这个寄存器之前,要使能电源控制器时钟 RCC->APB1

②往RTC_WPR 中写 0xca  再写 0x53

取消所有寄存器的写保护

   往RTC_WPR寄存器中随便写一个数据就会再次激活写保护

设置日历寄存器要求

要编程包括时间格式和预分频器配置在内的初始时间和日期日历值,需按照以下顺序操作:

1. 将 RTC_ISR 寄存器中的 INIT 位置 1 以进入初始化模式。在此模式下,日历计数器将停

止工作并且其值可更新。

2、轮询查INITF 判断是否日历真的进入初始化模式  日历是否停止运行

3、设置时间和日期

4、退出初始化模式

总结:

要想改变日历寄存器的时间的值或者分频值,需要让日历进入初始化模式(日历停止工作)

更改完以后,要想日历继续工作,需要退出初始化模式(自由模式)

进入初始化模式

RTC->ISR 寄存器的INIT位写1

检测是否允许更新(改变)日历值位  INITF

设置日期和时间寄存器

退出初始化模式  

RTC->ISR 寄存器的INIT位写0

设置时间和日期程序

{

//进入日历初始化模式

//等待进入初始化模式完成

//设置日期和时间

//退出日历初始化模式

}

读取日历时间和日期

要想读时间和日期,要等待时间和日期同步(加载到影子寄存器),、

如何等待时间和日期同步到影子寄存器

ISR寄存器中RSF位要先清零,然后等待置1,读时间或者日期值.

获取时间和日期

{

        清零同步标志位;

        等待同步标志位置1;

        读取时间寄存器

        清零同步标志位;

        等待同步标志位置1;

        读取日期寄存器;

}

​​​​​​​寄存器

CR:

6位    0 设置时间格式     24小时

5位    0   //更新影子设置

   

ISR:

7位   进入初始化模式   先写1  配置完时间后在复位为0

6位   7位写1后,到用此位等到位1后才可以去编程时间

5位   同步标志,读日历寄存器的时候要看此位是否为1才可以读

PRER

使用默认值   15        256  分频

RTC 写保护寄存器 (RTC_WPR)

0xCA

0x53

TR

DR

BCD码

①什么是BCD码

19------0x19

0x19----19

②如何将用户的时间(十进制)设置到寄存器中

设置时间:把用户设置的十进制时间,转换成相应的BCD码,写入到寄存器中

③如何将寄存器的时间(BCD)给用户(十进制)

获取时间:把寄存器中的BCD码,转换成十进制形式,给到用户

//十进制转BDC码    //设置时间用

参数 : 十进制

返回值:BCD码结果      

13   0x13  

u8 in_dec_out_bcd(u8 dec)  

{

        return  ((dec / 10) << 4) | (dec % 10);

}

//BCD码转十进制  //读时间使用

参数  :BCD码

返回值:十进制

0x13      13   

u8 in_bcd_out_dec(u8 bcd)

{

        return  (bcd  >> 4) * 10 + (bcd & 0x0f);

}        

设置日期和时间

让日历进入初始化模式

等待等待可以改变日期和时间寄存器

将设置的十进制数据转换成BCD码

设置TR 和 DR

退出初始化模式

获取日期和时间

ISR寄存器中RSF位0

等待同步完成(等待ISR寄存器中RSF位自动变为1)

读出日期寄存器的值(BCD码)

将读出的BCD码转换成十进制形式

ISR寄存器中RSF位0

等待同步完成(等待ISR寄存器中RSF位自动变为1)

读出时间寄存器的值(BCD码)

将读出的BCD码转换成十进制形式

打印,显示

备份电源作用是:

芯片断电可以让RTC继续工作,同时备份寄存器不复位

备份寄存器的作用:

防止芯片重新上电后,CUP重置初始时间

#include "rtc.h"/***********************************************
*函数名    :RTC_init
*函数功能  :RTC初始化配置
*函数参数  :无
*函数返回值:无
*函数描述  :			
************************************************/
void RTC_init(RTC_t time)
{/*解除对RTC控制器以及寄存器的写保护*///使能电源控制器时钟RCC->APB1ENR |= (1<<28);//电源控制寄存器PWR_CR DBP位写1 解除RTC控制器写保护PWR->CR |= (1<<8);//使能RTC控制器时钟  RCC备份域控制寄存器RCC->BDCR |= (1<<0); //使能外部低速时钟while(!(RCC->BDCR & (1<<1)));//等待时钟就绪RCC->BDCR |= (1<<8);//选择LSE时钟RCC->BDCR |= (1<<15);//使能RTC时钟//写入密钥解除RTC寄存器写保护RTC->WPR=0xCA;RTC->WPR=0x53;/*配置CR寄存器*/RTC->CR &=~(1<<6);//设置24小时格式RTC->CR &=~ (1<<5);//取影子寄存器里的值//操作完寄存器就要进行一次激活写保护RTC->WPR=0xff;/*设置初始时间*///	if(RTC->BKP0R !=500)  //设置备份域寄存器
//	{
//		/*设置初始时间*/
//		set_time(time);
//		RTC->BKP0R = 500;
//	}set_time(time);//调用设置时间函数}/***********************************************
*函数名    :in_dec_out_bcd
*函数功能  :将十进制数据转换成BCD码形式
*函数参数  :u8 dec
*函数返回值:u8
*函数描述  :设置时间时候使用			
************************************************/
u8 in_dec_out_bcd(u8 dec)
{return ((dec/10)<<4) | (dec%10);
}/***********************************************
*函数名    :set_time
*函数功能  :设置时间函数
*函数参数  :RTC_t time
*函数返回值:无
*函数描述  :			
************************************************/
void set_time(RTC_t time)
{u32 temp_tr=0;u32 temp_dr=0;//解除寄存器保护RTC->WPR=0xCA;RTC->WPR=0x53;//进入日历寄存器进入初始化模式 ISRRTC->ISR |= (1<<7);//等待初始化结束 也就是允许更新日历寄存器while(!(RTC->ISR & (1<<6)));//设置时间和日历(10进制转bcd码)temp_tr=(in_dec_out_bcd(time.h))<<16 | (in_dec_out_bcd(time.m))<<8  |      (in_dec_out_bcd(time.s));temp_dr=(in_dec_out_bcd(time.year-2000))<<16 | (in_dec_out_bcd(time.week))<<13     | (in_dec_out_bcd(time.mon))<<8 |(in_dec_out_bcd(time.day));//设置TR和DRRTC->TR = temp_tr;RTC->DR = temp_dr;//退出日历初始化模式RTC->ISR &=~(1<<7);//激活写保护(操作完寄存器就要进行一次激活写保护)RTC->WPR=0xff;	}/***********************************************
*函数名    :in_bcd_out_dec
*函数功能  :将BCD码形式数据转换成十进制
*函数参数  :u8 bcd
*函数返回值:u8
*函数描述  :获取时间使用	
************************************************/
u8 in_bcd_out_dec(u8 bcd)
{return (bcd>>4)*10 + (bcd & 0x0f);
}/***********************************************
*函数名    :get_time
*函数功能  :获取时间函数
*函数参数  :无
*函数返回值:RTC_t
*函数描述  :			
************************************************/
RTC_t get_time(void)
{RTC_t t;u32 temp_tr=0;u32 temp_dr=0;//解除寄存器保护RTC->WPR=0xCA;RTC->WPR=0x53;	//ISR寄存器中的RSF位0(同步清零)RTC->ISR &=~(1<<5);//等待同步完成while(!(RTC->ISR & (1<<5)));//读出时间寄存器的值(bcd码)temp_tr=RTC->TR;//ISR寄存器中的RSF位0(同步清零)RTC->ISR &=~(1<<5);	//等待同步完成while(!(RTC->ISR & (1<<5)));	//读出日期寄存器的值(bcd码)temp_dr=RTC->DR;//获取时间数据 将读出的BCD码转10进制t.h=in_bcd_out_dec(temp_tr>>16);t.m=in_bcd_out_dec(temp_tr>>8);t.s=in_bcd_out_dec(temp_tr);//获取时间数据 将读出的BCD码转10进制t.year=in_bcd_out_dec(temp_dr>>16)+2000;t.week=in_bcd_out_dec((temp_dr>>13)&0x07);t.mon=in_bcd_out_dec((temp_dr>>8)&0x1f);t.day=in_bcd_out_dec(temp_dr);//	t.year = in_bcd_out_dec(temp_dr >> 16) + 2000;
//	t.week = in_bcd_out_dec((temp_dr & 0xe000) >> 13);
//	t.mon = in_bcd_out_dec((temp_dr & 0x1f00) >> 8);
//	t.day = in_bcd_out_dec(temp_dr>> 0);//激活写保护RTC->WPR=0xff;	 return t;}

设置好设置时间函数、获取时间函数后 通过定时中断可以实现1s打印一次时间

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

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

相关文章

电脑更新到win11后不能上网,更新win11后无法上网

越来越多的用户升级了win11系统使用&#xff0c;然而有些用户发现电脑更新到win11后不能上网了&#xff0c;这是怎么回事呢?而且奇怪的是&#xff0c;网络状态显示已连接&#xff0c;但就是无法上网&#xff0c;原本以为重置网络就能搞定&#xff0c;但结果相反。针对这一情况…

Android ViewStub

1.ViewStub ViewStub是一个可用于性能优化的控件&#xff0c;它是一个不可见的、零尺寸的View&#xff0c;可以在运行时进行延迟加载一个布局文件&#xff0c;从而提高显示速率。 viewstub和include比较像&#xff0c;都是在一个布局文件中嵌入另外一个布局文件&#xff0c;然…

如何在前后端一体的项目中引入element-ui,即引入index.js、index.css等文件。

24年接手了一个18年的项目&#xff0c;想使用el-ui的组件库&#xff0c;得自己手动引入。 通过官网可以知道&#xff0c;首先得准备以下文件 <!-- 引入样式 --> <link rel"stylesheet" href"https://unpkg.com/element-ui/lib/theme-chalk/index.css…

计算机视觉——Python OpenCV BGR转HSV

这里将介绍如何使用 OpenCV 与 Python 来作彩色影像转HSV(RGB to HSV 或 BGR to HSV)&#xff0c;在写 Python 影像处理程序时常会用到 OpenCV cvtColor 作颜色空间转换的功能&#xff0c;接下来介绍怎么使用 Python 搭配 OpenCV 模块来进行 RGB/BGR 转 HSV 彩色转HSV空间。 H…

第6章 6.1.1 文本格式化 sprintf函数(MATLAB入门课程)

sprintf函数源自 C 语言标准库中的同名函数&#xff0c;这个函数在 C 语言中用于创建格式化的字符串&#xff0c;且使用频率非常高。作为一门高级编程语言&#xff0c;MATLAB借鉴了 C 语言和其他编程语言中的许多特性和命名惯例。在MATLAB中&#xff0c;sprintf函数主要有两种用…

Redis系列之主从复制集群搭建

在上一篇博客&#xff0c;我们已经知道怎么搭建一个redis单机版&#xff0c;这篇博客基于之前的基础&#xff0c;来搭建一个redis主从同步&#xff0c;本博客框架是一主二从&#xff0c;一个主节点&#xff0c;其它两个从节点 实验环境 CentOS7Xshell6XFtp6Redis6.2.2 主从关…

Redis中的集群(二)

节点 集群数据结构 redisClient结构和clusterLink结构的相同和不同之处 redisClient结构和clusterLink结构都有自己的套接字描述符和输入、输出缓冲区&#xff0c;这两个结构的区别在于&#xff0c;redisClient结构中的套接字和缓冲区是用于连接客户端的&#xff0c;而clust…

手写一个民用Tomcat (03)

我们完成了这个 小型Tomcat 基本功能&#xff0c;但是他处理请求还是 一个一个的执行&#xff0c;并不能做到并行处理。 我们仿照Tomcat的思路来进行 一比一精准优化。 首先看一下我们的JxdHttpConnector 有什么改进&#xff0c;他可以理解成一个快递站领导&#xff0c;统一指挥…

Django实现的登录注册功能

1 前言 在Web开发中&#xff0c;用户登录和注册是最基本且必不可少的功能。Django&#xff0c;作为一个高级的Python Web框架&#xff0c;为我们提供了强大的工具和库来快速实现这些功能。下面&#xff0c;我将详细介绍如何使用Django来实现用户登录和注册功能。 2 功能介绍 …

MATLAB计算投资组合的cVaR和VaR

计算条件风险价值 (Conditional Value-at-Risk, cVaR) 是一种衡量投资组合风险的方法&#xff0c;它关注的是损失分布的尾部风险。 MATLAB代码如下: clc;close all;clear all;warning off;%清除变量 rand(seed, 100); randn(seed, 100); format long g;% 随机产生数据&#x…

Mac 安装 brew brew cask 遇到的问题以及解决办法

安装Homebrew和Homebrew Cask是在Mac上管理软件包的常用方法。虽然大多数情况下安装这两个工具是比较简单的&#xff0c;但有时候也可能遇到一些问题。下面是一些常见的问题以及解决办法&#xff1a; 问题1&#xff1a;无法安装Homebrew 解决办法&#xff1a; 1.确保你的Mac已连…

低代码ARM计算机在IIoT中的采集控制生产面板

工业4.0的大潮下工业物联网&#xff08;IIoT&#xff09;已成为推动制造业转型升级的重要动力。其中&#xff0c;低代码ARM嵌入式计算机凭借其出色的性能、灵活的配置以及高度集成化的特点&#xff0c;在工业设备远程监控、维护与诊断方面发挥着关键作用。 一、远程监控与维护 …

华为 2024 届校园招聘-硬件通⽤/单板开发——第一套(部分题目分享,完整版带答案,共十套)

华为 2024 届校园招聘-硬件通⽤/单板开发——第一套 部分题目分享&#xff0c;完整版带答案(有答案和解析&#xff0c;答案非官方&#xff0c;未仔细校正&#xff0c;仅供参考&#xff09;&#xff08;共十套&#xff09;获取&#xff08;WX:didadidadidida313&#xff0c;加我…

【双指针】删除有序数组中的重复项

给你一个 非严格递增排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums 的唯一元素的数量为 k &#xff0c;你…

【黑马头条】-day07APP端文章搜索-ES-mongoDB

文章目录 今日内容1 搭建es环境1.1 拉取es镜像1.2 创建容器1.3 配置中文分词器ik1.4 测试 2 app文章搜索2.1 需求说明2.2 思路分析2.3 创建索引和映射2.3.1 PUT请求添加映射2.3.2 其他操作 2.4 初始化索引库数据2.4.1 导入es-init2.4.2 es-init配置2.4.3 导入数据2.4.4 查询已导…

IT行业网络安全守护者-行云管家云堡垒机

IT行业即信息技术行业&#xff0c;是一个涵盖广泛的行业领域&#xff0c;主要涉及与信息的处理、存储、传输和应用相关的技术。对于IT行业而言&#xff0c;保障数据安全以及网络安全至关重要&#xff0c;一不小心就容易造成数据泄露事件。今天我们小编就给大家介绍一下IT行业网…

《模版模式(极简c++)》

本文章属于专栏- 概述 - 《设计模式&#xff08;极简c版&#xff09;》-CSDN博客 本章简要说明适配器模式。本文分为模式说明、本质思想、实践建议、代码示例四个部分。 模式说明 方案&#xff1a; 模版模式定义了一个逻辑的骨架&#xff0c;将某些步骤推迟到子类中实现。父类…

设计模式系列:单例模式

作者持续关注WPS二次开发专题系列&#xff0c;持续为大家带来更多有价值的WPS开发技术细节&#xff0c;如果能够帮助到您&#xff0c;请帮忙来个一键三连&#xff0c;更多问题请联系我&#xff08;WPS二次开发QQ群:250325397&#xff09;&#xff0c;摸鱼吹牛嗨起来&#xff01…

技术即服务:产品预告-1

为了让大家以最小的代价入门、学到、升华一些领域的技术&#xff0c; 博主准备给大家做一个代理&#xff1a;我来深入研究各项技术点 和 应用点&#xff0c;你只需要从我这里轻松学习就行了。 目标&#xff1a;从我这里更加容易地理解技术并学到想要的知识&#xff0c;并且在短…

scaling laws for neural language models

关于scaling law 的正确认识 - 知乎最近scaling law 成了最大的热词。一般的理解就是&#xff0c;想干大模型&#xff0c;清洗干净数据&#xff0c;然后把数据tokens量堆上来&#xff0c;然后搭建一个海量H100的集群&#xff0c;干就完了。训练模型不需要啥技巧&#xff0c;模型…