12 RTC实时时钟
更新跟随 虎慕 的STM32笔记!内容均来自江科大STM32入门教程!
附原笔记链接:http://t.csdnimg.cn/gRccX 因为原帖不更新了所以我来接上。
12.1.1 Unix时间戳
最早出现在Unix系统的时间戳,后来由Unix系统演变而来的系统也都继承了Unix时间戳的规定,目前Linux、Windows、安卓等等都是使用的Unix时间戳。
Unix 时间戳(Unix Timestamp)
定义:从UTC/GMT的1970年1月1日0时0分0秒开始所经过的秒数,不考虑闰秒(时间戳就是一个计数器数值)
这个时间戳计数到现在已经非常大了,虽然对于人类来说不易理解,但是对于计算机来说无论是存储还是计算都是非常方便的。在底层我们用时间戳来秒计数,需要给人类观看时就转换为年月日。
好处:
1、简化了硬件电路,直接设计一个很大的秒寄存器就行了
2、在进行时间间隔的计算时很方便,只需要将两个时刻的秒数相减除以一个小时的秒数就能算出两个时刻之间的间隔。
3、存储方便,存储秒数只需要一个比较大的变量。
坏处:
1、占用软件资源,在每次进行秒计数器和日期时间转换时会比较占用软件资源。
•时间戳存储在一个秒计数器中,秒计数器为32位(2038.1.19日溢出)/64位的整型变量(STM32F103C8T6是32位的数据类型(无符号所以会在2106年溢出)
•世界上所有时区的秒计数器相同,不同时区通过添加偏移来得到当地时间
12.1.2 UTC/GMT
GMT(Greenwich Mean Time)格林尼治标准时间是一种以地球自转为基础的时间计量系统。它将地球自转一周的时间间隔等分为24小时,以此确定计时标准/
但是地球自转时间会受到外界、自身影响而改变,那么这个一秒的定义也就相应变化,不利于科学研究。
UTC(Universal Time Coordinated)协调世界时是一种以原子钟为基础的时间计量系统。它规定铯133原子基态的两个超精细能级间在零磁场下跃迁辐射9,192,631,770周所持续的时间为1秒。当原子钟计时一天的时间与地球自转一周的时间相差超过0.9秒时,UTC会执行闰秒来保证其计时与地球自转的协调一致。
UTC定义的一秒与1970年的GMT保持一致,但是地球的自转时间会改变,那么计时的一天就会和自转的一天发生偏差,因此引入闰秒来消除误差。
12.1.3 时间戳转换
C语言的time.h模块提供了时间获取和时间戳转换的相关函数,可以方便地进行秒计数器、日期时间和字符串之间的转换
#include <stdio.h>
#include <time.h>
time_t time_count;
struct tm time_data;
char* tm_str;
int main(void)
{
//time_count=time(NULL);
//time(&time_count);
time_count=1672588795;
printf("%d\n",time_count);
time_data=*localtime(&time_count);
printf("%d\n",time_data.tm_year+1900);
printf("%d\n",time_data.tm_mon+1);
printf("%d\n",time_data.tm_mday);
printf("%d\n",time_data.tm_hour);
printf("%d\n",time_data.tm_min);
printf("%d\n",time_data.tm_sec);
time_count=mktime(&time_data);
printf("%d\n",time_count);
tm_str=ctime(&time_count);
printf(tm_str);
tm_str=asctime(&time_data);
printf(tm_str);
char arr[50];
strftime(arr,50,"%H-%M-%S",&time_data);
printf(arr);
return 0;
}
time_t time(time_t*);
这个函数要么使用变量放在等号左边接受,要么传入地址直接赋值。
struct tm* gmtime(const time_t*);
struct tm* localtime(const time_t*);
这两个函数在接收时可以使用定义结构体指针变量来接受,也可以定义