BKP备份寄存器&RTC实时时钟

目录

Unix时间戳

简介

计时标准​编辑

 时间戳转换​编辑

 示例代码

 BKP

简介

BKP基本结构 

 RTC

RTC简介

 RTC框图

RTC基本结构

硬件电路 

RTC操作注意事项 


BKP本质上是RAM寄存器,不能完全掉电不丢失,它的数据需要VBAT引脚提供的备用电源来维持。RTC复位和掉电不丢失是通过BKP来实现的。

Unix时间戳

简介

计时标准

 时间戳转换

 示例代码

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

time_t time_cnt;
struct tm time_date;
char *str;
int main()
{
    //调用 time_t time(time_t*)获取系统时钟;
    time_cnt=time(NULL);        //方法一
    time(&time_cnt);            //方法二
    printf("%d\n",time_cnt);

    //调用struct tm* gmtime(const time_t*)秒计数器转换伦敦时间(格林尼治时间)的函数
    time_date=* gmtime(&time_cnt);  //方法一对右边取内容
   // time_date=gmtime(&time_cnt);  //方法二将左边定义为指针类型。struct tm *
    printf("%d ",time_date.tm_year+1900);
    printf("%d ",time_date.tm_mon+1);
    printf("%d ",time_date.tm_mday);
    printf("%d ",time_date.tm_hour);
    printf("%d ",time_date.tm_min);
    printf("%d ",time_date.tm_sec);
    printf("%d \n",time_date.tm_wday);


    // 调用struct tm* localtime(const time_t*)秒计数器转换为日期时间(当地时间)
    time_date=* localtime(&time_cnt);  //方法一对右边取内容
    printf("%d ",time_date.tm_year+1900);
    printf("%d ",time_date.tm_mon+1);
    printf("%d ",time_date.tm_mday);
    printf("%d ",time_date.tm_hour);
    printf("%d ",time_date.tm_min);
    printf("%d ",time_date.tm_sec);
    printf("%d \n",time_date.tm_wday);

    //time_t mktime(struct tm*)  日期时间转换为秒计数器(当地时间)
    time_cnt=mktime(&time_date);
    printf("%d\n",time_cnt);

    //char* ctime(const time_t*)  秒计数器转化为字符串(默认格式)
    str=ctime(&time_cnt);
    printf(str);

    //char *asctime(const struct tm*)   日期时间转换为字符串(默认格式)
   str = asctime(&time_date);
   printf(str);

   //size_t strftime(char*,size_t,const char*,connst struct tm*)  日期时间转换为字符串(自定义格式)
    char a[50];
    strftime(a, 50, "%H-%M-%S",&time_date);
    printf(a);

    return 0;
}

 运行结果


 BKP

简介

BKP基本结构 


 RTC

RTC简介

 RTC框图

  • 灰色部分是后备区域,这些电路在主电源断电后可用备用电池维持工作。
  • RTC_CNT32位可编程计数器对应时间戳里的秒计数器。读取时间时,先得到秒数然后调用time.h里的localtime函数便可得到年月日时分秒的信息。写入时间时,先填充年月日时分秒的信息到struct tm结构体里,再用maketime得到秒数写入到32位计数器。
  • RTC_RPL重装载计数器,RTC_DIV余数自减计数器。每来一个输入时钟RTC_DIV自减一,到0时再来一个输入时钟输出一个脉冲,产生溢出信号同时获取重装值。
  • RTC_ALP闹钟寄存器。当CNT和设定的闹钟值一样时会产生RTC_Alarm信号,通往右边的中断系统,同时这个闹钟信号可以让stm32退出待机模式(可以有一些用途)。该闹钟值是一个定值只能响一次,所以要实现周期性的闹钟需要在闹钟响之后重新设置下一个闹钟时间
  • RTCCLK三个来源看下一个图

  在RCC时钟树中,只有中间的专供RTC的时钟可以通过VBAT备用电池供电(可以实现RTC主电源断电继续走时的功能),上下两路时钟在主电源断电时是停止运行的。

RTC基本结构

配置数据选择器可以选择时钟来源

配置重装寄存器可以选择分频系数

配置32位计数器可以进行日期时间的读写 

配置32位闹钟值可以实现闹钟

实现中断先允许终端再配置NVIC最后写中断函数

硬件电路 

黑色的部件是32.768khz的晶振,金属壳状体是8khz外部高速晶振。

画板子可以参考下图连接

RTC操作注意事项 

第一步开启PWR和BKP的时钟,第二步使用PWR,使能BKP和RTC访问。

在框图中可以看到PCLK132MHZ频率远大于RTCCLK32KHZ。所以在刚开启APB1时要等RTCCLK,来一个上升沿RTC把它的寄存器的值同步到APB1总线上。只需调用一个等待同步的函数即可。

猜你喜欢

转载自blog.csdn.net/m0_70732442/article/details/131363613