读写备份寄存器BKP与实时时钟RTC

2024-05-10 17:28

本文主要是介绍读写备份寄存器BKP与实时时钟RTC,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 读写备份寄存器
    • 接线图
    • 代码
  • RTC实时时钟
    • 接线图
    • 代码


读写备份寄存器

接线图

即接个3.3v的电源到VBT引脚
在这里插入图片描述

代码

代码效果:第一次写入备份寄存器,下载程序后再注释掉,再进行下载,之前写入的数据还会保存在备份寄存器中(还可以读到),并且复位键或拔掉主电源再插上数据也不会丢失,直到主电源备用电源同时不能供电数据才会消失

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"uint16_t Data;
int main(void)
{OLED_Init();OLED_ShowChar(1,1,'z');// 打开PWR,BKP时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP,ENABLE);// 使能PWRPWR_BackupAccessCmd(ENABLE);// 写备份寄存器//BKP_WriteBackupRegister(BKP_DR1,0X1234);// 读取备份寄存器Data = BKP_ReadBackupRegister(BKP_DR1);OLED_ShowHexNum(2,1,Data,4);while (1){}
}

RTC实时时钟

接线图

在这里插入图片描述

代码

对RTC进行配置,保存于ThisRTC.c

#include "stm32f10x.h"                  // Device header
#include <time.h>
struct ThisRTC_Time{uint16_t year;		// 年uint8_t month;		// 月uint8_t day;		// 日uint8_t hour;		// 时uint8_t min;		// 分uint8_t sec;		// 秒	
};
extern struct ThisRTC_Time ThisRTC_Time1;void ThisRTC_Init(void){// 打开PWR,BKP时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP,ENABLE);// 使能PWRPWR_BackupAccessCmd(ENABLE);// 如果备份寄存器数据丢失则重新初始化if(BKP_ReadBackupRegister(BKP_DR1) != 0X9999){// 启动LSE时钟源RCC_LSEConfig(RCC_LSE_ON);// 等待LSE启动完成while(RCC_GetFlagStatus(RCC_FLAG_LSERDY)!=SET);// 选择RTC时钟源为LSERCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);// 使能RTC时钟RCC_RTCCLKCmd(ENABLE);// 等待同步RTC_WaitForSynchro();// 等待上一步写操作完成RTC_WaitForLastTask();// 配置分频系数,自动进入配置模式并退出RTC_SetPrescaler(32768-1);// 等待上一步写操作完成RTC_WaitForLastTask();void ThisRTC_SetTime(void);ThisRTC_SetTime();// 写入备份寄存器BKP_WriteBackupRegister(BKP_DR1,0X9999);}else{// 等待同步RTC_WaitForSynchro();// 等待上一步写操作完成RTC_WaitForLastTask();}}void ThisRTC_SetTime(void){time_t time_cnt;struct tm time_date;time_date.tm_year = ThisRTC_Time1.year - 1900;time_date.tm_mon = ThisRTC_Time1.month - 1;time_date.tm_mday = ThisRTC_Time1.day;time_date.tm_hour = ThisRTC_Time1.hour;time_date.tm_min = ThisRTC_Time1.min;time_date.tm_sec = ThisRTC_Time1.sec;// 将日期类型转换为秒计数器类型,并设置为RTC时间time_cnt = mktime(&time_date) - 8 * 60 * 60;RTC_SetCounter(time_cnt);// 等待上一步写操作完成RTC_WaitForLastTask();
}void ThisRTC_ReadTime(void){time_t time_cnt;struct tm time_date;time_cnt = RTC_GetCounter() + 8 * 60 * 60;	// 加时区偏移变为北京时间time_date = *localtime(&time_cnt);ThisRTC_Time1.year = time_date.tm_year + 1900;ThisRTC_Time1.month = time_date.tm_mon + 1;ThisRTC_Time1.day = time_date.tm_mday;ThisRTC_Time1.hour = time_date.tm_hour;ThisRTC_Time1.min = time_date.tm_min;ThisRTC_Time1.sec = time_date.tm_sec;
}

头文件ThisRTC.h声明

#ifndef __THISRTC_H
#define __THISRTC_H
// 存放时间结构体
struct ThisRTC_Time{uint16_t year;	// 年uint8_t month;	// 月uint8_t day;		// 日uint8_t hour;		// 时uint8_t min;		// 分uint8_t sec;		// 秒	
};
struct ThisRTC_Time ThisRTC_Time1 = {2024,10,27,5,2,0};void ThisRTC_Init(void);
void ThisRTC_SetTime(void);
void ThisRTC_ReadTime(void);#endif

主函数内容

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "ThisRTC.h"int main(void)
{OLED_Init();ThisRTC_Init();OLED_ShowString(1,1,"Date:XXXX-XX-XX");OLED_ShowString(2,1,"Time:XX:XX:XX");OLED_ShowString(3,1,"CNT :");OLED_ShowString(4,1,"DIV :");while (1){ThisRTC_ReadTime();OLED_ShowNum(1,6,ThisRTC_Time1.year,4);OLED_ShowNum(1,11,ThisRTC_Time1.month,2);OLED_ShowNum(1,14,ThisRTC_Time1.day,2);OLED_ShowNum(2,6,ThisRTC_Time1.hour,2);OLED_ShowNum(2,9,ThisRTC_Time1.min,2);OLED_ShowNum(2,12,ThisRTC_Time1.sec,2);OLED_ShowNum(3,6,RTC_GetCounter(),10);OLED_ShowNum(4,6,RTC_GetDivider(),6);		// 余数寄存器}
}

这篇关于读写备份寄存器BKP与实时时钟RTC的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/977091

相关文章

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

使用Python实现网络设备配置备份与恢复

《使用Python实现网络设备配置备份与恢复》网络设备配置备份与恢复在网络安全管理中起着至关重要的作用,本文为大家介绍了如何通过Python实现网络设备配置备份与恢复,需要的可以参考下... 目录一、网络设备配置备份与恢复的概念与重要性二、网络设备配置备份与恢复的分类三、python网络设备配置备份与恢复实

Redis中高并发读写性能的深度解析与优化

《Redis中高并发读写性能的深度解析与优化》Redis作为一款高性能的内存数据库,广泛应用于缓存、消息队列、实时统计等场景,本文将深入探讨Redis的读写并发能力,感兴趣的小伙伴可以了解下... 目录引言一、Redis 并发能力概述1.1 Redis 的读写性能1.2 影响 Redis 并发能力的因素二、

基于Canvas的Html5多时区动态时钟实战代码

《基于Canvas的Html5多时区动态时钟实战代码》:本文主要介绍了如何使用Canvas在HTML5上实现一个多时区动态时钟的web展示,通过Canvas的API,可以绘制出6个不同城市的时钟,并且这些时钟可以动态转动,每个时钟上都会标注出对应的24小时制时间,详细内容请阅读本文,希望能对你有所帮助...

mysql8.0无备份通过idb文件恢复数据的方法、idb文件修复和tablespace id不一致处理

《mysql8.0无备份通过idb文件恢复数据的方法、idb文件修复和tablespaceid不一致处理》文章描述了公司服务器断电后数据库故障的过程,作者通过查看错误日志、重新初始化数据目录、恢复备... 周末突然接到一位一年多没联系的妹妹打来电话,“刘哥,快来救救我”,我脑海瞬间冒出妙瓦底,电信火苲马扁.

Rsnapshot怎么用? 基于Rsync的强大Linux备份工具使用指南

《Rsnapshot怎么用?基于Rsync的强大Linux备份工具使用指南》Rsnapshot不仅可以备份本地文件,还能通过SSH备份远程文件,接下来详细介绍如何安装、配置和使用Rsnaps... Rsnapshot 是一款开源的文件系统快照工具。它结合了 Rsync 和 SSH 的能力,可以帮助你在 li

SQL Server使用SELECT INTO实现表备份的代码示例

《SQLServer使用SELECTINTO实现表备份的代码示例》在数据库管理过程中,有时我们需要对表进行备份,以防数据丢失或修改错误,在SQLServer中,可以使用SELECTINT... 在数据库管理过程中,有时我们需要对表进行备份,以防数据丢失或修改错误。在 SQL Server 中,可以使用 SE

Python实现高效地读写大型文件

《Python实现高效地读写大型文件》Python如何读写的是大型文件,有没有什么方法来提高效率呢,这篇文章就来和大家聊聊如何在Python中高效地读写大型文件,需要的可以了解下... 目录一、逐行读取大型文件二、分块读取大型文件三、使用 mmap 模块进行内存映射文件操作(适用于大文件)四、使用 pand

C# 读写ini文件操作实现

《C#读写ini文件操作实现》本文主要介绍了C#读写ini文件操作实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录一、INI文件结构二、读取INI文件中的数据在C#应用程序中,常将INI文件作为配置文件,用于存储应用程序的

C#实现文件读写到SQLite数据库

《C#实现文件读写到SQLite数据库》这篇文章主要为大家详细介绍了使用C#将文件读写到SQLite数据库的几种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下... 目录1. 使用 BLOB 存储文件2. 存储文件路径3. 分块存储文件《文件读写到SQLite数据库China编程的方法》博客中,介绍了文