你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

123
返回列表 发新帖
楼主: 北京小王儿

《九九的STM32笔记》整理

[复制链接]

0

主题

2

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
发表于 2009-5-30 16:17:13 | 显示全部楼层

RE:《九九的STM32笔记》整理

谢谢!!
回复 支持 反对

使用道具 举报

1

主题

14

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
发表于 2009-5-31 21:32:59 | 显示全部楼层

RE:《九九的STM32笔记》整理

学习学习。
回复 支持 反对

使用道具 举报

0

主题

12

回帖

0

蝴蝶豆

新手上路

最后登录
2018-11-1
发表于 2009-6-9 09:37:10 | 显示全部楼层

回复:《九九的STM32笔记》整理

受益匪浅
回复 支持 反对

使用道具 举报

0

主题

12

回帖

0

蝴蝶豆

新手上路

最后登录
2018-11-1
发表于 2009-6-9 09:37:13 | 显示全部楼层

回复:《九九的STM32笔记》整理

受益匪浅
回复 支持 反对

使用道具 举报

0

主题

3

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
发表于 2009-7-2 17:14:45 | 显示全部楼层

RE:《九九的STM32笔记》整理

找的就是这样得资料,谢谢!
回复 支持 反对

使用道具 举报

0

主题

3

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
发表于 2010-6-10 11:04:06 | 显示全部楼层

RE:《九九的STM32笔记》整理

好呀!顶,非常感谢!
回复 支持 反对

使用道具 举报

0

主题

7

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
发表于 2010-6-21 15:31:39 | 显示全部楼层

RE:《九九的STM32笔记》整理

学习自持,要顶啊
回复 支持 反对

使用道具 举报

0

主题

18

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
发表于 2010-9-1 22:46:16 | 显示全部楼层

RE:《九九的STM32笔记》整理

非常感谢!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!111
回复 支持 反对

使用道具 举报

0

主题

5

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
发表于 2010-9-4 10:31:14 | 显示全部楼层

RE:《九九的STM32笔记》整理

请不要纯表情回复
回复 支持 反对

使用道具 举报

1

主题

10

回帖

0

蝴蝶豆

新手上路

最后登录
2020-1-16
发表于 2013-7-1 11:57:50 | 显示全部楼层

回复:《九九的STM32笔记》整理

回复第 6 楼 于2009-03-26 13:56:03发表:
基于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.h库,几天发现竟然出现2013年6月31日,而且读出来的星期不准确。
 
回复 支持 反对

使用道具 举报

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版