学习STM32第十六天

RTC实时时钟

一、简介

RTC是一个独立的BCD格式定时器,提供一个时钟日历,两个可编程报警中断,一个具有中断功能周期性可编程唤醒标志,RTC和时钟配置系统处于后备区域。

通过两个32位寄存器以BCD格式实现秒、分钟、小时(12、24小时制),日(星期)、月和年等信息。只要有电(VBAT提供),RTC就永不停止。RTC时钟源RTCCLK可从LSE、LSI和Divided HSE三者中选择,通常情况下使用LSE。 32768 = 2 15 32768 = 2^{15} 32768=215,经过15位分频器的自然溢出即可得到1Hz的频率,15位的计数器从0开始计数,计到最大值32767自然溢出,这个溢出信号就是1Hz信号。
RTC框图
RTCCLK先进行平滑校准,然后进行非同步预分频,最后进行同步预分频得到1Hz。相关频率计算公式如下: f C K − A P R E = f R T C C L K P R E D I V − A + 1 f_{CK - APRE}=\frac {f_{RTCCLK}}{PREDIV-A + 1} fCKAPRE=PREDIVA+1fRTCCLK f C K − A P R E f_{CK - APRE} fCKAPRE是用于为二进制 R T C − S S R RTC-SSR RTCSSR子秒下计数器计时,减到0, R T C − S S R RTC-SSR RTCSSR会重新加载 P R E D I V − S PREDIV-S PREDIVS的内容。 f C K − S P R E = f C K − A P R E P R E D I V − S + 1 f_{CK - SPRE}=\frac {f_{CK-APRE}}{PREDIV-S + 1} fCKSPRE=PREDIVS+1fCKAPRE f C K − S P R E f_{CK - SPRE} fCKSPRE可用于更新日历或者作为16位唤醒自动重载定时器的时基单元。RTC基本结构如下
RTC基本结构
RTC初始化与配置

  • 使能PWR和BKP时钟
  • 设置PWR_CR的DBP位,使能对BKP和RTC的访问
  • 对RTC寄存器的写操作都必须在前一次写操作结束后进行

RTC外设与BKP(备份寄存器)和PWR(电源)有关,这里一起讲解。

二、Unix时间戳

Unix事件戳(Unix Timestamp)定义为从UTC/GMT的1970年1月1日0时0分0秒开始所经过的秒数,不用考虑闰秒。时间戳存储在一个秒计数器中,是32位/64位的整型变量,不同时区通过添加偏移来得到当地时间。由于地球自转一周时间不固定,GMT对时间的定义更标准,为消除计时一天和地球自转一周的误差,通过执行闰秒
来保证计时一天的时间与地球自转一周的时间协调一致。

  • UTC(Universal Time Coordinated)协调世界时是一种以原子钟为基础的时间计量系统。
  • GMT(Greenwich Mean Time)格林尼治标准时间是一种以地球自转为基础的时间计量系统。

时间戳转换,C语言的time.h模块提供了时间获取和时间戳转换的相关函数。可以方便地进行秒计数器、日期时间和字符串之间的转换。
RTC时间戳转换
上面几个函数之间关系如下
RTC时间戳转换关系图
相应的实例代码如下

#include <stdio.h>
#include <time.h>
/*验证时间戳功能*/
time_t time_cnt;            //默认情况下是64位有符号秒计数器类型
struct tm time_date;        //tm结构体包含事件表示的元素,其中年份是从1900开始计算
char *time_str;             //指向一个表示时间的字符串

/*time_t time(time_t *)函数获取系统时钟,不能用于离线裸机系统*/
time_t Get_timestamp()
{
    return time(NULL);
}
/*struct tm* gmtime(const time_t*)函数将秒计数器转换为日期时间GMT格式*/
struct tm* Get_timeGMT(time_t* timestamp)
{
    return gmtime(timestamp);
}
/*struct tm* localtime(const time_t*)函数将秒计数器转换为当地日期时间,自动判断时区*/
struct tm* Get_localtime(time_t* timestamp)
{
    return localtime(timestamp);
}
/*time_t mktime(struct tm*)函数将当地日期时间转换为秒计数器*/
time_t localtime_stamp(struct tm* localtime)
{
    return mktime(localtime);
}
/*char* ctime(const time_t*)函数将秒计数器转换为字符串*/
char* timetostr(time_t* timestamp)
{
    return ctime(timestamp);
}
int main()
{
    time_cnt = Get_timestamp();
    printf("Time_cnt = %d\n", time_cnt);
    time_date = *Get_timeGMT(&time_cnt);
    printf("\n");
    printf("Time: %d-%d-%d  %d:%d:%d\n", time_date.tm_year + 1900, time_date.tm_mon + 1, time_date.tm_mday, time_date.tm_hour, time_date.tm_min, time_date.tm_sec);
    printf("\n");
    time_date = *Get_localtime(&time_cnt);
    printf("localTime: %d-%d-%d  %d:%d:%d\n", time_date.tm_year, time_date.tm_mon, time_date.tm_mday, time_date.tm_hour, time_date.tm_min, time_date.tm_sec);
    printf("\n");
    printf("localTime_stamp: %d\n", localtime_stamp(&time_date));
    printf("\n");
    printf("%s\n", timetostr(&time_cnt));

    return 0;
}

三、BKP

BKP(Backup Register)备份寄存器,可用于存储用户应用程序数据。VDD断开后,由VBAT维持供电,只要有电数据就不会丢失。通过备份域复位执行复位,由篡改/入侵检测(tamper detection)事件触发,一个篡改检测事件复位所有备份寄存器(防止外部窃取数据)。STM32F4xxBKP拥有20个32位寄存器,存储80字节用户应用数据。这里给出BKP基本结构
BKP基本结构

  • 50
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: STM32F0Keil 是一种针对ST公司推出的STM32F0系列单片机进行开发的支持包。Keil是一家英国公司,其开发工具集MDK-ARM专为微控制器开发设计,支持多种架构的芯片,包括ARM Cortex-M系列和其他8位和16位芯片。STM32F0Keil工具包包含了许多开发所需的资源,如库函数、代码示例、操作手册等等。 使用STM32F0Keil 可以使开发者轻松地进行STM32F0系列单片机的开发。支持包中的库函数提供了许多常见的操作,如中断处理、时钟管理、串口通信、GPIO控制等等,这些函数可以方便地被开发者调用。同时,支持包中还提供了丰富的代码示例,使开发者可以更加深入地了解如何使用STM32F0系列单片机实现各种功能。 在使用STM32F0Keil进行开发时,还可以借助Keil公司的开发工具集MDK-ARM,其提供了强大的开发环境,包括代码编辑器、调试器、编译器等等。这些工具可以大大提高开发效率和代码质量,从而缩短产品开发周期和提高产品质量。 综合来说,STM32F0Keil是一个非常有用的工具包,它可以支持STM32F0系列单片机的开发工作,为开发者提供了丰富的资源,方便快捷地进行开发工作。 ### 回答2: STM32F0系列是意法半导体(STMicroelectronics)推出的一款32位ARM Cortex-M0内核的微控制器系列。而Keil是一种常用的嵌入式开发环境,提供了编译、调试、仿真等工具。STM32F0系列支持Keil开发环境,意味着开发者可以选择使用Keil作为开发工具,方便进行基于STM32F0的嵌入式软件开发。 在使用Keil进行STM32F0开发时,可以通过Keil提供的软件包管理器来安装和管理STM32F0支持包。支持包是由STM32官方或者第三方提供的软件组件和驱动程序的集合,它们可以方便地集成到Keil开发环境中,简化了软件开发的过程。 STM32F0支持包中包含了丰富的库函数和示例代码,开发者可以直接调用库函数来实现各种功能,例如串口通信、定时器、PWM等。同时,在支持包中还包含了各种外设的驱动程序,开发者可以直接使用这些驱动程序来操作外设,如GPIO、SPI、I2C等。 总之,STM32F0支持包的存在使得使用Keil进行STM32F0开发更加便捷。开发者可以通过安装和使用支持包,快速启动STM32F0项目,并且可以直接使用已有的库函数和驱动程序来加速软件开发的进程。这也有助于提高开发效率,降低了开发者在底层代码编写和调试上的工作量。 ### 回答3: STM32F0是意法半导体(STMicroelectronics)推出的一系列32位ARM Cortex-M0微控制器。Keil是一个嵌入式开发工具,可以针对不同的嵌入式平台进行软件开发。STM32F0Keil支持包是专门为STM32F0系列微控制器设计的Keil软件开发工具的支持包。 STM32F0Keil支持包提供了开发STM32F0微控制器所需的一系列软件工具和组件。其中包括了编译器、调试器、IDE(集成开发环境)、链接器、编程器等等。这些工具可以帮助开发者编写、编译、调试和烧写程序代码。 具体来说,STM32F0Keil支持包提供了以下主要功能和特性: 1. 提供了针对STM32F0系列微控制器的专用编译器和调试器,确保编译器和调试器能够正常使用和兼容。 2. 集成了方便易用的IDE,提供了友好的用户界面和丰富的开发工具,方便开发者进行代码编写和调试。 3. 提供了STM32F0系列微控制器的软件库,包括底层驱动程序和中间件,方便开发者快速开发和测试应用程序。 4. 支持代码生成、编译、调试和烧写操作,提供了丰富的开发工具和功能,方便开发者进行软件开发和调试。 5. 提供了示例代码和应用案例,方便开发者学习和了解如何在STM32F0系列微控制器上开发应用程序。 总之,STM32F0Keil支持包是一套专门为STM32F0系列微控制器设计的Keil软件开发工具的完整解决方案,能够帮助开发者更高效、更方便地进行STM32F0系列微控制器的软件开发和调试。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值