STM32--RTC实时时钟

这篇具有很好参考价值的文章主要介绍了STM32--RTC实时时钟。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Unix时间戳

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

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

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

STM32--RTC实时时钟,STM32,stm32,RTC时钟

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

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

时间戳转换

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

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

STM32--RTC实时时钟,STM32,stm32,RTC时钟
这里讲几个会用到的。

第一个,time_t time(time_t*),获取系统时钟。
通过使用设备当前时间,获取一个时间戳。
STM32--RTC实时时钟,STM32,stm32,RTC时钟

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

第三个,time_t mktime(struct tm*);日期时间转换为秒计数器(当地时间)
STM32--RTC实时时钟,STM32,stm32,RTC时钟

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

STM32--RTC实时时钟,STM32,stm32,RTC时钟

BKP

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

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

STM32--RTC实时时钟,STM32,stm32,RTC时钟

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

RTC简介

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

相关特性
STM32--RTC实时时钟,STM32,stm32,RTC时钟

RTC框图

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

硬件电路

STM32--RTC实时时钟,STM32,stm32,RTC时钟
这部分是备用电池供电的电路,对于简单连接的就是直接连上一个3.3V供电的即可。
右边的是纽扣电池的连接方式。

STM32--RTC实时时钟,STM32,stm32,RTC时钟
外部低速晶振图,外部时钟的产生;
STM32--RTC实时时钟,STM32,stm32,RTC时钟

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代码链接入口

连接方式:
STM32--RTC实时时钟,STM32,stm32,RTC时钟
在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外部时钟可以,我们可以设置一个值,只要是这个值说明就进入了后备区域。由于我的外部时钟晶振无法震荡,所以只能使用内部时钟,读者可以
修改为STM32--RTC实时时钟,STM32,stm32,RTC时钟
并将那些注释解开即可。
这里进行写操作时,函数中就已经进入了配置模式了
STM32--RTC实时时钟,STM32,stm32,RTC时钟
这里输入的时钟是东八区的时间,而设置计数器为标准时间的时间戳,所以要进行减去8* 60* 60
等到读取时间时再加回来

main.c文章来源地址https://www.toymoban.com/news/detail-692528.html

#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);
	}
    
}

到了这里,关于STM32--RTC实时时钟的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32-RTC实时时钟详解

    RTC的本质很简单,就是一个时钟经过精确分频最后得到的一个1Hz的时钟,也可以说是计数器,其他大部分功能都是基于这个计数器设计的数字逻辑。 本文讲的RTC是基于STM32F030来讲的,相比与F1系列的RTC来说,M0的将很多原本需要软件实现的功能硬件化了,使用起来更加便利。

    2024年02月04日
    浏览(46)
  • STM32-实时时钟RTC-2

                                     

    2024年01月20日
    浏览(47)
  • STM32基础10--实时时钟(RTC)

     目录 前言 RTC框图 STM32实时时钟电路 功能需要 STM32CubeMx配置RTC 配置RCC 配置RTC 配置时间,闹钟,唤醒 开启中断 设置中断优先级 功能代码实现 STM32Cude生成RTC初始化 自定义触发闹钟次数变量  重写周期唤醒回调函数 重写闹钟中断函数         在做51单片机项目时,如果需

    2023年04月11日
    浏览(39)
  • STM32学习笔记(十二)丨RTC实时时钟

    ​  本次课程采用单片机型号为STM32F103C8T6。 ​  课程链接:江协科技 STM32入门教程   往期笔记链接:   STM32学习笔记(一)丨建立工程丨GPIO 通用输入输出   STM32学习笔记(二)丨STM32程序调试丨OLED的使用   STM32学习笔记(三)丨中断系统丨EXTI外部中断   

    2024年02月16日
    浏览(48)
  • STM32中的RTC实时时钟和配套闹钟设置

    主要初始化函数,以及设置闹钟函数,闹钟中断函数 RTC.c RTC.h main.c

    2024年04月23日
    浏览(43)
  • stm32-OLED屏+RTC实现简易实时时钟(下篇)

    一、RTC简介 实时时钟是一个独立的定时器。RTC模块拥有一组连续计数的计数器,在相应软件配置下,可 提供时钟日历的功能。修改计数器的值可以重新设置系统当前的时间和日期。 RTC模块和时钟配置系统(RCC_BDCR寄存器)处于后备区域,即在系统复位或从待机模式唤醒 后,R

    2024年01月18日
    浏览(48)
  • stm32-OLED屏+RTC实现简易实时时钟(上篇)

    oled屏选择ssd1306,使用RTC实现简易实时时钟 1、MCU接口选择 SSD1306单片机接口由8个数据引脚和5个控制引脚组成。通过BS[2:0]引脚上的硬件选择可以设置不同的MCU模式    通过控制BS[2:0]引脚可以设置MCU与OLED屏的通信方式。因为我使用的是正点原子的开发板,所以我用了适配的接

    2024年01月17日
    浏览(48)
  • STM32实时时钟(RTC)的配置和使用方法详解

    实时时钟(RTC)是STM32系列微控制器上的一个重要模块,用于提供准确的时间和日期信息。在本文中,我们将详细介绍STM32实时时钟的配置和使用方法。 ✅作者简介:热爱科研的嵌入式开发者,修心和技术同步精进 ❤欢迎关注我的知乎:对error视而不见 代码获取、问题探讨及

    2024年02月21日
    浏览(58)
  • 【STM32】读写BKP备份寄存器&RTC实时时钟

    目录 BKP BKP简介 BKP基本结构 BKP测试代码 RTC RTC简介 RTC框图 RTC基本结构 硬件电路 RTC操作注意事项 接线图 初始化 使用BKP解决只初始化一次时间  初始化参考代码 RTC设置时间 RTC读取时间 完整代码 MyRTC.c MyRTC.h main.c BKP(Backup Registers)备份寄存器 BKP可用于存储用户应用程序数据

    2024年04月22日
    浏览(51)
  • STM32CubeIDE开发(十一), STM32实时时钟(RTC)写入及读取日历时间开发要点

    目录 一、RTC简介 二、工程创建及配置  三、驱动代码设计实现 四、编译及测试         实时时钟的缩写是RTC(Real_Time Clock),核心是晶振,晶振频率一般为32768 Hz 。它为分频计数器提供精确的与低功耗的实基信号。它可以用于产生秒、分、时、日等信息。为了确保时钟长期

    2024年01月16日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包