打印
[STM32]

能不能将变量声明在stm32的flash?

[复制链接]
3054|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
单模先声|  楼主 | 2018-4-22 16:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
dirtwillfly| | 2018-4-22 21:05 | 只看该作者
应该可以。不过一般没必要啊,stm32有几兆ram的,这还不够用吗?

使用特权

评论回复
评论
dirtwillfly 2018-4-25 19:05 回复TA
@ddb_21ic :STM32H7有1 Mbyte of SRAM 
ddb_21ic 2018-4-25 14:36 回复TA
哪里来的几MB的RAM?常用的103才20KB 
板凳
单模先声|  楼主 | 2018-4-22 21:17 | 只看该作者
dirtwillfly 发表于 2018-4-22 21:05
应该可以。不过一般没必要啊,stm32有几兆ram的,这还不够用吗?

我的目的是为了不外置flash的情况下掉电**。。。

使用特权

评论回复
地板
xyz549040622| | 2018-4-22 21:54 | 只看该作者
你是想要flash模拟eeprom吧,网上有类似的例子不少的。

使用特权

评论回复
5
单模先声|  楼主 | 2018-4-22 22:35 | 只看该作者
xyz549040622 发表于 2018-4-22 21:54
你是想要flash模拟eeprom吧,网上有类似的例子不少的。

是的,我想问的是能不能将变量声明在flash

使用特权

评论回复
6
linqing171| | 2018-4-22 23:03 | 只看该作者
标准c的话,加上链接器配合,可以直接声明在flash,但是肯定是只读的。写的话还是要调用写flash的函数。用 & 运算符取变量的地址。
如果用IAR编译器的话,可以自定义存储关键字。你按照它的教程顶一个  __myFlashVar ,然后实现对应的两个read和write函数就可以了。

使用特权

评论回复
7
xyz549040622| | 2018-4-23 07:03 | 只看该作者
单模先声 发表于 2018-4-22 22:35
是的,我想问的是能不能将变量声明在flash

参考楼下的意见。

使用特权

评论回复
8
yu0405jie| | 2018-4-23 10:27 | 只看该作者
一个变量声明为const的时候,他就在flash里面了,这是只读的,要写的话还得通过flash写函数,另外就是注意擦除的问题,所以最好的办法还是像6楼所说的,与链接文件配合

使用特权

评论回复
9
单模先声|  楼主 | 2018-4-23 11:43 | 只看该作者
linqing171 发表于 2018-4-22 23:03
标准c的话,加上链接器配合,可以直接声明在flash,但是肯定是只读的。写的话还是要调用写flash的函数。用  ...

如果我隔一段时间去将变量保存在flash,但是这样做好像不能保证及时保存啊。比如保存的前一秒断电了,这样数据不就出错了吗?

使用特权

评论回复
10
linqing171| | 2018-4-23 13:48 | 只看该作者
单模先声 发表于 2018-4-23 11:43
如果我隔一段时间去将变量保存在flash,但是这样做好像不能保证及时保存啊。比如保存的前一秒断电了,这 ...

是的,保存的前一秒断电,只是数据是之前的数据。
如果保存的擦写之间断电,数据被擦了没有存,就全错了。
如果保存的次数多了,flash被写穿了,坏了,以后不能存东西了。那么芯片也就报废了。非挥发存储器都是有寿命的,存储寿命和读写寿命是不同的。
一般低端的MCU,程序flash在写的时候是不能读的,也就是写flash那几十毫秒内,程序是暂停执行的,有苛刻任务的时候要考虑。

为了解决这些问题,各种办法出现了。比如负载磨损均衡算法,比如日志双备份文件系统,比如外置百万次擦写寿命EEPROM的架构,比如高寿命的FRAM... ... 。从商业用途到特种用途,具体方案具体分析,总有一个方案适合你。但是万能的解决方案还需要你们来找到。

使用特权

评论回复
11
单模先声|  楼主 | 2018-4-23 16:13 | 只看该作者
linqing171 发表于 2018-4-23 13:48
是的,保存的前一秒断电,只是数据是之前的数据。
如果保存的擦写之间断电,数据被擦了没有存,就全错了 ...

如果外置百万次擦写寿命EEPROM,是不是也是采用频繁保存数据这种方法?
如果是这样的,这些问题就还是解决不了了(保存的前一秒断电,只是数据是之前的数据。
如果保存的擦写之间断电,数据被擦了没有存,就全错了。)

使用特权

评论回复
12
xch| | 2018-4-23 18:09 | 只看该作者
单模先声 发表于 2018-4-23 11:43
如果我隔一段时间去将变量保存在flash,但是这样做好像不能保证及时保存啊。比如保存的前一秒断电了,这 ...

平时存在ram,掉电中断时才写入flash,做好时间戳和校验,两个扇区轮换,只擦除久数据扇区,保持有一个最新的没有差错的数据记录。

使用特权

评论回复
13
nuaabob| | 2018-4-23 20:53 | 只看该作者
应该是不行的

使用特权

评论回复
14
linqing171| | 2018-4-23 21:33 | 只看该作者
dying gasp电路 加 宽电压的EEPROM,加双倍分等算法, 这是比较常见的做法。用EEPROM而不是flash。
还有一种就是dallas的专用超低功耗的RAM,带后背电池的,可以存30年。
很久以前读书的时候,用PCF8583,加个电池,就可以来存数据了,不过容量很小,那个时钟芯片的耗电也很小。

使用特权

评论回复
15
单模先声|  楼主 | 2018-4-23 22:03 | 只看该作者
linqing171 发表于 2018-4-23 21:33
dying gasp电路 加 宽电压的EEPROM,加双倍分等算法, 这是比较常见的做法。用EEPROM而不是flash。
还有一 ...

感谢你的回复。我知道该怎么做了

使用特权

评论回复
16
单模先声|  楼主 | 2018-4-23 22:04 | 只看该作者
fxmxh 发表于 2018-4-23 18:39
你这要求,一定要配合合理的硬件电路来搞才有解,也就是要有掉电检测电路,而且还要在检测到掉电时,要有 ...

感谢你的回复。我知道该怎么做了

使用特权

评论回复
17
877049204| | 2018-4-24 08:34 | 只看该作者
学习学习新知识

使用特权

评论回复
18
dzguang| | 2018-4-24 23:40 | 只看该作者
变量是存在内存里的,怎么声明Flash里呢?
Flash里存的是常量,你可以通过指针的方式读取出来,使用。
如果经常修改的话,还是不要用了,毕竟Flash寿命就那么长。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

87

主题

570

帖子

1

粉丝