STM32学习和实践笔记(38):RTC实时时钟实验

1.STM32F1 RTC介绍

 STM32 的实时时钟( RTC)是一个独立的定时器。

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

RTC模块和时钟配置是在后备区域,无论器件状态如何(运行模式、低功耗模式或处于复位状态),只要保证后备区域供电正常,RTC便不会停止工作,所以通常会在后备区域供电端加一个纽扣电池,即使主电源停止供电,后备电源也会启动供电,从而保证RTC时钟不停的运行,只有当主电源和后备纽扣电池都没有电的时,RTC才停止工作。 

从 RTC 的定时器特性来说,它是一个 32 位的计数器,只能向上计数。它的时钟来源有三种,分别为高速外部时钟的 128 分频( HSE/128)、 低速内部时钟 LSI 以及低速外部时钟 LSE。

但一般都是使用低速外部时钟 LSE作为时钟来源。因为只有这样主电源掉电RTC才不会停止。

LSE 通常都是32.768KHZ ,因为2的15次方刚好是32768,这样方便对这个频率进行分频。例如,2的15次方,二进制向左移一位,变成2的14次方,就是一次分频,即32768/2=16384.

2. RTC结构框图

  STM32F1 RTC拥有这么多功能,是由RTC内部结构决定。要更好的理解STM32F1的RTC,就需要了解它内部的结构。如图32.1.1所示:(大家也可以查看《STM32F10x中文参考手册》-16实时时钟(RTC)章节内容

  系统复位后默认禁止访问后备寄存器和 RTC,防止对后备区域(BKP)的意外写操作。执行以下操作使能对后备寄存器和 RTC 的访问

(1) 设置 RCC_APB1ENR 寄存器的 PWRENBKPEN 位来使能电源和后备接口时钟

(2) 设置电源控制寄存器(PWR_CR)的 DBP 位使能对后备寄存器和 RTC 的访问

  设置后备寄存器为可访问后,在第一次通过 APB1 接口访问 RTC 时, 因为时钟频率的差异,所以必须等待 APB1 与 RTC 外设同步,确保被读取出来的 RTC 寄存器值是正确的。若在同步之后,一直没有关闭 APB1 的 RTC 外设接口,就不需要再次同步了

  如果内核要对 RTC寄存器进行任何的写操作,在内核发出写指令后, RTC模块在 3个RTC CLK 时钟之后,才开始正式的写 RTC 寄存器操作

由于 RTC CLK 的频率比内核主频低得多,所以每次操作后必须要检查 RTC关闭操作标志位 RTOFF,当这个标志被置 1 时,写操作才正式完成。

3.STM32F1 RTC配置步骤

  RTC相关库函数在stm32f10x_rtc.c和stm32f10x_rtc.h文件中)具体配置步骤如下:

(1)使能电源时钟和后备域时钟,开启RTC后备寄存器写访问

RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);

RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP,ENABLE);

PWR_BackupAccessCmd(ENABLE);//打开后备寄存器访问

(2)复位备份区域,开启外部低速振荡器

BKP_DeInit();

RCC_LSEConfig(RCC_LSE_ON);

(3)选择 RTC 时钟,并使能

RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);

RCC_RTCCLKCmd(ENABLE);

(4)设置 RTC 的分频以及配置 RTC 时钟

RTC_EnterConfigMode();// 允许配置

RTC_ExitConfigMode();

void RTC_SetPrescaler(uint32_t PrescalerValue);

void RTC_ITConfig(uint16_t RTC_IT, FunctionalState NewState);

RTC_ITConfig(RTC_IT_SEC, ENABLE);

void RTC_SetCounter(uint32_t CounterValue);

(5)更新配置,设置 RTC 中断分组

RTC_ExitConfigMode();//退出配置模式,更新配置

void BKP_WriteBackupRegister(uint16_t BKP_DR, uint16_t Data);

BKP_WriteBackupRegister(BKP_DR1, 0XA0A0);

uint16_t BKP_ReadBackupRegister(uint16_t BKP_DR);

(6)编写RTC中断服务函数

RTC_IRQHandler

FlagStatus RTC_GetFlagStatus(uint32_t RTC_FLAG);

RTC_ClearITPendingBit(RTC_IT_SEC);

3.硬件电路

本实验使用到硬件资源如下

1)D1指示灯

2)串口1

3)RTC

  RTC属于STM32F1芯片内部的资源,只要通过软件配置好即可使用。

D1指示灯用来提示系统运行状态。串口1将读取的RTC时间日期信息打印出来。

这里需要注意RTC 不能断电,否则时间数据将会丢失,如果想让时间在断电后还可以继续走,那么必须确保开发板上的纽扣电池有电。      

4.编写RTC控制程序

  本实验所要实现的功能是:设置RTC时间日期初值,在RTC秒中断内使用串口打印出RTC日期和时间,D1指示灯闪烁提示系统运行。

程序框架如下:

(1)初始化RTC,设置RTC时间日期初值

(2)开启RTC的秒中断,编写RTC中断函数,

(3)在RTC中断内更新时间并打印输出

(4)编写主函数

main.c

#include "system.h"
#include "led.h"
#include "SysTick.h"
#include "usart.h"
#include "rtc.h"int main()
{u8 i=0;SysTick_Init(72);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断优先级分组LED_Init();USART1_Init(9600);RTC_Init();while(1){i++;if(i%20 ==0){led1=!led1;//LED1闪,用来指示主程序循环是否运行delay_ms(300);}}}

         rtc.c

#include "rtc.h"
#include "SysTick.h"
#include "system.h"
#include "usart.h"_calendar calendar;void RTC_NVIC_Confing()//RTC中断优先级配置函数
{NVIC_InitTypeDef NVIC_InitStructure;//设置中断优先级,使能中断通道NVIC_InitStructure.NVIC_IRQChannel=	RTC_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =2;NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);}void RTC_Get()
{u32 timedata =0;timedata=RTC_GetCounter();calendar.hour=timedata/3600;calendar.min=(timedata%3600)/60;calendar.sec=timedata%60;
}//初回1:初始化失败
//初回0:初始化成功
u8 RTC_Init() //有返回值是因为需要判断初始化是否成功
{u8 temp =0;RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);//使能电源时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP,ENABLE);//使能后备域时钟PWR_BackupAccessCmd(ENABLE);//打开后备寄存器访问if(BKP_ReadBackupRegister(BKP_DR1)!=0xA0A0)//后备寄存器有42个,都可以用来存放后备数据,这里选用第1个{BKP_DeInit();//复位备份区域,RCC_LSEConfig(RCC_LSE_ON);//开启外部低速振荡器while((RCC_GetFlagStatus(RCC_FLAG_LSERDY)==RESET)&&(temp<250)) //等待外部低速振荡ready{temp++;delay_ms(10);}if(temp>=250){return 1;}RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);//配置RTCC的时钟源为LSERCC_RTCCLKCmd(ENABLE);RTC_WaitForLastTask();//等待写操作完成RTC_WaitForSynchro();//等待时钟同步RTC_ITConfig(RTC_IT_SEC,ENABLE);//配置中断类型为秒中断并开启RTC_WaitForLastTask();//等待写操作完成		RTC_EnterConfigMode();// 允许配置RTC_SetPrescaler(32767);RTC_WaitForLastTask();//等待写操作完成		RTC_SetCounter(0xf73f);//初始化时间初值为17:34:55,计算方法是全部计算成秒,即17*3600+34*60+55=0xf73fRTC_ExitConfigMode();			BKP_WriteBackupRegister(BKP_DR1, 0xA0A0);//这样第二次开机时就不会进入上面的初始化了}else //第二次开机时走这里{RTC_WaitForSynchro();//等待时钟同步RTC_ITConfig(RTC_IT_SEC,ENABLE);//配置中断类型为秒中断并开启		RTC_WaitForLastTask();//等待写操作完成	}RTC_NVIC_Confing();RTC_Get();return 0;}void RTC_IRQHandler(void)
{if(RTC_GetITStatus(RTC_IT_SEC)!=RESET)//判断秒中断是否产生,如产生执行下面的语句{RTC_Get();printf("RTC Time:%d:%d:%d\r\n",calendar.hour,calendar.min,calendar.sec);}RTC_ClearITPendingBit(RTC_IT_SEC);//清除中断状态标志}

程序烧写到开发板,实验结果如下,实验是成功的。

                      

                  

         

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

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

相关文章

事务的特性-原子性(Atomicity)、一致性(Consistency)、隔离性(Asolation)、持久性(Durability)

一、引言 1、数据库管理系统DBMS为保证定义的事务是一个逻辑工作单元&#xff0c;达到引入事务的目的&#xff0c;实现的事务机制要保证事务具有原子性、一致性、隔离性和持久性&#xff0c;事务的这四个特性也统称为事务的ACID特性 2、当事务保持了ACID特性&#xff0c;才能…

【精选】数据治理项目实施(合集)06——数据标准在数据治理中的落地实践

导读 本文对数据标准管理进行了深入探讨。重点介绍了数据标准的定义&#xff0c;实施路线和具体标准定义的内容&#xff0c;并总结了企业开展数据标准管理面临的常见问题&#xff0c;由于编写的水平和时间有限&#xff0c; 难免有所纸漏&#xff0c; 欢迎大家批评指正。 在现实…

MyBatis-关联查询的对象是集合的处理

用户和角色之间是多对多的关系&#xff0c;也就是说&#xff0c;一个用户可以有多个角色与之绑定&#xff0c;所以在User对象中&#xff0c;角色的属性就必须是一个集合Set或者List&#xff0c;这里我们就用List集合在做例子&#xff1a; 1.怎么在Mybatis中实现关联的List集合对…

k8s流控平台apiserver详解

一、简单理解认识apiserver 1.主要功能 认证 鉴权 准入 mutating validating admission 限流 2.概念 apiserver保护etcd&#xff0c;缓存机制&#xff0c;有缓存直接返回&#xff0c;没缓存再去查看etcd,apiserver是担任和其他平台同信并认证 3.访问控制概览…

精益生产KPI指标分析与管理系统,助力企业挖掘数据黄金焕发第二生命线

智慧工厂精益生产追求以越来越少的投入获取越来越多的产出&#xff0c;通过消除浪费、提高效率来实现生产效益的最大化。精益生产强调量化管理&#xff0c;通过与KPI的结合&#xff0c;可以将生产过程中的关键数据进行量化和分析&#xff0c;推动企业各部门更加关注运营效率&am…

嵌入式Linux的浮点运算能力测试

嵌入式Linux的浮点运算能力测试 今天需要对一款ARM CPU的浮点数运算能力进行测试&#xff0c;采用了台式机上常用的SuperPI相同的原理&#xff1a;计算一定小数位数的圆周率来测试硬件的浮点数计算能力和稳定性。 首先下载计算软件的源代码&#xff0c;可以使用下面命令&#…

Excel 宏录制与VBA编程 —— 12、文本字符串类型相关(转换、拆分、分割、连接、替换、查找、“Like“)

字符串分割&#xff0c;文末示例&#xff08;文末代码3附有源码&#xff09; 代码1 - 基础字符串 代码2 - 字符串拆分 代码3 - 字符串分割 Option ExplicitSub WorkbooksClear()Dim DataRange As RangeSet DataRange Range("C2:E12")DataRange.Clear End SubSub Wo…

NetSuite 隐藏功能之Memorized Transactions记忆交易

本周功课结束&#xff0c;想说说Memorized Transactions这个有时会被忽略的功能&#xff0c;顾名思义&#xff0c;记忆交易就是可以将一个原始的Transaction在创建后进行“记忆”&#xff0c;以保证后续可以在固定日期&#xff08;周期性日期或者自定义日期&#xff09;产生“被…

CISCN--西南半决赛--pwn

1.vuln 这是主函数&#xff0c;数一下就发现可以溢出最后的0x4008d0 然后会执行到这里&#xff0c;逻辑就是在v0上写shellcode&#xff0c;不过执行写0x10&#xff0c;不够sh&#xff0c;很明显要先read。 以下是exp: from pwn import * context.archamd64 ioprocess(./vuln)…

一大波客户感谢信来袭,感谢认可!

“自美的置业数据中台项目启动以来&#xff0c;贵公司实施团队与服务运营始终以专业、敬业、合作的态度扎根用户、服务用户、与用户共成长。在此&#xff0c;我司表示由衷的感谢&#xff01;” 这是携手美的置业以来&#xff0c;我们收到的第二封客户感谢信。 △ 以上为美的置…

Windwos +vs 2022 编译openssl 1.0.2 库

一 前言 先说 结论&#xff0c;编译64位报错&#xff0c;查了一圈没找到解决方案&#xff0c;最后换了32位的。 使用qt访问web接口&#xff0c;因为是https&#xff0c;没有openssl库会报错 QNetworkReply* reply qobject_cast<QNetworkReply*>(sender());if (reply){…

《数据仓库与数据挖掘》 总复习

试卷组成 第一章图 第二章图 第三章图 第四章图 第五章图 第六章图 第九章图 第一章 DW与DM概述 &#xff08;特点、特性&#xff09; DB到DW 主要特征 &#xff08;1&#xff09;数据太多&#xff0c;信息贫乏&#xff08;Data Rich&#xff0c; Information Poor)。 &a…

2024最新美区TikTok选品全流程指南

打造TikTok爆款&#xff0c;3分靠运营&#xff0c;7分靠选品。 选择适合TikTok推广的商品至关重要&#xff0c;针对TikTok美区如何选品&#xff1f;怎么定价&#xff1f;SKU定多少&#xff1f; 本文总结出独家「美区TikTok选品全流程指南」方法论&#xff0c;说清楚选品最重要…

【项目一】全场景工业互联设备管理系统解决方案(PC上位机+中控+多传感器) 文章汇总

全场景工业互联设备管理系统解决方案(PC上位机中控多传感器) 配套硬件及资料 配套资料&#xff1a;https://pan.baidu.com/s/109e9Cr5nl-BWpct24Q6zOw?pwdroot 密码&#xff1a;root 交流论坛&#xff1a;https://forums.100ask.net/c/specialc/85 QQ交流群&#xff1a;865…

深入理解 XML 和 HTML 之间的区别

在现代网络技术的世界中&#xff0c;XML&#xff08;可扩展标记语言&#xff09;和 HTML&#xff08;超文本标记语言&#xff09; 是两个非常重要的技术。尽管它们都使用标签和属性的格式来描述数据&#xff0c;但它们在形式和用途上有显著的区别。 概述 什么是 XML&#xff…

告别 “屎山” 代码,务必掌握这14 个 SpringBoot 优化小妙招

插&#xff1a; AI时代&#xff0c;程序员或多或少要了解些人工智能&#xff0c;前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家(前言 – 人工智能教程 ) 坚持不懈&#xff0c;越努力越幸运&#xff0c;大家…

【论文阅读 Validation Free and Replication Robust Volume-based Data Valuation】

论文题目 免验证的对于复制鲁棒性的基于量的数据估值 1. 本文具体贡献 通过数据的体积形式化了数据多样性的度量&#xff0c;并在理论上和实证上证明了体积对数据估值的适用性&#xff1b;形式化了复制鲁棒性的概念&#xff0c;并设计了一种基于稳健体积&#xff08;RV&…

分布式服务测试各节点调用第三方服务连通性

背景&#xff1a;分布式部署 一个主节点往各个节点下发任务&#xff08;调用第三方服务&#xff09;&#xff0c;目的是为了测试各节点与第三方的连通性 思路&#xff1a; 主节点实现 创建Spring Boot项目&#xff1a;作为主节点的后端服务。 集成Eureka客户端&#xff1a;在…

Android 遥控器

遥控器源码 import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Path; import android.graphics.RadialGradient; import android.graphics.Region; import android.g…

个微API二次开发

通过 E云API 可以实现 个性化微信功能 &#xff08;例&#xff1a;营销系统、云发单助手、社群管家webot、客服系统等&#xff09;&#xff0c;用来自动管理微信消息。 可开发的功能包括但不限于&#xff1a; 好友管理&#xff1a; 添加好友、删除好友、修改备注、创建标签、获…