你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。
chrome
firefox
safari
ie8及以上
ST
意法半导体官网
STM32
中文官网
ST
全球论坛
登录/注册
首页
技术问答
话题
资源
创客秀
视频
标签
积分商城
每日签到
stm32时间flash存储格式
[复制链接]
wawawawawa
提问时间:2018-8-15 18:06 /
如题,咨询下大家stm32时间日期存储的时候采用什么格式?bcd格式还是utc时间戳格式,采用bcd格式的话要占用8个字节,采用utc的话,不知道一个存储字节能不能存储?
赞
0
收藏
0
评论
6
分享
发布时间:2018-8-15 18:06
举报
请先
登录
后回复
6个回答
GKoSon
回答时间:2018-8-15 18:40:29
a0a.1 32b0c
怎么方便怎么来 我一般用2种 一种是保存的结构体年月日时分秒 每次结构体写入 结构体读出 另外一种就是时间搓 和网络或者RTC好对接
RTC_SetCounter(secCount);这就是U32就行
/*
函数功能:日期转换为秒并配置RTC
函数参数:年、月、日、时、分、秒
返回值: 返回0成功 其他失败
*/
uint8_t RTC_SetSec(_TM* DATA)
{
uint32_t secCount = 0;
uint16_t i;
uint16_t year=DATA->year;
uint8_t month=DATA->mon;
uint8_t day=DATA->day;
uint8_t hour=DATA->hour;
uint8_t minute=DATA->min;
uint8_t sec=DATA->sec;
if (year <1970 || year >2099)
{
return 1;
}
for (i=1970; i<year; i++)
{
if (isLeapYear(i))
{
secCount += 31622400UL;
}
else
{
secCount += 31536000UL;
}
}
for (i=0; i<month-1; i++)
{
secCount += ((uint32_t)monthTable[i]*86400UL);
if (isLeapYear(year) && i==1) //润年 多加一天
{
secCount += 86400UL;
}
}
secCount += (uint32_t)(day-1) * 86400UL;
secCount += (uint32_t)(hour)*3600;
secCount += (uint32_t)(minute)*60;
secCount += (uint32_t)(sec);
/*执行以下操作可以使能对备份寄存器和 RTC 的访问:
1)通过设置寄存器 RCC_APB1ENR 的 PWREN 和 BKPEN 位来打开电源和后备接口的时钟
2)电源控制寄存器(PWR_CR)的 DBP 位来使能对后备寄存器和 RTC 的访问
*/
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_BKP, ENABLE);
PWR_BackupAccessCmd(ENABLE);
RTC_SetCounter(secCount);
RTC_WaitForLastTask();
return 0;
}
评分
参与人数
1
蝴蝶豆
+4
收起
理由
zero99
+ 4
查看全部评分
赞
0
评论
回复
支持
反对
stm32learnning
回答时间:2018-8-15 20:41:06
a1024a.1 32b0c
评分
参与人数
1
ST金币
-1
收起
理由
zero99
-1
求助帖禁止灌水
查看全部评分
赞
0
评论
回复
支持
反对
feixiang20
回答时间:2018-8-15 23:05:09
a0a.1 32b0c
要么去参考参考STM32中time.h文件详解,RTC实时时钟实验—显示日期和时间等资料,至于详细说明,可参考
http://blog.csdn.net/wyzjoyful/article/details/52745918
, 就不长篇贴了
评分
参与人数
1
蝴蝶豆
+2
收起
理由
zero99
+ 2
查看全部评分
赞
0
评论
回复
支持
反对
STM1024
回答时间:2018-8-16 08:52:26
a0a.1 32b0c
当然是使用时间戳的方式更省空间了
评分
参与人数
1
蝴蝶豆
+1
收起
理由
zero99
+ 1
查看全部评分
赞
0
评论
回复
支持
反对
CC4
回答时间:2018-8-16 09:36:25
a0a.1 32b0c
习惯使用时间戳。好处是:
1、一个变量就能存储
2、可以很方便转换出任意想要的时间显形式
3、可以很方便的时间计算。
4、跟别的系统兼容,全球统一
评分
参与人数
1
蝴蝶豆
+3
收起
理由
zero99
+ 3
查看全部评分
赞
0
评论
回复
支持
反对
废鱼
回答时间:2018-8-16 11:32:42
a0a.1 32b0c
用时间戳的方式比较好,4个字节。可以用通用的TIME.H来转换时间,比我们自己去算的要好的多。我们自己写的容易出bug。我见过一个正好是1号0点时,他算的结果是32号。
评分
参与人数
1
蝴蝶豆
+2
收起
理由
zero99
+ 2
查看全部评分
赞
0
评论
回复
支持
反对
所属标签
相似问题
关于
意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号
手机版
快速回复
返回顶部
返回列表
RTC_SetCounter(secCount);这就是U32就行
/*
函数功能:日期转换为秒并配置RTC
函数参数:年、月、日、时、分、秒
返回值: 返回0成功 其他失败
*/
uint8_t RTC_SetSec(_TM* DATA)
{
uint32_t secCount = 0;
uint16_t i;
uint16_t year=DATA->year;
uint8_t month=DATA->mon;
uint8_t day=DATA->day;
uint8_t hour=DATA->hour;
uint8_t minute=DATA->min;
uint8_t sec=DATA->sec;
if (year <1970 || year >2099)
{
return 1;
}
for (i=1970; i<year; i++)
{
if (isLeapYear(i))
{
secCount += 31622400UL;
}
else
{
secCount += 31536000UL;
}
}
for (i=0; i<month-1; i++)
{
secCount += ((uint32_t)monthTable[i]*86400UL);
if (isLeapYear(year) && i==1) //润年 多加一天
{
secCount += 86400UL;
}
}
secCount += (uint32_t)(day-1) * 86400UL;
secCount += (uint32_t)(hour)*3600;
secCount += (uint32_t)(minute)*60;
secCount += (uint32_t)(sec);
/*执行以下操作可以使能对备份寄存器和 RTC 的访问:
1)通过设置寄存器 RCC_APB1ENR 的 PWREN 和 BKPEN 位来打开电源和后备接口的时钟
2)电源控制寄存器(PWR_CR)的 DBP 位来使能对后备寄存器和 RTC 的访问
*/
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_BKP, ENABLE);
PWR_BackupAccessCmd(ENABLE);
RTC_SetCounter(secCount);
RTC_WaitForLastTask();
return 0;
}
评分
查看全部评分
评分
查看全部评分
评分
查看全部评分
评分
查看全部评分
1、一个变量就能存储
2、可以很方便转换出任意想要的时间显形式
3、可以很方便的时间计算。
4、跟别的系统兼容,全球统一
评分
查看全部评分
评分
查看全部评分