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的时钟源为LSE
				RCC_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=0xf73f
				RTC_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.mfbz.cn/a/752351.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024年Nano编辑器最新使用教程

Nano在大多数Linux发行版中找到&#xff0c;易于使用&#xff0c;其最常用的命令显示在其屏幕底部。 作为编辑配置和其他文件是Linux中的一种普遍的任务&#xff0c;知道如何使用该程序是否可以非常有用。Nano编辑器以及如何使用Nano编辑器在服务器上编辑文件是我们将在本指南中…

【Sklearn-LR驯化】一文搞懂分类基石模型-逻辑回归使用总结

【Sklearn-驯化】一文搞懂分类基石模型-逻辑回归使用总结 本次修炼方法请往下查看 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合&#xff0c;智慧小天地&#xff01; &#x1f387; 免费获取相关内容文档关注&#xf…

第 3 章使用图像和标签

现在您已经对 SwiftUI 有了基本的了解,并了解了如何显示文本内容,现在是时候学习如何在应用中显示图像了。在本章中,我们将探讨Label最常见的用户界面组件之一的用法,以及Image用于在屏幕上渲染图像的视图。与上一章中所做的类似,我将通过构建一个简单的演示向您展示如何使…

Spring项目报错解读与全部报错详解

你好,我是Qiuner. 为帮助别人少走弯路和记录自己编程学习过程而写博客 这是我的 github https://github.com/Qiuner ⭐️ ​ gitee https://gitee.com/Qiuner &#x1f339; 如果本篇文章帮到了你 不妨点个赞吧~ 我会很高兴的 &#x1f604; (^ ~ ^) 想看更多 那就点个关注吧 我…

基于改进天鹰优化算法(IAO)优化BP神经网络数据回归预测 (IAO-BP)的数据回归预测(多输入多输出)

改进天鹰优化算法(IAO)见&#xff1a;【智能优化算法】改进的AO算法(IAO)-CSDN博客 代码原理 改进天鹰优化算法&#xff08;Improved Eagle Optimization, IAO&#xff09;是一种元启发式优化算法&#xff0c;结合了鹰优化算法&#xff08;Optimization Algorithm, OA&#x…

chrome 配置允许跨域

目录 1.Chrome跨域插件配置 1.1启动插件 1.2. 设置本地调试跨域 2 Firefox跨域插件 2.1. 安装插件 CORS Everywhere 2.2. 启动插件 3 工具下载链接 1.Chrome跨域插件配置 使用chrome插件“Allow CORS: Access-Control-Allow-origin ”来解决跨域问题。 点击pin图标&…

【uml期末复习】统一建模语言大纲

前言&#xff1a; 关于uml的期末复习的常考知识点&#xff0c;可能对你们有帮助&#x1f609; 目录 第一部分 概念与基础 第一章 面向对象技术 第二章 统一软件过程 第三章 UML概述 第四章 用例图 第五章 类图 第六章 对象图 第七章 顺序图 第八章 协作图 第九章 状态…

正版软件 | WIFbox:智能化文件管理工具,让效率与隐私并行

在数字化办公日益普及的今天&#xff0c;文件管理成为了提升工作效率的关键。WIFbox 一款智能文件管理工具&#xff0c;利用强大的人工智能技术&#xff0c;帮助您快速对文件进行分类&#xff0c;完成复杂的智能文件分类任务。 智能分类&#xff0c;效率倍增 WIFbox 通过精细化…

深度学习论文: Separable Self-attention for Mobile Vision Transformers

深度学习论文: Separable Self-attention for Mobile Vision Transformers Separable Self-attention for Mobile Vision Transformers PDF:https://arxiv.org/pdf/2206.02680 PyTorch: https://github.com/shanglianlm0525/PyTorch-Networks 1 概述 MobileViT是一种融合了CN…

拳打开源SOTA脚踢商业闭源的LI-DiT是怎样炼成的?(商汤/MMLab/上海AI Lab)

文章地址&#xff1a;https://arxiv.org/pdf/2406.11831 仅基于解码器的 Transformer 的大语言模型&#xff08;LLMs&#xff09;与 CLIP 和 T5 系列模型相比&#xff0c;已经展示出卓越的文本理解能力。然而&#xff0c;在文本到图像扩散模型中利用当前先进的大语言模型的范例…

第2章.现场设备的物联网模式--设备网关

第2章.现场设备的物联网模式 本章列出了与现场设备或事物相关的关键模式。阅读本章后&#xff0c;您将能够识别物联网架构中这些模式的存在。它提供了有关模式适合或适用的场景的详细信息&#xff0c;以及需要考虑的约束。这将帮助您相对轻松地理解现有的物联网架构。 本章涵盖…

基于springboot实现商业辅助决策系统项目【项目源码+论文说明】

基于springboot实现商业辅助决策系统演示 摘要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统收支信息和销售订…

展厅设计要合格需满足哪些要求

1、方案的确定 在企业中想做一个合格的展厅那就得找一家展厅设计公司&#xff0c;制定展厅设计的大概方案、展厅的主题、展厅想要呈现的效果&#xff0c;这些都要进行方案论证&#xff0c;经过展厅设计公司对实地情况充分的了解&#xff0c;就会最终达成呈现的方案。 2、展厅的…

Linux系统应用与设置(3):串口调试(minicom)

目录 1. 简述 2. 安装minicom 3. 配置串口参数 4. 打开相应的通信端口 5. 设置 6. 发送字符数据 7. 发送HEX&#xff08;十六进制&#xff09; 1. 简述 在Linux系统中&#xff0c;minicom是一个功能强大的串口通信工具&#xff0c;可用于与外部设备进行字符和HEX数据的收…

脑电微状态与睡眠慢波

摘要 目的&#xff1a;微状态是半稳定的电压拓扑图&#xff0c;它能够解释静息态EEG地形图的大部分差异。然而&#xff0c;白天时间和睡眠对微状态的影响尚未得到检验。为了填补这一空白&#xff0c;本研究评估了在健康参与者中&#xff0c;晚上和早晨之间的微状态是否不同&am…

模拟实现string【C++】

文章目录 全部的实现代码放在了文章末尾准备工作包含头文件定义命名空间和类类的成员变量 构造函数默认构造拷贝构造 重载赋值拷贝函数析构函数迭代器和获取迭代器迭代器获取迭代器 resize【调整size】图解 reserve【调整capacity】empty【判断串是否为空】operator[]appendpus…

【yolov8系列】ubuntu上yolov8的开启训练的简单记录

前言 yolov8的广泛使用&#xff0c;拉取yolov8源码工程&#xff0c;然后配置环境后直接运行&#xff0c;初步验证自己数据的检测效果&#xff0c;在数据集准备OK的情况下 需要信手拈来&#xff0c;以保证开发过程的高效进行。 本篇博客更注意为了方便自己使用时参考。顺便也记录…

万物皆可爬——亮数据代理IP+Python爬虫批量下载百度图片助力AI训练

&#x1f482; 个人网站:【 摸鱼游戏】【神级代码资源网站】【导航大全】&#x1f91f; 一站式轻松构建小程序、Web网站、移动应用&#xff1a;&#x1f449;注册地址&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交…

AI小白使用Macbook Pro安装llama3与langchain初体验

1. 背景 AI爆火了2年有余&#xff0c;但我仍是一个AI小白&#xff0c;最近零星在学&#xff0c;随手记录点内容供自己复习。 上次在Macbook Pro上安装了Stable Diffusion&#xff0c;体验了本地所心所欲地生成各种心仪的图片&#xff0c;完全没有任何限制的惬意。今天想使用M…

从@Param注解开始,深入了解 MyBatis 参数映射的原理

系列文章目录 MyBatis缓存原理 Mybatis plugin 的使用及原理 MyBatisSpringboot 启动到SQL执行全流程 数据库操作不再困难&#xff0c;MyBatis动态Sql标签解析 Mybatis的CachingExecutor与二级缓存 使用MybatisPlus还是MyBaits &#xff0c;开发者应该如何选择&#xff1f; 巧…