你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。
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管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
微信公众号
手机版
快速回复
返回顶部
返回列表
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、跟别的系统兼容,全球统一
评分
查看全部评分
评分
查看全部评分