32RTCBKP

目录

一.时间戳

二.BKP简介 

三.RTC外设简介 

​编辑四.相关寄存器 

五.相关函数

 六.代码实现

(1)读写备份寄存器

(2)实时时钟


一.时间戳

最早在Unix系统上使用 

Linux,Windos,安卓的底层计时系统

好处:

1.简化硬件电路,直接采样一个秒寄存器来进行存储

2.在进行一些时间间隔的计算时非常方便

3.存储较方便,一个变量即可

但比较占用软件资源,需要进行秒分时年月日计算

STM32内部定义的变量、是一个无符号的32为整形数据,可以持续到2106年

每次产生闰秒时,时间戳的时间和标准时间会产生一秒的偏差

 

二.BKP简介 

后备寄存器 

VBAT(V Battery)备用电池电源

TAMPER引脚,对应PC-13-TAMPER-RTC,对应PC13引脚,可以用于设计侵入检测功能

校准时钟可以对内部RTC微小误差进行校准,可以配合校准寄存器

闹钟脉冲或者秒脉冲,可以输出为其他设备提供信号

三.RTC外设简介 

在51中,DS1302是外设的 RTC芯片,可以进行独立计时

而在STM32内部,具有RTC外设

高速时钟供内部程序运行和主要外设使用

低速时钟供RTC,看门狗使用,LSE时钟为了省电默认是关闭的

四.相关寄存器 

设计成16位可以简化电路设计

 

五.相关函数

BKP

void BKP_TamperPinLevelConfig(uint16_t BKP_TamperPinLevel);//高低电平是否触发TAMPER侵入检测功能
void BKP_TamperPinCmd(FunctionalState NewState);//是否开启TAMPER侵入检测功能
void BKP_ITConfig(FunctionalState NewState);//是否开启中断
void BKP_RTCOutputConfig(uint16_t BKP_RTCOutputSource);//RTC时钟输出功能配置
void BKP_SetRTCCalibrationValue(uint8_t CalibrationValue);//设置RTC校准值
void BKP_WriteBackupRegister(uint16_t BKP_DR, uint16_t Data);//写备份寄存器
uint16_t BKP_ReadBackupRegister(uint16_t BKP_DR);//读备份寄存器
FlagStatus BKP_GetFlagStatus(void);
void BKP_ClearFlag(void);
ITStatus BKP_GetITStatus(void);
void BKP_ClearITPendingBit(void);

PWR

void PWR_BackupAccessCmd(FunctionalState NewState);//备份寄存器使能,设置DBP

rcc.h 

void RCC_LSEConfig(uint8_t RCC_LSE);//配置LSE外部低速时钟
void RCC_LSICmd(FunctionalState NewState);//配置LSI内部低速时钟
void RCC_RTCCLKConfig(uint32_t RCC_RTCCLKSource);//选择时钟源
void RCC_RTCCLKCmd(FunctionalState NewState);//使能FlagStatus RCC_GetFlagStatus(uint8_t RCC_FLAG);//LSE启动标志位

 rtc.h

void RTC_ITConfig(uint16_t RTC_IT, FunctionalState NewState);
void RTC_EnterConfigMode(void);//进入配置模式,设置CNF位
void RTC_ExitConfigMode(void);//退出配置模式,将CNF位清零
uint32_t  RTC_GetCounter(void);//获取CNT计数器值
void RTC_SetCounter(uint32_t CounterValue);//写入CNT计数器值
void RTC_SetPrescaler(uint32_t PrescalerValue);//写入预分频器(PRL)
void RTC_SetAlarm(uint32_t AlarmValue);//写入闹钟值
uint32_t  RTC_GetDivider(void);//读取预分频器中的DIV余数寄存器,可以获取比秒更加精确的时间
void RTC_WaitForLastTask(void);//等待上次操作的完成,等待RTOFF为1
void RTC_WaitForSynchro(void);//等待同步,RSF为1
FlagStatus RTC_GetFlagStatus(uint16_t RTC_FLAG);
void RTC_ClearFlag(uint16_t RTC_FLAG);
ITStatus RTC_GetITStatus(uint16_t RTC_IT);
void RTC_ClearITPendingBit(uint16_t RTC_IT);

 六.代码实现

(1)读写备份寄存器

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"  
#include "OLED.h" 
#include "Key.h"
uint16_t ArrayWrite[] = {0x1234,0x5678};
uint16_t ArrayRead[2];
uint8_t Num;int main(void)
{OLED_Init();Key_Init();RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP,ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);PWR_BackupAccessCmd(ENABLE);OLED_ShowString(1,1,"W:");OLED_ShowString(2,1,"R:");while(1){Num = Keynum();if(Num == 1){ArrayWrite[0]++;ArrayWrite[1]++;BKP_WriteBackupRegister(BKP_DR1,ArrayWrite[0]);BKP_WriteBackupRegister(BKP_DR2,ArrayWrite[1]);OLED_ShowHexNum(1,3,ArrayWrite[0],4);OLED_ShowHexNum(1,8,ArrayWrite[1],4);ArrayRead[0] = BKP_ReadBackupRegister(BKP_DR1);ArrayRead[1] = BKP_ReadBackupRegister(BKP_DR2);			}OLED_ShowHexNum(2,3,ArrayRead[0],4);OLED_ShowHexNum(2,8,ArrayRead[1],4);}	
}

(2)实时时钟

MyRTC.c

#include "stm32f10x.h"                  // Device header
#include <time.h>
uint16_t Mytime[6] = {2024,2,20,23,59,55};void MyRTC_SET(void);void MyRTC_Init(void)
{RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP,ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);PWR_BackupAccessCmd(ENABLE);if(BKP_ReadBackupRegister(BKP_DR1) != 0x12){RCC_LSEConfig(RCC_LSE_ON);while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) != SET);RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);//需要选择LSE时钟RCC_RTCCLKCmd(ENABLE);RTC_WaitForLastTask();RTC_WaitForSynchro();RTC_SetPrescaler(32768 - 1);RTC_WaitForLastTask();MyRTC_SET();BKP_WriteBackupRegister(BKP_DR1,0x12);}else{RTC_WaitForLastTask();RTC_WaitForSynchro();}}
void MyRTC_SET(void)//输入北京时间,转化为伦敦时间
{time_t time_cnt;struct tm time_st;time_st.tm_year =Mytime[0]-1900;time_st.tm_mon =Mytime[1]-1;time_st.tm_mday = Mytime[2];time_st.tm_hour =Mytime[3];time_st.tm_min = Mytime[4];time_st.tm_sec =Mytime[5] ;time_cnt = mktime(&time_st) - 8*60*60;RTC_SetCounter(time_cnt);RTC_WaitForLastTask();
}
void MyRTC_READ(void)//读取伦敦时间,转换为北京时间
{time_t time_cnt;struct tm time_st;time_cnt = RTC_GetCounter() + 8*60*60;time_st = *localtime(&time_cnt);Mytime[0]=time_st.tm_year+1900;Mytime[1]=time_st.tm_mon+1;Mytime[2]=time_st.tm_mday;Mytime[3]=time_st.tm_hour;Mytime[4]=time_st.tm_min;Mytime[5]=time_st.tm_sec;}

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,"    -  -  ");OLED_ShowString(2,1,"  :  :  ");OLED_ShowString(3,1,"CNT:");OLED_ShowString(4,1,"DIV:");while(1){MyRTC_READ();OLED_ShowNum(1,1,Mytime[0],4);OLED_ShowNum(1,6,Mytime[1],2);OLED_ShowNum(1,10,Mytime[2],2);OLED_ShowNum(2,1,Mytime[3],2);OLED_ShowNum(2,4,Mytime[4],2);OLED_ShowNum(2,7,Mytime[5],2);OLED_ShowNum(3,5,RTC_GetCounter(),10);OLED_ShowNum(4,5,(32767-RTC_GetDivider())/32767.0*999,10);//需要加上小数点//可以读取DIV,对其进行线性变换,读取任意时刻的毫秒}	
}

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

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

相关文章

c++的类型转换方法

一、静态类型转换&#xff08;static_cast&#xff09; 静态类型的转换主要用于基本类型之间的转换&#xff0c;比如int类型转换为double类型。但是static_cast也可以支持上下行的转换&#xff08;存在继承关系之间的转换&#xff09; 基本类型之间的转换举例 上下行转换的举…

《Docker 简易速速上手小册》第8章 Docker 在企业中的应用(2024 最新版)

文章目录 8.1 Docker 在开发环境中的应用8.1.1 重点基础知识8.1.2 重点案例&#xff1a;Python Web 应用开发环境8.1.3 拓展案例 1&#xff1a;Python 数据分析环境8.1.4 拓展案例 2&#xff1a;Python 自动化测试环境 8.2 Docker 在生产环境的实践8.2.1 重点基础知识8.2.2 重点…

174基于matlab的雷达数字信号处理

基于matlab的雷达数字信号处理。该程序具备对雷达目标回波的处理能力&#xff0c;能够从噪声中将目标检测出来&#xff0c;并提取目标的距离、速度、角度信息。有相应的试验文档。程序已调通&#xff0c;可直接运行。 174 雷达数字信号处理 目标检测出来 (xiaohongshu.com)

STM32单片机基本原理与应用(八)

温度传感器实验 实验内容&#xff1a; 单片机通过代码模拟1-Wire总线并对DS18B20进行读写&#xff0c;并在TFTLCD屏幕上显示当前实时温度。 电路原理图&#xff1a; 1-Wire总线 1-Wire总线&#xff1a;即单总线协议&#xff0c;采用单根信号线&#xff0c;既传输时钟&#…

高等数学(无穷小与无穷大)

目录 一、无穷小 二、无穷大 三、无穷小与无穷大的关系 四、无穷小量的阶的比较 一、无穷小 二、无穷大 三、无穷小与无穷大的关系 四、无穷小量的阶的比较

直接写就行!EI顶刊组合:多能源微网/综合能源系统两阶段鲁棒优化配置方法代码!

适用平台&#xff1a;MatlabYalmipCplex 参考文献&#xff1a; 《考虑机组禁止运行区间的含风电鲁棒机组组合》-中国电机工程学报 《微电网两阶段鲁棒优化经济调度方法》-中国电机工程学报 程序提出了微电网中电源容量的两阶段鲁棒优化配置模型&#xff0c;第一阶段主要决策…

Swift Combine 使用 handleEvents 操作符调试管道 从入门到精通二十五

Combine 系列 Swift Combine 从入门到精通一Swift Combine 发布者订阅者操作者 从入门到精通二Swift Combine 管道 从入门到精通三Swift Combine 发布者publisher的生命周期 从入门到精通四Swift Combine 操作符operations和Subjects发布者的生命周期 从入门到精通五Swift Com…

LemonSqueezy

信息收集 # nmap -sn 192.168.1.0/24 -oN live.nmap Starting Nmap 7.94 ( https://nmap.org ) at 2024-02-08 11:22 CST Nmap scan report for 192.168.1.1 Host is up (0.00037s latency). MAC Address: 00:50:56:C0:00:08 (VMware) Nmap scan r…

人工智能聊天机器人如何帮助您实现工作与生活的平衡

如何用AI聊天机器人实现高效工作生活平衡 工作与生活平衡是管理个人和职业生活需求和责任的能力。 在当今快节奏和竞争激烈的世界中&#xff0c;工作与生活平衡被视为一个理想的目标。然而&#xff0c;对于忙碌的专业人士来说&#xff0c;实现工作与生活的平衡可能具有挑战性&a…

LeetCode刷题---LRU缓存

LRU LRU是Least Recently Used的缩写&#xff0c;即最近最少使用&#xff0c;是一种内存管理算法&#xff0c;也可以用作缓存淘汰策略。 这种算法的核心思想是&#xff1a;如果数据最近被访问过&#xff0c;那么将来被访问的几率也更高。 因此&#xff0c;当内存或缓存容量有限…

18个惊艳的可视化大屏(第六辑):地图焦点

本期带来的都是以地图作为视觉焦点的可视化大屏页面。

力扣链表篇

以下刷题思路来自代码随想录以及官方题解 文章目录 203.移除链表元素707.设计链表206.反转链表24.两两交换链表中的节点19.删除链表的倒数第N个节点面试题 02.07. 链表相交142.环形链表II 203.移除链表元素 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链…