读写备份寄存器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

相关文章

10. 文件的读写

10.1 文本文件 操作文件三大类: ofstream:写操作ifstream:读操作fstream:读写操作 打开方式解释ios::in为了读文件而打开文件ios::out为了写文件而打开文件,如果当前文件存在则清空当前文件在写入ios::app追加方式写文件ios::trunc如果文件存在先删除,在创建ios::ate打开文件之后令读写位置移至文件尾端ios::binary二进制方式

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

【STM32】SPI通信-软件与硬件读写SPI

SPI通信-软件与硬件读写SPI 软件SPI一、SPI通信协议1、SPI通信2、硬件电路3、移位示意图4、SPI时序基本单元(1)开始通信和结束通信(2)模式0---用的最多(3)模式1(4)模式2(5)模式3 5、SPI时序(1)写使能(2)指定地址写(3)指定地址读 二、W25Q64模块介绍1、W25Q64简介2、硬件电路3、W25Q64框图4、Flash操作注意事项软件SPI读写W2

关于使用cspreadsheet读写EXCEL表格数据的问题

前几天项目有读写EXCEL表格的需求,我就找了大概有几种,大致分为:COM方法、ODBC方法、OLE方法、纯底层格式分析方法。由于COM方法要求必须安装有OFFICE的EXCEL组件,纯底层格式分析方法又很多功能需要自行去完善,所有最终选择了数据库的方法,用数据库的方法去存取xls格式的数据。网上有一个高手写的CSpreedSheet,看了一下提供的接口,感觉挺好用的。在使用的过程中发现几个

linux 内核提权总结(demo+exp分析) -- 任意读写(四)

hijack_modprobe_path篇 本文转自网络文章,内容均为非盈利,版权归原作者所有。 转载此文章仅为个人收藏,分享知识,如有侵权,马上删除。 原文作者:jmpcall 专栏地址:https://zhuanlan.kanxue.com/user-815036.htm     原理同hijack_prctl, 当用户执行错误格式的elf文件时内核调用call_usermod

linux 内核提权总结(demo+exp分析) -- 任意读写(三)

hijack_prctl篇 本文转自网络文章,内容均为非盈利,版权归原作者所有。 转载此文章仅为个人收藏,分享知识,如有侵权,马上删除。 原文作者:jmpcall 专栏地址:https://zhuanlan.kanxue.com/user-815036.htm   prctl函数: 用户态函数,可用于定制进程参数,非常适合和内核进行交互 用户态执行prctl函数后触发prctl系统

linux 内核提权总结(demo+exp分析) -- 任意读写(二)

hijack_vdso篇 本文转自网络文章,内容均为非盈利,版权归原作者所有。 转载此文章仅为个人收藏,分享知识,如有侵权,马上删除。 原文作者:jmpcall 专栏地址:https://zhuanlan.kanxue.com/user-815036.htm     vdso: 内核实现的一个动态库,存在于内核,然后映射到用户态空间,可由用户态直接调用 内核中的vdso如果被修改

linux 内核提权总结(demo+exp分析) -- 任意读写(一)

cred篇 本文转自网络文章,内容均为非盈利,版权归原作者所有。 转载此文章仅为个人收藏,分享知识,如有侵权,马上删除。 原文作者:jmpcall 专栏地址:https://zhuanlan.kanxue.com/user-815036.htm   每个线程在内核中都对应一个线程结构块thread_infothread_info中存在task_struct类型结构体 struct t

为备份驱动器制定备份计划:维护数据的3大方法

时间:2014-02-26 14:49 来源:网管之家 字体:[大 中 小]   您可能已经对您的电脑进行了备份,但其实这样还是远远不够的,其并非如您所认为的那样安全。您企业备份驱动器上的文件可能与您的主系统上的文件一样,容易受到灾难的影响。根据最近流行的恶意软件CryptoLocker的感染途径显示,连接到PC的外置驱动器——辅助硬盘驱动器,例如,用于备份的外部USB硬盘驱动器,可以像