STM32--RTC实时时钟

news2024/10/7 18:20:07

文章目录

  • Unix时间戳
  • 时间戳转换
  • BKP
  • RTC简介
  • RTC框图
  • 硬件电路
  • RTC的注意事项
  • RTC时钟实验工程

Unix时间戳

Unix 时间戳是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒

时间戳存储在一个秒计数器中,秒计数器为32位/64位的整型变量。

世界上所有时区的秒计数器相同,不同时区通过添加偏移来得到当地时间。

在这里插入图片描述

GMT : GMT(Greenwich Mean Time), 格林威治平时(也称格林威治时间)。
它规定太阳每天经过位于英国伦敦郊区的皇家格林威治天文台的时间为中午12点。它将地球自转一周的时间间隔等分为24小时,以此确定计时标准。

UTC:UTC(Coodinated Universal Time),协调世界时,又称世界统一时间、世界标准时间、国际协调时间。
UTC 是现在全球通用的时间标准,全球各地都同意将各自的时间进行同步协调。UTC 时间是经过平均太阳时(以格林威治时间GMT为准)、地轴运动修正后的新时标以及以秒为单位的国际原子时所综合精算而成。

时间戳转换

对于我们目前使用的电子设备,都是通过联网来确认时间戳的。所以我们看到的时间都是由时间戳转换成日期的。

C语言的time.h模块提供了时间获取和时间戳转换的相关函数,可以方便地进行秒计数器、日期时间和字符串之间的转换。

在这里插入图片描述
这里讲几个会用到的。

第一个,time_t time(time_t*),获取系统时钟。
通过使用设备当前时间,获取一个时间戳。
在这里插入图片描述

第二个,struct tm* gmtime(const time_t*);秒计数器转换为日期时间(格林尼治时间)
在这里插入图片描述
这里需要注意的是struct tm 结构体类型成员year和mon
在这里插入图片描述
年是从1900年算起的,所以实际时间要加上1900;
月是从0开始的,所以要加上1;
时是由于计算是标准时间,所以要加上8才是东八区的标准时间。

第三个,time_t mktime(struct tm*);日期时间转换为秒计数器(当地时间)
在这里插入图片描述

由于STM32无法计算系统时钟,需要软件输入设置当前时间,所以也没有当地时间与标准时间的概念。

在这里插入图片描述

BKP

备份寄存器是42个16位的寄存器,可用来存储84个字节的用户应用程序数据。(对于中小容量的产品,只能存储20个字节)他们处在备份域里,当VDD电源被切断,他们仍然由VBAT维持供电。当系统在待机模式下被唤醒,或系统复位或电源复位时,他们也不会被复位。
也就是说,只要有一方供电,保存的数据就不会丢失;

BKP控制寄存器用来管理侵入检测和RTC校准功能

在这里插入图片描述

侵入检测:当TAMPER引脚上的信号从’0’变成’1’或者从’1’变成’0’(取决于备份控制寄存器BKP_CR的TPAL位),会产生一个侵入检测事件。侵入检测事件将所有数据备份寄存器内容清除
RTC校准:为方便测量, RTC时钟可以经64分频输出到侵入检测引脚TAMPER上。
这里只是简单介绍这两种功能而已。
在这里插入图片描述

RTC简介

实时时钟是一个独立的定时器RTC模块拥有一组连续计数的计数器,在相应软件配置下,可提供时钟日历的功能。修改计数器的值可以重新设置系统当前的时间和日期。
RTC模块和时钟配置系统(RCC_BDCR寄存器)处于后备区域,即在系统复位或从待机模式唤醒后, RTC的设置和时间维持不变。
在这里插入图片描述
操作访问方法与BKP相同。

相关特性
在这里插入图片描述

RTC框图

在这里插入图片描述
RTC时钟部分就是在后备区域内,上面连接着APB1总线进行读写的操作,
左边连接着RTC时钟源。
RTC核心部分是完全独立于APB接口的,需要通过软件,经过APB1接口访问RTC的预分频值,计数器值和闹钟值。
RTC预分频器会先预装重装载器,然后给到DIV,在RTCCLK时钟源进来的每一次,DIV以递减的方式,直到DIV为0时才将输出时钟传到CNT上;
CNT是一个计数器,用来存储时间戳;下面的ALR是闹钟寄存器,当CNT与ALR相等时,可以通过闹钟来产生中断;
这些产生的时钟信号经过控制寄存器进入NVIC中断控制器。
在这里插入图片描述

硬件电路

在这里插入图片描述
这部分是备用电池供电的电路,对于简单连接的就是直接连上一个3.3V供电的即可。
右边的是纽扣电池的连接方式。

在这里插入图片描述
外部低速晶振图,外部时钟的产生;
在这里插入图片描述

RTC的注意事项

执行以下操作将使能对BKP和RTC的访问:
设置RCC_APB1ENR的PWREN和BKPEN,使能PWR和BKP时钟
设置PWR_CR的DBP,使能对BKP和RTC的访问(开启RTC)

若在读取RTC寄存器时,RTC的APB1接口曾经处于禁止状态,则软件首先必须等待RTC_CRL寄存器中的RSF位(寄存器同步标志)被硬件置1(时钟同步)

必须设置RTC_CRL寄存器中的CNF位,使RTC进入配置模式后,才能写入RTC_PRL、RTC_CNT、RTC_ALR寄存器

对RTC任何寄存器的写操作,都必须在前一次写操作结束后进行。可以通过查询RTC_CR寄存器中的RTOFF状态位,判断RTC寄存器是否处于更新中。仅当RTOFF状态位是1时,才可以写入RTC寄存器

RTC时钟实验工程

OLED代码链接入口

连接方式:
在这里插入图片描述
在OLED屏幕显示一个实时时钟;

MyRTC.h

#ifndef __MYRTC_H__
#define __MYRTC_H__

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

typedef struct Time
{
    int sec;
    int min;
    int hour;
    int mday;
    int mon;
    int year;
    
}Time;



void MyRTC_Init(Time* t);
void MyRTC_SetTime(Time* t);
void MyRTC_ReadTime(Time* t);

#endif
 

MyRTC.c

#include "MyRTC.h"

//时间设置
void MyRTC_SetTime(Time* t)
{
    time_t time_cnt;//计数器
    struct tm time_date;//时钟日期
    
    time_date.tm_year=  t->year-1900;
    time_date.tm_mon= t->mon-1;
    time_date.tm_mday= t->mday;
    time_date.tm_hour= t->hour;
    time_date.tm_min= t->min;
    time_date.tm_sec= t->sec;
    //设置计数器
    //日期转换为时间戳
    time_cnt=mktime(&time_date)-8*60*60;
    RTC_SetCounter(time_cnt);
    RTC_WaitForLastTask();   
}

void MyRTC_Init(Time* t)
{
   //打开电源和后备接口的时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP,ENABLE);
    //开启RTC的使用
    PWR_BackupAccessCmd(ENABLE);
    
   // if(BKP_ReadBackupRegister(BKP_DR1)!=0x1111)
   // {
        //配置LSE
        RCC_LSICmd(ENABLE);
        while(!RCC_GetFlagStatus(RCC_FLAG_LSIRDY));
        //RCCLK选择LSE
        RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);
        //开启RTC的时钟源
        RCC_RTCCLKCmd(ENABLE);
        
        //时钟同步  
        RTC_WaitForSynchro();
        RTC_WaitForLastTask();
        
        //设置分频器,写操作等待完成
        RTC_SetPrescaler(32767);
        RTC_WaitForLastTask();
        
        //时间初始化设置
        MyRTC_SetTime(t);
        //非首次和完全断电给一个值
   //     BKP_WriteBackupRegister(BKP_DR1,0x1111);
  //  }
  // else
  // {
  //     RTC_WaitForSynchro();
  //     RTC_WaitForLastTask();
  // }
    
    
     
}



//读取时间
void MyRTC_ReadTime(Time* t)
{
    time_t time_cnt;//计数器
    struct tm time_date;//时钟日期
    //时间戳转换为日期
    time_cnt=RTC_GetCounter()+8*60*60;
    time_date=*localtime(&time_cnt);
    
    
    t->year=time_date.tm_year+1900;
    t->mon=time_date.tm_mon+1;
    t->mday=time_date.tm_mday;
    t->hour=time_date.tm_hour;
    t->min=time_date.tm_min;
    t->sec=time_date.tm_sec;
}

对于时钟的选择内部时钟LSI无法在断开电源和复位时进入后备区域;LSE外部时钟可以,我们可以设置一个值,只要是这个值说明就进入了后备区域。由于我的外部时钟晶振无法震荡,所以只能使用内部时钟,读者可以
修改为在这里插入图片描述
并将那些注释解开即可。
这里进行写操作时,函数中就已经进入了配置模式了
在这里插入图片描述
这里输入的时钟是东八区的时间,而设置计数器为标准时间的时间戳,所以要进行减去8* 60* 60
等到读取时间时再加回来

main.c

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

int main()
{
    Time time;
    time.year=2023;
    time.mon=1;
    time.mday=1;
    time.hour=23;
    time.min=59;
    time.sec=55;
    
	OLED_Init();
	MyRTC_Init(&time);
    
    
	
    MyRTC_SetTime(&time);
	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)
	{
		MyRTC_ReadTime(&time);
		
		OLED_ShowNum(1, 6, time.year, 4);
		OLED_ShowNum(1, 11,time.mon, 2);
		OLED_ShowNum(1, 14, time.mday, 2);
		OLED_ShowNum(2, 6, time.hour, 2);
		OLED_ShowNum(2, 9, time.min, 2);
		OLED_ShowNum(2, 12, time.sec, 2);
		
		OLED_ShowNum(3, 6, RTC_GetCounter(), 10);
		OLED_ShowNum(4, 6, RTC_GetDivider(), 10);
	}
    
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【大数据毕设】基于Hadoop的招聘网站可视化的设计与实现(一)

博主介绍&#xff1a;✌全网粉丝6W,csdn特邀作者、博客专家、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于大数据技术领域和毕业项目实战✌ &#x1f345;文末获取项目联系&#x1f345; 基于Hadoop的招聘网站可视化的设计与实现 摘要&#…

gitHooks使用教程

1. 安装所需依赖 npm install eslint prettier husky lint-staged --save-dev 2.初始化 husky npx husky-init && npm install 这将创建一个 .husky/ 目录&#xff0c;并且在其中包含一个示例的 pre-commit 文件。 3.设置 pre-commit 钩子 npx husky add .husky/…

正规黄金代理的三大要素

对于现货黄金投资来说&#xff0c;寻找一个正规的黄金代理是十分重要的问题。在目前的现货黄金投资市场中&#xff0c;现货黄金代理的数量很多&#xff0c;他们都致力于耕耘现货黄金投资市场。当越来越多的专业人士加入到现货黄金投资的市场中当中时&#xff0c;这个市场将会越…

【AI辅助办公】PDF转PPT,移除水印

PDF转PPT 将PDF上传链接即可转换成PPT。​​​​​​ ​​​​​​​ https://www.camscanner.com/pdftoppthttps://www.camscanner.com/pdftoppt​​​​​​​​​​​​​​移除水印 第一步&#xff1a;打开视图-宏 第二步&#xff1a;输入宏名&#xff08;可以是人以文字…

天津python培训机构大揭秘!Python与人工智能

Python是一门开源的编程语言&#xff0c;它已经成为了企业界和科技领域大多数选择的语言之一。许多人已经通过编写Python应用程序赚取了不错的收入&#xff0c;这些成功者之所以能够成功&#xff0c;一部分原因是因为他们善于创新&#xff0c;能够始终跟上技术和市场&#xff0…

基于单片机的超声波语音测距系统

一、系统方案 超声波具有指向性强&#xff0c;能量消耗缓慢&#xff0c;在介质中传播的距离较远&#xff0c;因而超声波经常用于距离的测量&#xff0c;如测距仪和物位测量仪等都可以通过超声波来实现。利用超声波检测往往比较迅速、方便、计算简单、易于做到实时控制&#xff…

Joom、Etsy、Daraz、Newegg专业运营模式解析,助你更上一层楼

首先我们来先了解一下这些平台的结构和运营模式。 Joom是一家总部位于爱沙尼亚的跨境电商平台&#xff0c;专注于为全球消费者提供具有竞争力价格和高品质商品的便利购物体验。Joom通过直采模式与全球品牌和供应商直接合作&#xff0c;确保商品的优质和价格的合理。此外&#x…

java使用多线程不分页查询100万条数据

如果用普通查询需要5分多分钟才查询完毕&#xff0c;所以我们用索引加多线程来实现。 那我们就开始吧&#xff01;GO&#xff01;&#xff01;GO&#xff01;&#xff01; 数据库设计 编写数据库字段 然后要生成100万条数据 在数据库添加索引 代码实现 java编写 controll…

STM32CubeMX 软件删除用户代码的问题解决

总结stm32cubeMx 会删除用户代码的问题。 自己的代码不会被删除的软件格式及配置方法。当然还需要注意一点&#xff1a;软件生成的工程不能有中文字符&#xff0c;要不然生成错误。 1、stm32cubeMx 的配置如下&#xff1a; 2、就是按照格式把自己的代码写到应该写的位置。如下图…

【Python】Python Flask token身份认证(附完整代码)

前言 Python Flask是一个使用Python编写的轻量级Web应用框架&#xff0c;它可以非常方便地搭建Web应用。在Web应用中&#xff0c;经常需要进行身份认证&#xff0c;以确保只有授权用户才能访问某些资源。本文将介绍如何使用token进行身份认证&#xff0c;以及如何在Python Fla…

IIS搭建本地电脑服务器:通过内网穿透技术实现公网访问的步骤指南

1.前言 在网上各种教程和介绍中&#xff0c;搭建网页都会借助各种软件的帮助&#xff0c;比如网页运行的Apache和Nginx、数据库软件MySQL和MSSQL之类&#xff0c;为方便用户使用&#xff0c;还出现了XAMPP、PHPStudy、宝塔面板等等一系列集成服务&#xff0c;都是为了方便我们…

20W到80W SIP音柱

SIP-7042 20W到80WSIP音柱 一、描述 SIP-7042是一款壁挂式SIP有源音柱&#xff0c;具有10/100M以太网接口&#xff0c;可将SIP音源通过自带的功放和喇叭输出播放&#xff0c;其采用铝合金防水设计&#xff0c;功率可以从20W到80W。SIP-7042作为SIP广播播放系统的终端&#xff…

一招搞定Nuxt3中配置全局样式和全局变量

// nuxt.config.ts // https://nuxt.com/docs/api/configuration/nuxt-config export default defineNuxtConfig({devtools: { enabled: true },css: [/assets/style/global.less], // 全局样式vite: {css: {preprocessorOptions: {less: {additionalData: import "/asse…

记录一次ORA-00600 [kdsgrp1]导致的large tracefile的处理过程

文章目录 1.问题描叙2 查因过程2.1 查看磁盘空间状况2.2 检查表空间增长情况2.3 检查$ORACLE_BASE相关文件2.4查看trace file内容 3.处理过程3.1数据文件检查3.2 表及索引段检查 4.结论&#xff1a; 1.问题描叙 收到check_mk告警&#xff0c;约在15:17左右硬盘空间消耗暴增 …

在Ubuntu Linux系统上安装RabbitMQ服务并解决公网远程访问问题

文章目录 前言1.安装erlang 语言2.安装rabbitMQ3. 内网穿透3.1 安装cpolar内网穿透(支持一键自动安装脚本)3.2 创建HTTP隧道 4. 公网远程连接5.固定公网TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址 前言 RabbitMQ是一个在 AMQP(高级消息队列协议)基…

数据资产入表 先行者数据宝在做什么?

2023年8月21日&#xff0c;财政部印发了《企业数据资源相关会计处理暂行规定》&#xff0c;规定数据将作为资产进入企业资产负债表&#xff0c;具体是将数据确认为企业资产负债表中“资产”一项&#xff0c;在财务报表中体现其真实价值与业务贡献。入表意味着数据完成了从自然资…

ChatGPT 实现动态地图可视化展示

地图可视化分析有许多优点和好处: 1.直观理解:地图可视化使得复杂的数据更易于理解。通过地图可视化,人们可以直观地看到地理位置、地区之间的关系以及空间分布的模式。 2.提高决策效率:地图可视化可以帮助决策者快速理解和解释数据,从而提高决策效率。 3.高效的数据整…

streamlit--构建对话式应用程序

聊天元素 st.chat_message st.chat_input 构建镜像回复输入内容的机器人 使用流式传输构建简单的聊天机器人 构建一个类似ChatGPT的应用程序 参考资料 streamlit-构建对话式应用程序

iOS开发Swift-4-IBAction,group,音乐播放器-木琴App

1.使用素材创建木琴App的UI。 2.连接IBAction。 其余按钮直接拖拽到play里边。 当鼠标置于1处时2处显示如图&#xff0c;表示成功。当用户按下任一按钮都会触发play中的内容。 3.将7个按钮的View中的Tag值分别调为1、2、3、4、5、6、7. 4.将音频文件拖入项目文件中。 Create gr…

一篇文章告诉你JavaScript 如何实现继承

一、背景简介 JavaScript 在编程语言界是个特殊种类&#xff0c;它和其他编程语言很不一样&#xff0c;JavaScript 可以在运行的时候动态地改变某个变量的类型。 比如你永远也没法想到像isTimeout这样一个变量可以存在多少种类型&#xff0c;除了布尔值true和false&#xff0…