基于STM32处理器

RTC只是个能靠电池维持运行的32位定时器over!

并不像实时时钟芯片,读出来就是年月日。。。

看过些网上的代码,有利用秒中断,在内存中维持一个年月日的日历。

我觉得,这种方法有很多缺点:

1.断电时没有中断可用

2.频繁进中断,消耗资源

3.时间运算复杂,代码需要自己写

4.不与国际接轨。。。。

so,还是用标准的UNIX时间戳来进行时间的操作吧!

什么是UNIX时间戳?

UNIX时间戳,是unix下的计时方式。。。很废话

具体点:他是一个32位的整形数(刚好和STM32的RTC寄存器一样大),表示从UNIX元年(格林尼治时间1970-1-1 0:0:0)开始到某时刻所经历的秒数

听起来很玄幻的,计算下: 32位的数从0-0xFFFFFFFF秒,大概到2038年unix时间戳将会溢出!这就是Y2038bug

不过,事实上的标准,我们还是照这个用吧,还有二十年呢。。。

UNIX时间戳:1229544206 <==> 现实时间:2008-12-17  20:03:26

我们要做的,就是把当前时间的UNIX时间戳放在RTC计数器中让他每秒++,over

然后,设计一套接口函数,实现UNIX时间戳与年月日的日历时间格式转换 这样就可以了

在RTC中实现这个时间算法,有如下好处:

1. 系统无需用中断和程序来维持时钟,断电后只要RTC在走即可

2. 具体的两种计时的换算、星期数计算,有ANSI-C的标准C库函数实现,具体可以看time.h

3. 时间与时间的计算,用UNIX时间戳运算,就变成了两个32bit数的加减法

4. 与国际接轨。。。

幸好是与国际接轨,我们有time.h帮忙,在MDK的ARM编辑器下有,IAR下也有

其中已经定义了两种数据类型:unix时间戳和日历型时间

time_t:       UNIX时间戳(从1970-1-1起到某时间经过的秒数)

typedef unsigned int time_t;

struct tm:    Calendar格式(年月日形式)

同时有相关操作函数

gmtime,localtime,ctime,mktime等等,方便的实现各种时间类型的转换和计算

于是,基于这个time.h,折腾了一天,搞出了这个STM32下的RTC_Time使用的时间库

这是我的RTC_Time.c中的说明:

本文件实现基于RTC的日期功能,提供年月日的读写。(基于ANSI-C的time.h)

作者:jjldc (九九)

QQ: 77058617

RTC中保存的时间格式,是UNIX时间戳格式的。即一个32bit的time_t变量(实为u32)

ANSI-C的标准库中,提供了两种表示时间的数据  型:

time_t:       UNIX时间戳(从1970-1-1起到某时间经过的秒数)

typedef unsigned int time_t;

struct tm:    Calendar格式(年月日形式)

tm结构如下:

struct tm {

int tm_sec;   // 秒 seconds after the minute, 0 to 60

(0 - 60 allows for the occasional leap second)

int tm_min;   // 分 minutes after the hour, 0 to 59

int tm_hour;  // 时 hours since midnight, 0 to 23

int tm_mday;  // 日 day of the month, 1 to 31

int tm_mon;   // 月 months since January, 0 to 11

int tm_year;  // 年 years since 1900

int tm_wday;  // 星期 days since Sunday, 0 to 6

int tm_yday;  // 从元旦起的天数 days since January 1, 0 to 365

int tm_isdst; // 夏令时??Daylight Savings Time flag

...

}

其中wday,yday可以自动产生,软件直接读取

mon的取值为0-11

***注意***:

tm_year:在time.h库中定义为1900年起的年份,即2008年应表示为2008-1900=108

这种表示方法对用户来说不是十分友好,与现实有较大差异。

所以在本文件中,屏蔽了这种差异。

即外部调用本文件的函数时,tm结构体类型的日期,tm_year即为2008

注意:若要调用系统库time.c中的函数,需要自行将tm_year-=1900

成员函数说明:

struct tm Time_ConvUnixToCalendar(time_t t);

输入一个Unix时间戳(time_t),返回Calendar格式日期

time_t Time_ConvCalendarToUnix(struct tm t);

输入一个Calendar格式日期,返回Unix时间戳(time_t)

time_t Time_GetUnixTime(void);

从RTC取当前时间的Unix时间戳值

struct tm Time_GetCalendarTime(void);

从RTC取当前时间的日历时间

void Time_SetUnixTime(time_t);

输入UNIX时间戳格式时间,设置为当前RTC时间

void Time_SetCalendarTime(struct tm t);

输入Calendar格式时间,设置为当前RTC时间

外部调用实例:

定义一个Calendar格式的日期变量:

struct tm now;

now.tm_year = 2008;

now.tm_mon = 11;        //12月

now.tm_mday = 20;

now.tm_hour = 20;

now.tm_min = 12;

now.tm_sec = 30;

获取当前日期时间:

tm_now = Time_GetCalendarTime();

然后可以直接读tm_now.tm_wday获取星期数

设置时间:

Step1. tm_now.xxx = xxxxxxxxx;

Step2. Time_SetCalendarTime(tm_now);

计算两个时间的差

struct tm t1,t2;

t1_t = Time_ConvCalendarToUnix(t1);

t2_t = Time_ConvCalendarToUnix(t2);

dt = t1_t - t2_t;

dt就是两个时间差的秒数

dt_tm = mktime(dt);    //注意dt的年份匹配,ansi库中函数为相对年份,注意超限

另可以参考相关资料,调用ansi-c库的格式化输出等功能,ctime,strftime等

这是包含了RTC_Time的工程实例,可以用来参考

基于MDK环境

linux元年时间搓,发布基于ANSI-C的RTC_Time库,利用UNIX时间戳格式,无中断实现万年历...相关推荐

  1. [工具类]将时间转换为unix时间戳格式

    写在前面 由于在数据库中存的时间有时间戳格式的数据,在解析以及保存的时候,就需要考虑到数据格式的兼容性问题.看到数据库中的时间字段基本上都是以时间戳格式存储的,没办法,只能将时间进行转换了,考虑到其他 ...

  2. DateTime时间格式转换为Unix时间戳格式

    // DateTime时间格式转换为Unix时间戳格式 public int ConvertDateTimeInt(System.DateTime time) { System.DateTime st ...

  3. Linux 各种BCD时间与Unix时间戳格式转换

    在Linux C或C++编程中,因为应用场景的不同,经常会遇到各种时间之间的装换,有时需要BCD时间,有时需要Unix时间戳,也有叫绝对时间的.这里介绍几种时间格式转换的应用. Unix时间戳: Un ...

  4. linux时间戳转换c语言,Unix时间戳和北京时间的相互转换(C语言实现 )

    一.问题背景 最近项目中需要上传包含时间戳的设备数据到服务器平台.原本想把"年","月","日","时","分 ...

  5. linux目录时间转换,Shell日期时间和时间戳的转换

    Gitlab的备份文件是以时间戳显示的,类似:1438624820_gitlab_backup.tar 为了更易于阅读,想把文件名转换成日期格式:2015-08-04_gitlab_backup.ta ...

  6. linux系统时间编程(3) 计算机界时间--UNIX时间戳获取

    UNIX时间戳 unix时间戳是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒. Unix时间戳(英文为Unix epoch, Unix time, POSIX time 或 ...

  7. Unix时间戳和北京时间的相互转换(C语言实现 )

    一.问题背景 最近物联网项目中需要上传包含时间戳的设备数据到服务器平台.原本想把"年","月","日","时",&quo ...

  8. 【时间】Unix时间戳

    UNIX时间戳:Unix时间戳(英文为Unix epoch, Unix time, POSIX time 或 Unix timestamp) 是从1970年1月1日(UTC/GMT的午夜)开始所经过的 ...

  9. C实现Unix时间戳和本地时间转化

    我们平常说时间都说的几点几分几秒,星期几,但是在计算机里面并不是直接使用我们所说的时间,而是使用Unix时间戳,这样不管是哪个平台,哪个系统,都可以根据自己对时间的定义进行转换,像Java,PHP等都 ...

最新文章

  1. 谷歌浏览器禁止右滑返回历史_移动端h5禁用浏览器左滑右滑的前进后退功能
  2. oracle 查询表字段6,Oracle 查询库中所有表名、字段名、字段名说明,查询表的数据条数、表名、中文表名、...
  3. 百度安全 Rust TrustZone SDK正式成为 Apache Teaclave 子项目
  4. websocket实现单聊
  5. Oracle EBS-SQL (PO-5):采购订单控制信息查询.sql
  6. webstorm 配置webserver选项,让其他ip设备可访问(如手机等测试效果) ...
  7. Integer的比较
  8. 腾讯云服务器连接失败,启动报错:A start job is running for /etc/rc.d/rc.local Compatibility
  9. android layoutinflater原理分析,Android 之 LayoutInflater 全面解析
  10. 5.5mysql_MySQL5.5-MySQL5.5下载 v5.5.60.1官方版 64位/32位-第五资源
  11. 怎么引入oracle驱动包,Maven引入oracle驱动包
  12. 小程序Dialog弹出窗
  13. V$LOGMNR_CONTENTS字段含义
  14. vuejs出的手机app有哪些_vue.js点餐app手机触屏滑动分类菜单切换代码
  15. 如何用python实现爬虫_如何用python实现网络爬虫原理?
  16. 80后十大烦恼的特征
  17. 流程固化、僵化、优化的三个过程
  18. 昆石VOS3000/VOS2009 2.1.6.00 操作指南相关
  19. LCD1602 液晶
  20. 〖Python接口自动化测试实战篇③〗- 什么才是真正的自动化 - 自动化测试的意义又是什么?

热门文章

  1. 设计模式之java-学习笔记
  2. 检测设备是否为模拟器,是否root,禁止截屏
  3. Office2019安装视频教程
  4. shell 月份英数格式转换,月份英文转换成数字
  5. 【repeated time values within panel如何解决】
  6. FreeRTOS个人笔记-互斥量
  7. WinLogon登录管理和GINA简介 (转)
  8. 华为顶级网络工程师分享出这份TCP/IP网络编程笔记,已封神
  9. 7-6 铺设油井管道
  10. Joomla!模板如何工作