最近在调试stm32L151单片机,因为业务需要将从RTC获取的时间转换成时间戳。转换的时候发现获取的时间戳一直不对。一直被两个问题困扰。
1.从RTC获取出来的月份为什么比实际月份小1?
2.转换得来的时间戳一直不对。
检查半天发现原来是我没有正确的理解C中的struct tm
struct tm {
int tm_sec; /* 秒,范围从 0 到 59 */
int tm_min; /* 分,范围从 0 到 59 */
int tm_hour; /* 小时,范围从 0 到 23 */
int tm_mday; /* 一月中的第几天,范围从 1 到 31 */
int tm_mon; /* 月份,范围从 0 到 11 */
int tm_year; /* 自 1900 起的年数 */
int tm_wday; /* 一周中的第几天,范围从 0 到 6 */
int tm_yday; /* 一年中的第几天,范围从 0 到 365 */
int tm_isdst; /* 夏令时 */
};
tm.tm_year表示的是自1900起的年数。我一直以为这个是当前的年份。所以导致了时间戳一直不对。
tm.tm_mon表示月份,范围从0到11 也就是说0代表的是1月份。
另外附上RTC其他代码:
static void RTC_Config(void)
{
#if 1
NVIC_InitTypeDef NVIC_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
/* Enable the PWR clock */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR , ENABLE);
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
/* Allow access to RTC */
PWR_RTCAccessCmd(ENABLE);
/* LSE used as RTC source clock */
/* The RTC Clock may varies due to LSE frequency dispersion. */
/* Enable the LSE OSC */
RCC_LSEConfig(RCC_LSE_ON);
//RCC_LSEConfig(RCC_LSE_Bypass);
/* Wait till LSE is ready */
while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)
{
}
/* Select the RTC Clock Source */
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
/* Enable the RTC Clock */
RCC_RTCCLKCmd(ENABLE);
/* Wait for RTC APB registers synchronisation */
if (ERROR == RTC_WaitForSynchro())
{
printf("Wait for RTC APB registers synchronisation Failed\r\n");
}
#endif
/* Calendar Configuration */
RTC_InitStructure.RTC_AsynchPrediv = ;//0x7F;
RTC_InitStructure.RTC_SynchPrediv = 0x120; /* (37KHz / 128) - 1 = 0x120*/
RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24;
if(RTC_Init(&RTC_InitStructure) == ERROR)
{
printf("Rtc_Init failed\r\n");
}
RTC_TimeStampCmd(RTC_TimeStampEdge_Rising,ENABLE);
}
time_t GetTimeStamp(void) //获取时间戳
{
RTC_DateTypeDef sdatestructure;
RTC_TimeTypeDef stimestructure;
struct tm tmstr;
RTC_GetDate(RTC_Format_BIN, &sdatestructure);
RTC_GetTime(RTC_Format_BIN, &stimestructure);
tmstr.tm_year = sdatestructure.RTC_Year;
tmstr.tm_mon = sdatestructure.RTC_Month;
tmstr.tm_mday = sdatestructure.RTC_Date;
tmstr.tm_hour = stimestructure.RTC_Hours;
tmstr.tm_min = stimestructure.RTC_Minutes;
tmstr.tm_sec = stimestructure.RTC_Seconds;
printf("%u-%u-%u-%u-%u-%u.\r\n", tmstr.tm_year+,tmstr.tm_mon+, tmstr.tm_mday, tmstr.tm_hour,tmstr.tm_min, tmstr.tm_sec);
return mktime(&tmstr);
}
void SetRtcTime(time_t timestamp) //设置RTC时间
{
RTC_DateTypeDef sdatestructure;
RTC_TimeTypeDef stimestructure;
struct tm *tmstr;
tmstr = localtime(×tamp);
printf("set>>%u-%u-%u-%u-%u-%u.\r\n", tmstr->tm_year+,tmstr->tm_mon+, tmstr->tm_mday, tmstr->tm_hour,tmstr->tm_min, tmstr->tm_sec);
sdatestructure.RTC_Year = (tmstr->tm_year);
sdatestructure.RTC_Month = tmstr->tm_mon;
sdatestructure.RTC_Date = tmstr->tm_mday;
sdatestructure.RTC_WeekDay = tmstr->tm_wday;
stimestructure.RTC_Hours = tmstr->tm_hour;
stimestructure.RTC_Minutes = tmstr->tm_min;
stimestructure.RTC_Seconds = tmstr->tm_sec;
RTC_SetTime(RTC_Format_BIN,&stimestructure);
RTC_SetDate(RTC_Format_BIN, &sdatestructure);
}
Standard C 语言标准函数库介绍
全面巩固所知所学,往精通方向迈进! Standard C 语言标准函数库速查 (Cheat Sheet) from:http://ganquan.info/standard-c/function/ C ...
C语言的时间函数
下面是C语言的获取本地时间和构造时间进行格式化时间显示输出的相关函数:This page is part of release 3.35 of the Linux man-pages project. ...
C语言-12-日期和时间处理标准库详细解析及示例
概述 标准库 提供了用于日期和时间处理的结构和函数 是C++语言日期和时间处理的基础 与时间相关的类型 clock_t,本质是:unsigned long typedef unsigned long ...
学了C语言,如何写个程序计算出每个月的第一个星期一对应的日期
在前面,我们分别利用泰勒公式和C标准库中的mktime()函数推算了某个特定日期所对应的星期几,刚做完这些,就又遇到了一个与日期相关的新任务: 老板把每个月例会的时间定在了每个月的第一个星期一,他让我 ...
用C语言写个程序推算出是星期几?(用泰勒公式实现)
在日常生活中,我们常常遇到要知道某一天是星期几的问题.有时候,我们还想知道历史上某一天是星期几.比如: “你出生的那一天是星期几啊?” “明年五一是不是星期天?我去找你玩?” 通常,解决这个问题的最简 ...
《你必须知道的495个C语言问题》知识笔记及补充
1. extern在函数声明中是什么意思? 它能够用作一种格式上的提示表明函数的定义可能在还有一个源文件里.但在 extern int f(); 和 int f(); 之间并没有实质的差别. 补充:e ...
awk程序设计语言之-awk基础
awk程序设计语言之-awk基础 http://man.linuxde.net/ 常用工具命令之awk命令 awk是一种编程语言,用于在Linux/Unix下对文本和数据处理.数据可以来自标准输入(s ...
Python学习笔记整理总结【语言基础篇】
一.变量赋值及命名规则① 声明一个变量及赋值 #!/usr/bin/env python # -*- coding:utf-8 -*- # _author_soloLi name1="sol ...
python3+django2 开发易语言网络验证(中)
第四步:网络验证的逻辑开发 1.将model注册到adminx.py中 1.在apps/yanzheng目录下新建admin.py 文件,添加代码: import xadmin from xadmin ...
随机推荐
用 C# 实现一个简单的 Rest Service 供外部调用
用 C# 实现一个简单的 Restful Service 供外部调用,大体总结为4点: The service contract (the methods it offers). How do yo ...
Scrum 项目 7.0 Sprint回顾
7.0------------------------------------------------ Sprint回顾 让我们一次比一次做得更好. 1.回顾组织 主题:“我们怎样才能在下个spr ...
纯CSS3制作皮卡丘动画壁纸
前言 明天就放假了,趁着今晚的空挡时间来写这篇博客——这是我昨晚实现的一个简单的CSS3动画效果.话说还得缘起我逛了一下站酷网,然后不小心看到了一张皮卡丘的手机壁纸,觉得很可爱,然后觉得这种效果是可以 ...
Python Template 错误
ImportError: Settings cannot be imported, because environment variable DJANGO_SETTINGS_MODULE is und ...
Python 练习 21
#!/usr/bin/python # -*- coding: UTF-8 -*- h = 0 leap = 1 from math import sqrt from sys import stdou ...
ubuntu 字体 android stuido 汉字 显示 方块
Ubuntu 12.04 LTS 中安装 windows 字体 ubuntu 中的中文字体看着总觉的有点不爽,于是百度了下,这里记录下怎么在 ubuntu 12.04 中安装 windows 字体 ...
sql server 中 syscolumns 各个字段的意义
列名 数据类型 描述 name sysname 列名或过程参数的名称. id int 该列所属的表对象 ID,或与该参数关联的存储过程 ID. xtype tinyint systypes 中的物理存 ...
在多台服务器上简单实现Redis的数据主从复制
Redis的主从复制功能非常强大,一个master可以拥有多个slave,而一个slave又可以拥有多个slave,如此下去,形成了强大的多级服务器集群架构.下面我演示下怎样在多台服务器上 ...
音频播放器在chrome浏览器,play报错
这个问题是谷歌浏览器的问题:https://www.oschina.net/news/96168/chrome-remove-the-autoplay-policy,可以查看这篇文章 如果你的版本没有 ...