stm32f103c8t6引脚图 存储协议怎么写

查看: 8674|回复: 17
关于STM32掉电数据保存问题!
主题帖子精华
金牌会员, 积分 1164, 距离下一级还需 1836 积分
在线时间151 小时
STM32F103ZET6的最小系统版,用什么做数据存储好?项目要求对部分数据(大概16bit*1000个数据)进行保存,要求开机运行时,将数据读入程序中运行,由于小弟还要跟触摸屏进行modbus-rtu通信(通信已经调通),能够在触摸屏上对数据进行修改,同时要求修改的数据能保存到存储介质,部分数据是不停改变的,所以需要实时保存,也就是说对于一些特殊数据需要在掉电的瞬间保存它的值,而有些数据(大部分)需要通过触摸屏控制保存(一个数据帧,STM32判别后进行处理),这部分数据不要求实时保存。现在不知道用什么存储介质比较好,要求数据读写精确,速度快,求指导!!!
FRAM铁电存储器
电子人生!
主题帖子精华
中级会员, 积分 236, 距离下一级还需 264 积分
在线时间0 小时
FRAM铁电存储器
目前在玩STM32,BBB,RPi
主题帖子精华
金牌会员, 积分 1251, 距离下一级还需 1749 积分
在线时间119 小时
STM32可以通过PVD实现掉电保存数据,不过你要保存的数据太多了,保存不到一半就掉到工作电压以下了。
主题帖子精华
高级会员, 积分 640, 距离下一级还需 360 积分
在线时间27 小时
保存数据太多基本不可以实现
主题帖子精华
高级会员, 积分 640, 距离下一级还需 360 积分
在线时间27 小时
除非用电池接着供电
主题帖子精华
金牌会员, 积分 1164, 距离下一级还需 1836 积分
在线时间151 小时
回复【2楼】solo:
---------------------------------
不是的,大部分数据都是在工作时保存的,只有不超过20个数据是在掉电的时候保存的(这些数据在程序运行中会不断改变),,为了确保数据保存时是工作结束的那个值
电子人生!
主题帖子精华
金牌会员, 积分 1164, 距离下一级还需 1836 积分
在线时间151 小时
回复【3楼】w0rmis20:
---------------------------------
求推荐一款芯片型号
电子人生!
主题帖子精华
金牌会员, 积分 1164, 距离下一级还需 1836 积分
在线时间151 小时
回复【4楼】三叶草:
---------------------------------
大部分数据是在工作时保存的啊,我按下触摸屏上的一个按钮,就可以给我的STM32一个数据帧,我判别这个数据帧,然后开启数据保存的函数(大量数据),要求这些数据掉电之后重新上电能够准确无误的读到程序中。只有少数是需要掉电瞬间保存的,掉电瞬间保存的都是不断改变的实时数据,所以需要在掉电一瞬间记录其数值
电子人生!
主题帖子精华
金牌会员, 积分 1164, 距离下一级还需 1836 积分
在线时间151 小时
回复【2楼】solo:
---------------------------------
16bit*1000个数据这些数据不是在掉电瞬间保存的啊,只是能够记忆这些数据,这是正常工作时候保存的,只要保存的存储介质能够在掉电之后重新上电能够准确读出就OK了,我没有说必须要在掉电一瞬间保存那么多数据啊,
电子人生!
主题帖子精华
中级会员, 积分 287, 距离下一级还需 213 积分
在线时间42 小时
EEPROM存储器&&&24C016够用吧?
主题帖子精华
中级会员, 积分 287, 距离下一级还需 213 积分
在线时间42 小时
楼主项目跟我类似
主题帖子精华
金牌会员, 积分 1164, 距离下一级还需 1836 积分
在线时间151 小时
回复【11楼】yy:
---------------------------------
24C016,I2C接口吗?
电子人生!
主题帖子精华
金牌会员, 积分 1251, 距离下一级还需 1749 积分
在线时间119 小时
回复【6楼】翱翔云端的鸟:
---------------------------------
看这个帖子:/posts/list/39501.htm
主题帖子精华
金牌会员, 积分 1164, 距离下一级还需 1836 积分
在线时间151 小时
回复【13楼】solo:
---------------------------------
你的意思是在PVD掉电中断中保存实时改变的20个数据吗?
电子人生!
主题帖子精华
金牌会员, 积分 1251, 距离下一级还需 1749 积分
在线时间119 小时
回复【14楼】翱翔云端的鸟:
---------------------------------
对,这个方法可以实现掉电应急操作,不过前提是要接后背电池。不过20个数据有点多,自己测试下,数据多了可能执行不完操作。
主题帖子精华
中级会员, 积分 222, 距离下一级还需 278 积分
在线时间17 小时
BKP可破,怎么保存看自己的程序逻辑。20个字节还是有的。
主题帖子精华
高级会员, 积分 640, 距离下一级还需 360 积分
在线时间27 小时
关键是看你用的是什么电源供电,线性电源掉的很快,开关电源有个缓慢掉电的过程,最后电源后端接一个大一点的点解电容,让电源缓慢掉电;然后存储器最好用EEPROM,不建议用Flash,EE的速度比flash快很多,可以在掉电的瞬间保存数据;你也可以用AD实时采集电源输入端电压,掉到一定电压判定为掉电,判定后立即保存数据,前提是你的电源电压要稳定。
主题帖子精华
金牌会员, 积分 1164, 距离下一级还需 1836 积分
在线时间151 小时
回复【17楼】三叶草:
---------------------------------回复【17楼】三叶草:
---------------------------------
OK!我去试试
电子人生!
Powered by查看: 1193|回复: 4
STM32F103系列片内资源有没有掉电不丢失的存储空间?
主题帖子精华
中级会员, 积分 211, 距离下一级还需 289 积分
在线时间3 小时
STM32F103系列片内资源有没有掉电不丢失的存储空间?求赐教!!!
原子老大STMFLASH章节
主题帖子精华
在线时间529 小时
原子老大STMFLASH章节
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
主题帖子精华
在线时间83 小时
有&&&内部的Flash掉电不会丢失数据的
主题帖子精华
中级会员, 积分 211, 距离下一级还需 289 积分
在线时间3 小时
回复【2楼】龙之谷:
---------------------------------
十分感谢!
主题帖子精华
中级会员, 积分 211, 距离下一级还需 289 积分
在线时间3 小时
回复【3楼】合肥-文盲:
---------------------------------
十分感谢
Powered by查看: 1772|回复: 14
关于结构体数据在stm32f103中的存放方式和对齐方式。
主题帖子精华
新手上路, 积分 24, 距离下一级还需 26 积分
在线时间3 小时
[img]file:///C:\Documents and Settings\Administrator\Application Data\Tencent\Users\\QQ\WinTemp\RichOle\OE7XQ[}UK9H3_CBI$YTJ~CL.png[/img]结构体如下所示,
typedef union int16un
uint8_t b[2];
typedef union int32un
uint8_t b[4];
typedef struct HawkerPacket_tt
uint8_t header[2];
}HawkerPacket_t;
& && &&&up.header[0]=0xAA;
& && &&&up.header[1]=0xAA;
& && &&&up.cmd=1;
& && &&&up.len=18;
& && &&&up.roll.val= 12;
& & & & up.pitch.val= 25;
& & & & up.yaw.val= 37;
& & & & up.alti.val=43;& & & & & & & &
& & & & up.temp.val=52;
& & & & up.pres.val=67;
& & & & up.speed.val=74;
由于要用串口发送结构体中的数据给上位机,所以有发送代码(up为HawkerPacket_t结构体):
& && && && && && && && &for(i=0;i&10;i++)& & & & & & & &
& & & & & & & & & & & & & & & & sendPCBuf=*((uint8_t *)(&up) + i);
& & & & & & & & & & & & for(i=10;i&16;i++)
& & & & & & & & & & & & & & & & sendPCBuf=*((uint8_t *)(&up) + 2+i);&&(为什么要加2)
& & & & & & & & & & & & for(i=16;i&23;i++)
& & & & & & & & & & & & & & & & sendPCBuf=*((uint8_t *)(&up) + 4+i);&&(为什么要加4)
最后输出结构体变量地址,8位的发:
&sendPC[0] = &&& & & & & & & & +28地址
&sendPC[1] = &&& & & & & & & & +28
&sendPC[2] = &&& & & & & & & & +28
&sendPC[3] = &&& & & & & & & & +28
&sendPC[4] = &&& & & & & & & & +28
&sendPC[5] = &&& & & & & & & & +28
&sendPC[6] = &&& & & & & & & & +28
&sendPC[7] = &&& & & & & & & & +28
&sendPC[8] = &&& & & & & & & & +28
&sendPC[9] = & && & & && && && &+84 地址
&sendPC[10] =
& & & & & & & & +28
&sendPC[11] =
& & & & & & & & +28
&sendPC[12] =
& & & & & & & & +28
&sendPC[13] =
& & & & & & & & +28
&sendPC[14] =
& & & & & & & & +28
&sendPC[15] = &&& & & && && && &+84地址
&sendPC[16] =
& & & & & & & & +28
&sendPC[17] =
& & & & & & & & +28
&sendPC[18] =
& & & & & & & & +28
&sendPC[19] =
& & & & & & & & +28
&sendPC[20] = & & & & & & & & +28
&sendPC[21] =
& & & & & & & & +28
&sendPC[22] =
为什么输出的地址相差28????????????????????还有相差84??
但是打印输出数据又没错,如下所示:
sendPC[0] = 170& &(header[0])
sendPC[1] = 170& &(header[1])
sendPC[2] = 1& &&&(cmd)
sendPC[3] = 18& & (len)
sendPC[4] = 0
sendPC[5] = 12& & (roll)
sendPC[6] = 0
sendPC[7] = 25& & (pitch)
sendPC[8] = 0
sendPC[9] = 37& &&&(yaw)
sendPC[10] = 0
sendPC[11] = 0
sendPC[12] = 0
sendPC[13] = 43& & (alti)
sendPC[14] = 0
sendPC[15] = 52& & (temp)
sendPC[16] = 0
sendPC[17] = 0
sendPC[18] = 0
sendPC[19] = 67& &&&(pres)
sendPC[20] = 0
sendPC[21] = 74& &&&(speed)
sendPC[22] = 0
有同仁能指点下么?钱不够,望笑纳
我算明白你这代码是啥意思了,写的不伦不类的,
我看到你上面的代码,了解到up的地址为(我们都是用十六进制的,0x)
i = 9时,(&up) + i) = 0x + 9*sizeof(up) ,也就是你打印出的&sendPC[9] = 那一行
i = 10时,(&up) + i+2) = 0x + (10+2)*sizeof(up) ,也就是你打印出的&sendPC[10] = 那一行
所以前后差值为3*sizeof(up) =84确凿无误,前文已经解释了。
主题帖子精华
金牌会员, 积分 2562, 距离下一级还需 438 积分
在线时间287 小时
sendPC就是sendPCBuf,一下为其类型:
static uint8_t sendPCBuf[64]={0xAA,0xAA,0x01,0x14,0,100,0,200 ...
我算明白你这代码是啥意思了,写的不伦不类的,
我看到你上面的代码,了解到up的地址为(我们都是用十六进制的,0x)
i = 9时,(&up) + i) = 0x + 9*sizeof(up) ,也就是你打印出的&sendPC[9] = 那一行
i = 10时,(&up) + i+2) = 0x + (10+2)*sizeof(up) ,也就是你打印出的&sendPC[10] = 那一行
所以前后差值为3*sizeof(up) =84确凿无误,前文已经解释了。
我明白楼主是什么意思,诚然,其结构体默认的4字节对齐会导致结构体内和结构体之间不紧凑,但我们使用结构体通常是使用“.”便列出成员没什么问题,只有在将结构体当成数据包发送出去的时候才需要考虑把那些编译器保留的为了对齐的单元跳过不发(你代码中+2,+4就是源于此),这一点只需要翻开C语言的基础就可以获得答案
坚持使用寄存器,拒绝重复造轮子。
主题帖子精华
金牌会员, 积分 2562, 距离下一级还需 438 积分
在线时间287 小时
首先,结构体的存储方式和对齐方式是由编译器确定的,与STM32无关,
默认是四字节对齐,包括结构体内的成员和结构体的size,详解:
[C] 纯文本查看 复制代码typedef struct HawkerPacket_tt
uint8_t header[2];
/* 下一个是32位数据要四字节对齐 */
/* 此处会预留 2 字节 */
/* 下一个是32位数据要四字节对齐 */
/* 此处会预留 2 字节 */
/* 整个结构体要四字节对齐 */
/* 此处会补充 1 字节 */
} HawkerPacket_t;
这个结构体的size是28。
这样就很容易解释为什么串口发送时要+2,+4了,那是为了越过编译器保留的两处2字节保留空间
如果sendPC的类型是(HawkerPacket_t *)的话,
那么(&sendPC[k+1] - &sendPC[k])恒为28(即sizeof(HawkerPacket_t )),你给的数据9-10之间竟差84,这我表示怀疑。
但是你又给出“sendPC[0] = 170”这样的语句,究竟是何意?sendPC究竟是什么类型???
坚持使用寄存器,拒绝重复造轮子。
主题帖子精华
金牌会员, 积分 1696, 距离下一级还需 1304 积分
在线时间280 小时
&&拿走,不谢
主题帖子精华
新手上路, 积分 24, 距离下一级还需 26 积分
在线时间3 小时
首先,结构体的存储方式和对齐方式是由编译器确定的,与STM32无关,
默认是四字节对齐,包括结构体内的 ...
sendPC就是sendPCBuf,一下为其类型:
static uint8_t sendPCBuf[64]={0xAA,0xAA,0x01,0x14,0,100,0,200,0,130,0,0,0,100,0,0,0,200,0,0,0,30,0,10,0x6B};
关于地址差28和84那么多,我也不知道,我就是打印出(&up) + i)、(&up) + 2+i)、(&up) + 4+i)的地址:printf(&sendPC[%d]=%d\n&,i,(&up) + i));这种语句,另外两个循环分别打印:
& && && &&&printf(&sendPC[%d]=%d\n&,i,((&up) + i+2))和 printf(&sendPC[%d]=%d\n&,i,((&up) + i+4)).
主题帖子精华
新手上路, 积分 24, 距离下一级还需 26 积分
在线时间3 小时
/forum.php?mod=viewthread&tid=27512&&拿走,不谢
如果说我们的数据存储在内存中的位置跟地址有关,比如一个long型变量,由于地址4975中都没有能被4(因为sizeof(long)=4bytes)整除的,那么就得继续放到1244976地址,1244976能被4整除,所以long应该放在1244976处。& && && & 这样说的话,我们的数据存的位置还跟起始放置的位置有关,那么,我们在设置结构体的时候,我们又不知道结构体被放到那个起始地址,这样的话,我们要取数据出来,那不得先把每一个数据的地址输出,然后根据具体地址取出数据吗?????请赐教。谢谢
主题帖子精华
金牌会员, 积分 1696, 距离下一级还需 1304 积分
在线时间280 小时
如果说我们的数据存储在内存中的位置跟地址有关,比如一个long型变量,由于地址4975中都没有 ...
你怎么拿全局变量运算的,有必要知道地址吗? a.b不就是你要的值吗
我有故事,你有酒吗
主题帖子精华
新手上路, 积分 24, 距离下一级还需 26 积分
在线时间3 小时
我算明白你这代码是啥意思了,写的不伦不类的,
i= 9时,(&up) + i) = 0x + 9*sizeof(up) ,也就是你打印出的&sendPC[9] = 那一行
i = 10时,(&up) + i+2) = 0x + (10+2)*sizeof(up) ,也就是你打印出的&sendPC[10] = 那一行
你好,你说的这个我还是没能理解,这里i=9时,((&up)+i)不是应该等于0x + 9么,为什么要乘sizeof(up),& & up是结构体呀,地址不是都在结构体范围内吗?乘以sizeof(up)那这地址不就跑出多个结构体大小范围了。。。。不懂,还望指点迷津。。谢谢
主题帖子精华
金牌会员, 积分 2562, 距离下一级还需 438 积分
在线时间287 小时
i= 9时,(&up) + i) = 0x + 9*sizeof(up) ,也就是你打印出的&sendPC[9] = 那一行
你暴露了,
两个选择:
1、放弃这个问题
2、回去找本C语言基础入门重新学习三个月,尤其是指针和结构体那两章
----分割线-----
恕我不能继续给你解答,因为这在任意一本教材里都能找到答案
坚持使用寄存器,拒绝重复造轮子。
主题帖子精华
新手上路, 积分 24, 距离下一级还需 26 积分
在线时间3 小时
你怎么拿全局变量运算的,有必要知道地址吗? a.b不就是你要的值吗
可是我现在用把结构体用串口发送给上位机,而串口只能一个字节一个字节的发,不是应该知道每个地址吗。我知道对齐+2,+4的原因,只是对打印出来的地址相差值28,&&84不理解。。
主题帖子精华
金牌会员, 积分 2562, 距离下一级还需 438 积分
在线时间287 小时
你暴露了,
两个选择:
回去查查,对于一个指针来说“p++”意味着什么、、
坚持使用寄存器,拒绝重复造轮子。
主题帖子精华
新手上路, 积分 24, 距离下一级还需 26 积分
在线时间3 小时
回去查查,对于一个指针来说“p++”意味着什么、、
题目是加一个结构体的大小,但是那不是跑出结构体了吗。那变量存在结构体之外么。麻烦解惑。好久没弄C了,兴趣玩四轴才看看的。
主题帖子精华
新手上路, 积分 24, 距离下一级还需 26 积分
在线时间3 小时
回去查查,对于一个指针来说“p++”意味着什么、、
哦。我知道了。输出的地址是超出了结构体,而且输出的地址没有错。&&实际上这些地址上是没有结构体变量的值的,我开始误以为是有变量也存在这些地址上dizzy:& && && &是我输出地址代码写错了。&&应该是 printf(&sendPC[%d] addr = %d\r\n&,i,((uint8_t *)(&up) + i));要将地址转换成指针类型。
sendPC[1] addr =
sendPC[2] addr =
sendPC[3] addr =
sendPC[4] addr =
sendPC[5] addr =
sendPC[6] addr =
sendPC[7] addr =
sendPC[8] addr =
sendPC[9] addr =
sendPC[10] addr =
sendPC[11] addr =
sendPC[12] addr =
sendPC[13] addr =
sendPC[14] addr =
sendPC[15] addr =
sendPC[16] addr =
sendPC[17] addr =
sendPC[18] addr =
sendPC[19] addr =
sendPC[20] addr =
sendPC[21] addr =
sendPC[22] addr =
主题帖子精华
金牌会员, 积分 1696, 距离下一级还需 1304 积分
在线时间280 小时
可是我现在用把结构体用串口发送给上位机,而串口只能一个字节一个字节的发,不是应该知道每个地址吗。我 ...
struct _aa
{u8 a,u8 b}
usart_send(aa.a);usart_send(aa.b);
难道有任何问题吗,这不就是发送结构体内容吗
我有故事,你有酒吗
主题帖子精华
新手上路, 积分 24, 距离下一级还需 26 积分
在线时间3 小时
struct _aa
{u8 a,u8 b}
usart_send(aa.a);usart_send(aa.b);
可是我结构体中的很多数据不是8位类型,很多是16位的,32位的数据类型,就不能这样了呀。
Powered bySTM32F103xx系列单片机介绍_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
STM32F103xx系列单片机介绍
上传于||文档简介
&&单​片​机​ ​非​M​C​S1​ ​集​成​A​D​C​ ​ ​较​大​存​储​器​容​量
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩15页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢}

我要回帖

更多关于 stm32f103 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信