28_RTC实时时钟BKP备份寄存器_rtc备份寄存器-程序员宅基地

技术标签: stm32  STM32单片机  实时音视频  嵌入式硬件  单片机  

目录

RTC(Real Time Clock):实时时钟

RTC特征

RTC工作原理框图

BKP备份寄存器

RTC相关寄存器

 配置RTC寄存器

配置过程:

读RTC寄存器

RTC相关库函数讲解

RTC配置一般步骤


RTC(Real Time Clock):实时时钟

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

RTC模块和时钟配置系统(RCC_BDCR寄存器)是在后备区域,即在系统复位或从待机模式唤醒后RTC的设置和时间维持不变。但是在系统复位后,会自动禁止访问后备寄存器和RTC,以防止对后备区域(BKP)的意外写操作。所以在要设置时间前,先要取消备份区域(BKP)写保护。

RTC特征

1.可编程的预分频系数:分频系数最高为2的20次方。

2.32位的可编程计数器,可用于较长时间段的测量。

3.2个分离的时钟:用于APB1接口的PCLK1和RTC时钟(RTC时钟的频率必须小于PCLK1时钟频率的四分之一以上)。

4.可以选择以下三种RTC的时钟源:

HSE时钟除以128;

LSE振荡时钟;

LSI振荡器时钟

5.2个独立的复位类型:

APB1接口由系统复位:

RTC核心(预分器、闹钟、计数器和分频器)只能由后备域复位。

6.3个专门的可屏蔽中断:

闹钟中断,用来产生一个软件可编程的闹钟中断。

秒中断,用来产生一个可编程的周期性中断信号(最长可达1秒)。

溢出中断,指示内部可编程计数器溢出并回转为0的状态。

RTC工作原理框图

 

第一部分APB1接口部分:CPU可以通过APB1总线访问APB1接口,APB1接口主要是操作下面几个RTC的寄存器。

第二部分RTC核心:RTCCLK是时钟源可以是外部具体可以查看时钟框图。RTC_DIV叫预分频余寄存器,RTC_PRL叫自动重装载寄存器。这两个寄存器的作用,RTCCLK时钟来了后,首先程序里面执行时RTC_PRL寄存器里面会先写一个值,举例RTC_PRL里面写100,那就是会把RTCCLK时钟分频100,就是除100,RTC_DIV就是叫预分频余数就是可提供一个更精确的时钟。假设RTCCLK等于100Hz,RTC_PRL等于100,RTC_DIV就是会从100递减,减到0的时候会溢出产生一个时钟就是TR_CLK 1Hz。一般我们都会把TR_CLK时钟设成1Hz就是1s,然后到RTC_CNT32位的计数器,每个时钟周期都会加1,RTC_Second是秒会有个标志,RTC_Overflow溢出标志,如果开启中断的话会有一个溢出中断,RTC_Alarm就是一个闹钟,当RTC_ALR寄存器的值和RTC_CNT的值相等的时候就会产生一个闹钟,

RTC内核完全独立于APB1接口,软件通过APB1接口对RTC相关寄存器访问。但是相关寄存器只在RTC APB1时钟进行同步重新同步的RTC时钟的上升沿被更新。所以软件必须先等待寄存器同步标志位(RTC_CRL的RSF位)被硬件置1才读。

BKP备份寄存器

1.备份寄存器是42个16位的寄存器。可用来存储84个字节数据。

2.它们处在备份区域,当VDD电源切断,任然由VBAT维持供电。

3.当系统在待机模式下呗唤醒,或者系统复位或者电源复位,它们也不会复位。

4.执行以下操作将使能对后备寄存器和RTC访问:

        设置寄存器RCC_APB1ENR的PWREN和BKPEN位,使能电源和后备时钟。

        设置寄存器PWR_的DBP位,使能对RTC和后备寄存器的访问。

BKP备份寄存器

提醒:一共有42个16位备份寄存器。常用来保存一些系统配置信息和相关标志位。

RTC相关寄存器

RCT控制寄存器  (RTC_CRH,RTC_CRL)

RTC预分频装载寄存器 (RTC_PRLH,RTC_PRLL)

RTC预分频余数寄存器 (RTC_DIVH,RTC_DIVL)

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

RTC闹钟寄存器 (RTC_ALRH , RTC_ALRL)

RTC控制寄存器高位(RTC_CRH)

 RTC控制寄存器低位(RTC_CRL)

1.修改CRH/CRL寄存器,必须先判断RSF位,确定已经同步。

2.修改CNT,ALR,PRL的时候,必须先配置CNF位进入配置模式,修改完之后,设置CNF位为0退出配置模式

3.同时在对RTC相关寄存器写操作之前,必须判断上一次写操作已经结束,也就是判断RTOFF位是否置位。

RTC预分频装载寄存器高位(RTC_PRLH)

 

 RTC预分频装载寄存器高位(RTC_PRLL)

 RTC预分频余数寄存器 (RTC_DIVH,RTC_DIVL)

在TR_CLK的每个周期里,RTC预分频器中计数器的值都会被重新设置为RTC_PRL寄存器的值,用户可通过读取RTC_DIV奇存器,以获得预分频计数器的当前值,而不停止分频计数器的工作,从而获得精确的时间测量。此寄存器是只读寄存器,其值在RTC_PRL或RTC_CNT寄存器中的值发生改变后,田硬件重新装载:

RTC预分频余数寄存器高位 (RTC_DIVH)

 RTC预分频余数寄存器低位 (RTC_DIVL)

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

RTC核有一个32位可编程的计数器,可通过两个16位的寄存器访问。计数器以预分频器产生的TR_CLK时间基准为参考进行计数。RTC_CNT寄存器用米存放计数器的计数值。他们受RTC_CR的位RTOFF写保护,仅当RTOFF值为'1'时,允许写操作。在高或低寄存器(RTC_CNTH或RTC_CNTL)上的写操作,能够直接装载到相应的可编程计数器,并且重新装载RTC预分频器。当进行读操作时,直接返回计数器内的计数值(系统时间)。

RTC计数器寄存器高位(RTC_CNTH)

RTC闹钟寄存器 (RTC_ALRH , RTC_ALRL)

当可编程计数器的值与RTC_ALR中的32位值相等时,即触发一个闹钟事件,并且产生RTC闹钟中断。此寄存器受RTC_CR寄存器里的RTOFF位写保护,仅当RTOFF值为'1"时,允许写操作。

RTC闹钟寄存器高位(RTC_ALRH)

 RTC闹钟寄存器低位(RTC_ALRL)

 配置RTC寄存器

必须设置RTC_CRL寄存器中的CNF位,使RTC进入配置模式后,才能写入RTC_PRL、RTC_CNT、 RTC_ALR寄存器。另外,对RTC任何寄存器的写操作,都必须在前一次写操作结束后进行。可以通过查询RTC_CR寄存器中的RTOFF状态位,判断RTC寄存器是否处于更新中。仅当RTOFF状态位是'1'时,才可以写入RTC寄存器。

配置过程:

1.查询RTOFF位,直到RTOFF的值变为'1”

2.置CNF值为1,进入配置模式

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

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

5.查询RTOFF,直至RTOFF位变为'1'以确认写操作已经完成。

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

读RTC寄存器

RTC核完全独立于RTC APB1

软件通过APB1接口访问RTC的预分频值、计数器值和闹钟值。但是,相关的可读寄存器只在与RTC APB1时钟进行重新同步的RTC时钟的上升沿被更新。RTC标志也是如此的。"这意味着,如果APB1接门曾经被关闭,而读操作又是在刚刚重新开启APB1之后,则在第一次的内部寄存器更新之前,从APB1上读出的RTC寄存器数值可能被破坏了(通常读到0)。下述几种情况下能够发生这种情形:

发生系统复位或电源复位系统刚从待机模式唤醒。

系统刚从停机模式唤醒。

所有以上情况中APB1接口被禁止时(复位、无时钟或断电)RTC核仍保持运行状态。因此,若在读取RTC寄存器时, RTC的APB1接口曾经处于禁止状态,则软件首先必须等待RTC_CRL寄存器中的RSF位(寄存器同步标志)被硬件置'1'。

RTC相关库函数讲解

//RTC时钟源和时钟操作函数:
void RCC_RTCCLKConfig(uint32_t CLKSource): //时钟源选择
void RCC_RTCCLKCmd(FunctionalState NewState)//时钟使能

//RTC配置函数(预分频,计数值:
void RTC_SetPrescaler(uint32_t PrescalerValue);//预分频配置: PRLH/PRLL
void RTC_SetCounter(uint32_t CounterValue): //设置计数器值: CNTH/CNTL
void RTC SetAlarm(uint32 tAlarmValue); //闹钟设置: ALRH/ALRL

//RTC中断设置函数:
void RTC_ITConfig(uint16_tRTC_IT, FunctionalState NewState);//CRH

//RTC允许配置和退出配置函数:
void RTC_EnterConfigMode(void);//允许RTC配置:CRL位 CNF
void RTC_ExitConfigMode(void);//退出配置模式:CRL位 CNF

//同步函数:
void RTC_WaitForLastTask(void); //等待上次操作完成: CRL位RTOFF
void RTC_WaitForSynchro(void); //等待时钟同步: CRL位RSF

//相关状态位获取清除函数:
FlagStatus RTC_GetFlagStatus(uint16_t RTC_FLAG);
void RTC_ClearFlag(uint16_t RTC_FLAG);
ITStatus RTC_GetITStatus(uint16_t RTC_IT);
void RTC_ClearlTPendingBit(uint16_t RTC_IT);




其他相关函数(BKP等)
PWR_BackupAccessCmd();//BKP后备区域访问使能
RCC_APB1 PeriphClockCmd();//使能PWR和BKP时钟
RCC LSEConfig();//开启LSE, RTC选择LSE作为时钟源

RTC配置一般步骤

使能PWR和BKP时钟: RCC_APB1PeriphClockCmd();

使能后备寄存器访问: PWR_BackupAccessCmd();

配置RTC时钟源,使能RTC时钟:

RCC_RTCCLKConfig();

RCC_RTCCLKCmd();

如果使用LSE,要打开LSE: RCC_LSEConfig(RCC_LSE_ON);

设置RTC预分频系数: RTC_SetPrescaler();

设置时间: RTC_SetCounter();

开启相关中断(如果需要) RTC_ITConfig();

编写中断服务函数: RTC_IRQHandler();

部分操作要等待写操作完成和同步。

RTC_WaltForLastTask();//等待最近一次对RTC寄存器的写操作完成

RTC WaitForSynchro(); //等待RTC寄存器同步

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Yuanghxb/article/details/128175239

智能推荐

Parameter tasks is deprecated, use target instead-程序员宅基地

文章浏览阅读4.1k次。原因:<tasks></tasks><plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-antrun-plugin</artifactId> <version>1.8</version&g..._parameter tasks is deprecated, use target instead

用xshell连接l自己的inux-程序员宅基地

文章浏览阅读55次。有时候连接会提示失败(当然确保账号密码没错),这里需要安装一个服务,ssh服务器1)ubuntu安装ssh服务器sudo apt-get install openssh-server2)出现问题时,重启ssh服务即可sudo service ssh restart转载于:https://www.cnblogs.com/wzqstudy/p/10532694.html..._xshelll http

解决 Zuul 中 OAuth2 报 unauthorized 错误-程序员宅基地

文章浏览阅读2.8k次。问题描述微服务中使用 OAuth2 鉴权,直接访问正常,通过 Zuul 访问报错:{ "error": "unauthorized", "error_description": "Full authentication is required to access this resource"}解决方法在 Zuul 中添加配置:zuul..._error:unauthorized

大道五目Flash英文版(Renju Problems)程序分析之禁手判断-程序员宅基地

文章浏览阅读110次。现在界面已经完成了,刚刚完成了禁手算法,把代码共享出来:CodeprivatefunctionIsForbidden(x:int,y:int,board:Array):int{varindex:int=x*15+y;//setthisposition(x,y)toblac..._程序判断禁手

(转)淘淘商城系列——商品搜索功能测试-程序员宅基地

文章浏览阅读107次。http://blog.csdn.net/yerenyuan_pku/article/details/72941506到这里,我相信大家也是不容易,我自己也算是很不容易写到这里,希望自己能一直写下去。之前我们就差不多把商品搜索功能实现了,本文我们来一起测试下该搜索功能。 首先我们要保证zookeeper、redis、image、solr服务都开启。接着我们把taotao-common工..._商品搜索浏览功能测试

EOS开发环境搭建-程序员宅基地

文章浏览阅读67次。EOS开发环境搭建  在上一篇文章《扒一扒EOS的前世今生》中,我们已经了解了EOS以及他的创始人Daniel Larimer的故事,本次为大家带来的是关于EOS开发环境搭建的内容。首先我们来了解一下EOS的核心架构和白皮书。1. EOS的核心架构  EOS网络由21个超级节点和100个备选节点构成,这21个超级节点负责轮流产生区块,避免了挖矿竞赛的问题,有效的提高同步数据的性能。2..._eos环境搭建

随便推点

plus.push.getClientInfo获取客户端标识clientid_plus.push.getclientinfo()-程序员宅基地

文章浏览阅读5.2k次。方案一:let pinf = plus.push.getClientInfo();let cid = pinf && pinf.clientid || ''; //客户端标识有可能取不到clientId,或者为‘undefined’ ‘null' 等字符串由于可能取不到,然后使用方案二,异步获取方案二:plus.push.getClientInfoAsync((info) => { cid = info.clientid; }, err =&g_plus.push.getclientinfo()

Verilog仿真事件队列-程序员宅基地

文章浏览阅读876次。1.分层的事件队列2.执行事件的队列3.仿真时间的计算4.同一层事件,无先后顺序这个点:觉得Verilog与systemVerilog比较,Verilog比较笼统,systemVerilog则比较细分。在Verilog眼中无论testbench、dut还是assertion都是code。所以先把code吃进来,然后有一个时间轴参数,仅仅处理set t = 0时刻的code...._verilog 事件队列

conda中设置源_conda 源-程序员宅基地

文章浏览阅读1w次,点赞3次,收藏12次。文章目录添加源清华源腾讯源移除源清华源腾讯源打印当前channels系统中的配置文件使用pip源添加源清华源conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/conda config --add channels h_conda 源

Linux下USB转串口的驱动【转】-程序员宅基地

文章浏览阅读42次。转自:http://www.linuxidc.com/Linux/2011-02/32218.htmLinux发行版自带usb to serial驱动,以模块方式编译驱动,在内核源代码目录下运行Make MenuConfig选择Devces drivers-->USB seupport--> <M>USB Serial Converter support --> ..._ttyusb 需要哪些ko

Python字符串格式化方法及对比分析:百分号与format方式-程序员宅基地

文章浏览阅读259次。字符串格式化目前有两种方式:一、“%”方式;二、format方式;一、“%”方式1、%传值:%s:可以接收任何值;%d:接收数字;1 msg = 'my name is %s' %'zhangsan' #str类型2 msg1 = 'he is %s' %20 #he is 20 int类型3 msg2 = 'she likes %s' %['apple','orange','pai'] #..._pylance 只有提示 无法自动格式化

深入理解Thread.sleep()函数_thread sleep-程序员宅基地

文章浏览阅读1.4k次,点赞5次,收藏5次。目录前言回顾操作系统原理时间片算法抢占式操作系统前言我们可能经常会用到 Thread.sleep() 函数来使线程挂起一段时间。那么你有没有正确的理解这个函数的用法呢?思考下面这两个问题假设现在是 2008-4-7 12:00:00.000,如果我调用一下 Thread.sleep(1000) ,在 2008-4-7 12:00:01.000 的时候,这个线程会不会被唤醒?某人的代码中用了一句看似莫明其妙的话:Thread.sleep(0) 。既然是 sleep 0 毫秒,那么他跟去掉这句代码相_thread sleep

推荐文章

热门文章

相关标签