首页 > 其他分享 >22_BKP备份寄存器&RTC实时时钟

22_BKP备份寄存器&RTC实时时钟

时间:2024-03-07 19:56:05浏览次数:17  
标签:MyRTC 22 RTC time OLED BKP Time

BKP备份寄存器&RTC实时时钟

BKP简介

image-20240306202613421

BKP基本结构

image-20240306231540821

一个数据寄存器存2字节

RTC简介

image-20240306232021063

image-20240307000643329

选LSE的32.768kHZ的时钟频率,因为支持VBAT供电

RTC框图

image-20240307000914341

RTC基本结构

image-20240307002601240

硬件电路

image-20240307002847010

供电方案

image-20240307005142467

RTC操作注意事项

image-20240307010110852

读写备份寄存器

接线图

image-20240307012022331

代码

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"


int main(void)
{
	OLED_Init();
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP,ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);
	
	PWR_BackupAccessCmd(ENABLE); //使能对BKP和RTC的访问
	
	BKP_WriteBackupRegister(BKP_DR1,0x1234);
	OLED_ShowHexNum(1,1,BKP_ReadBackupRegister(BKP_DR1),4);
	
	while(1)
	{
		
	}
}

RTC实时时钟

接线图

image-20240307154232991

代码

MyRTC.c

#include "stm32f10x.h"                  // Device header
#include <time.h>
#include "MyRTC.h"

uint16_t MyRTC_Time[]={2023,1,1,23,59,55};

void MyRTC_Init(void)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP,ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);
	
	PWR_BackupAccessCmd(ENABLE);
	
	if(BKP_ReadBackupRegister(BKP_DR1)!=0xA5A5)
	{
		RCC_LSEConfig(RCC_LSE_ON);
		while(RCC_GetFlagStatus(RCC_FLAG_LSERDY)!=SET);
		RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
		RCC_RTCCLKCmd(ENABLE);
		
		RTC_WaitForSynchro(); //等待同步
		RTC_WaitForLastTask(); //等待上一次写入操作完成
		
		RTC_SetPrescaler(32768-1); //分频
		RTC_WaitForLastTask();
		
		MyRTC_SetTime();
		
		BKP_WriteBackupRegister(BKP_DR1,0xA5A5);
	}
	else
	{
		RTC_WaitForSynchro(); //等待同步
		RTC_WaitForLastTask(); //等待上一次写入操作完成
	}
}

void MyRTC_SetTime(void)
{
	time_t time_cnt;
	struct tm time_date;
	time_date.tm_year=MyRTC_Time[0]-1900;
	time_date.tm_mon=MyRTC_Time[1]-1;
	time_date.tm_mday=MyRTC_Time[2];
	time_date.tm_hour=MyRTC_Time[3];
	time_date.tm_min=MyRTC_Time[4];
	time_date.tm_sec=MyRTC_Time[5];
	
	time_cnt=mktime(&time_date); //秒数
	
	RTC_SetCounter(time_cnt-8*60*60);
	RTC_WaitForLastTask();
}

void MyRTC_ReadTime(void)
{
	time_t time_cnt;
	struct tm time_date;
	
	time_cnt=RTC_GetCounter()+8*60*60; //转成北京时区
	
	time_date=*localtime(&time_cnt);
	
	MyRTC_Time[0]=time_date.tm_year+1900;
	MyRTC_Time[1]=time_date.tm_mon+1;
	MyRTC_Time[2]=time_date.tm_mday;
	MyRTC_Time[3]=time_date.tm_hour;
	MyRTC_Time[4]=time_date.tm_min;
	MyRTC_Time[5]=time_date.tm_sec;
	
}

MyRTC.h

#ifndef __MYRTC_H__
#define __MYRTC_H__

extern uint16_t MyRTC_Time[];

void MyRTC_Init(void);
void MyRTC_SetTime(void);
void MyRTC_ReadTime(void);

#endif

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "MyRTC.h"

int main(void)
{
	OLED_Init();
	MyRTC_Init();
	OLED_ShowString(1,1,"Data:xxxx-xx-xx");
	OLED_ShowString(2,1,"Time:xx:xx:xx");
	OLED_ShowString(3,1,"CNT :");
	OLED_ShowString(4,1,"DIV :");
	while(1)
	{
		MyRTC_ReadTime();
		OLED_ShowNum(1,6,MyRTC_Time[0],4);
		OLED_ShowNum(1,11,MyRTC_Time[1],2);
		OLED_ShowNum(1,14,MyRTC_Time[2],2);
		OLED_ShowNum(2,6,MyRTC_Time[3],2);
		OLED_ShowNum(2,9,MyRTC_Time[4],2);
		OLED_ShowNum(2,12,MyRTC_Time[5],2);
		OLED_ShowNum(3,6,RTC_GetCounter(),10);
		OLED_ShowNum(4,6,RTC_GetDivider(),10);
	}
}

标签:MyRTC,22,RTC,time,OLED,BKP,Time
From: https://www.cnblogs.com/mzx233/p/18059631

相关文章

  • 「NOI Online 2022 入门组」赛后总结
    前言如有笔误和错误,欢迎给位dalao指出。赛时游记14.00开始下载题目。14.02打开题目。14.02~14.30看第一题,发现就是一个循环结构+选择结构,秒切+检查。14.31~16.30打开第二题,直觉想到由于\(gcd\)以及那个\(z=x\timesy\times\gcd(x,y)\)等式,就开始分解质因数,......
  • ABC221H Count Multiset
    [ABC221H]CountMultiset以下内容多引用自[1]对应的文章分拆数表示将正整数\(N\)拆成若干正整数和的方案数\(P_N\),可以形式化的表示成以下方程的解的个数\[x_1+x_2+...+x_m=N,1\lex_1\lex_2\le...\lex_m\]其中我们通常将每个正整数\(x_i\)称......
  • AT_abc222_f [ABC222F] Expensive Expense 题解
    分析没脑子的题目。一眼换根DP。定义\(\mathit{f}_{i}\)表示\(i\)到\(i\)为根子树中某一个节点的距离最大值;\(\mathit{g}_{i}\)表示\(i\)经过其父节点到某个节点的距离最大值。那答案就是\(\max(\mathit{f}_i,\mathit{g}_i)\)。考虑转移。\(\mathit{f}_i\)的转移很......
  • CF1223F Stack Exterminable Arrays 题解
    分析接着这个说。现在我们需要优化\(\mathit{nxt}_{i}\)。重新定义一下,\(\mathit{nxt}_{i,j}\)表示在后\(i\)个数中,\(j\)第一次出现的位置,且\([i+1,\mathit{nxt}_{i+1,a_i}-1]\)是一个合法串。这玩意很像一个DP,所以完全可以按照DP的转移思路转移:\(\mathit{nxt}_{i,j}=......
  • P9757 [COCI2022-2023#3] Dirigent 题解
    分析对于一个从小到大(按编号排序)的长度为\(n\)的序列\(A\),有性质:相邻两个数之差的绝对值为\(1\)的数量为\(n-1\)。那么,对于这道题,能使环剪开一条边使其按编号排序,必有相邻两个\(i,j\),满足\((A_i-A_j=1)\)的数量为\(n-1\)。注意,因为这是个环,所以\(i,j\)大小关系不能......
  • CANape 22.0惊艳亮相!全面升级的新特性引领汽车测试技术飞跃!
    大家好!近日,备受期待的CANape软件迎来了全新的版本——CANape22.0!作为汽车测试领域的重要工具,CANape一直以其强大的功能和稳定的性能备受赞誉。而这次的CANape22.0版本带来了一系列令人瞩目的重要更新,为汽车测试技术迈上了一个新的台阶提供助力。现在,让我们一起来揭开CANape22.0......
  • CSP认证2022.12 452分题解
    A、现值计算题解题目简单易懂,直接写就行了。importmathn,i=map(float,input().split())n=int(n)a=list(map(int,input().split()))ans=0.00forjinrange(n+1):ans=ans+math.pow(1+i,-j)*a[j]print(ans)B、训练计划题解显然是个......
  • 2252309------对飞机(航空)订票系统(C语言)进行逆向学习、分析、思考、设计构思、改进....
    **飞机订票系统**一、资料来源CSDN博主吴朋奉阅读量最高的一篇博文--飞机订票系统(C语言)----https://blog.csdn.net/weixin_47774641/article/details/111398063?spm=1001.2014.3001.5506二、运行环境Windows11+DEVC++三、源代码(来自博主吴朋奉)......
  • VS 2022支持 .NET Framework 4.5的方法
    默认VisualStudio2022不再支持安装.NETFramework4.5组件不想装vs2019,你可以尝试如下办法:1.nuget下载4.5安装包嫌官网下载慢的可以从下方下载.net4.5https://pan.xunlei.com/s/VNsIXaGlTDlArzgWx_sYmy7tA1?pwd=s339#提取码:s339.net4.5.1https://pan.xunlei.com/s/......
  • WEBRTC 局域网 自己搭建信令服务 实现视频通讯
    信令服务constapp=require('express')();constwsInstance=require('express-ws')(app);app.ws('/',ws=>{ ws.on('message',data=>{ wsInstance.getWss().clients.forEach(server=>{ if(server!==ws)......