你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

求助!stm32的flash这样用貌似有点问题

[复制链接]
yangsangelaile 提问时间:2016-1-6 12:53 /
本帖最后由 yangsangelaile 于 2016-1-6 12:57 编辑

我们知道stm32的flash是按32bit写入的,对应位只能由1变0,要反过来只有通过片、块、段擦除:有个对时间和电能都要求极度严格的应用里面,我按这个流程这样来写入flash的数据:
启动-解锁flash
写入0b 0001,
上锁-关机
启动
写入0b 0011,
关机
启动
写入0b 0111
关机
以此类推写入(有点像写正字计数的道理,中间还有逻辑判断的过程不表)
0b1111
0b11111
0b111111
0b1111111
就是这个样子,理论上来说,flash只能由1变0,不能反过来,所以按照我的方法每次往高位的bit写入的时候是不影响低位已经写入的bit位的.
但是我在程序里面发现,前面几次都能正常运行,但是当已经写入到0xf的时候,下次本应该写入0x1f,却写入失败了,无效,通过SW调试接口看到这个flash地址上的数据根本就没变化!再往下写入0x3f的时候却变成了0x7f。。。我的程序找个空白地方,单独写入任何数据都没问题。还有,调试的时候jlink供电,不缺电
换过机器各种代码,发现问题应该就在这个flash的控制上面,这里跪求对stm32精通的大大出来解释一些这种现象的原因了
MCU是stm32L051K8
调试环境是 keil MDK-ARM 5.17+jlink
收藏 1 评论19 发布时间:2016-1-6 12:53

举报

19个回答
yangsangelaile 回答时间:2016-1-9 08:53:08
65536 发表于 2016-1-8 09:15
我有点不大懂啊,不是说写的话,只能由1变0吗,那你怎么实现的在同一位置写入0b 0001之后,再次写入0b 0011 ...

这个我是这样理解的,理论上flash写入的时候只能从1变0,但是你用仿真器看到的,是0变1,这个逻辑是反的,但是不影响我们判断嘛,估计是芯片内部逻辑方面的问题。在MSP430F系列里面,flash格式以后就是0XFF,写入就只能从1变0,这个stm32格式化以后全部是0X00,只能0变1,不知道这样表述懂我的意思没有。或者你吧前面的话,理解成,stm32格式户以后只能0变1.
在我的这个测试里面,stm32格式化后全部是0x00,所以我的写入方式是可以的,只是出现了不可理解的结果
yangsangelaile 回答时间:2016-1-6 22:23:07
本帖最后由 yangsangelaile 于 2016-1-6 22:29 编辑
安 发表于 2016-1-6 16:49
ST单次写入的是双字节型的,理论是写入一次后,这一位就不会被写入了。

对于这个双字单元,我第一次写入0X0000 00FF,第二次再往这个地方写0x0000 FF FF 还是可以成功的,再写0x00FF FFFF 也是可以的,但是再写0xFFFF FFFF就会变成0xFFFF FF7F,就有点感觉逻辑错误的问题,应该是芯片内部的逻辑问题吧。写了段小代码,循环这么写不同的地址,写了几KB都是一样的结果
拼命三郎 回答时间:2016-1-9 20:24:37
yangsangelaile 发表于 2016-1-9 08:53
这个我是这样理解的,理论上flash写入的时候只能从1变0,但是你用仿真器看到的,是0变1,这个逻辑是反的 ...

这个样子啊  那我理解了  我C8051系列的用的多一些,C8051擦除后就是0xFF还,没用过STM32的FLASH擦写。
yangsangelaile 回答时间:2016-1-6 13:01:08
重要的事情,再说一遍,真的很缺电和时间,这样做就是为了减少flash擦除的时间,避免使用eeprom的电能消耗,不用32bit来计数,是为了尽量节约flash.
废鱼 回答时间:2016-1-6 13:39:00
单个地址只能写入一次,而且需要擦除,再就是看一下这个写入地址,在flash分布中,是否有其他应用。
yangsangelaile 回答时间:2016-1-6 14:51:54
安 发表于 2016-1-6 13:39
单个地址只能写入一次,而且需要擦除,再就是看一下这个写入地址,在flash分布中,是否有其他应用。 ...

裸机单跑这个小程序,理论上是只能写入一次,我这么做只是想充分利用好flash的每个BIT,前几次写入也是成功的,只是后面有点问题
yanhaijian 回答时间:2016-1-6 15:29:21
这个问题我在做STC单片机时也遇到,我也没分析出原因,但是我想办法把这个问题给避掉。
zhangdaijin 回答时间:2016-1-6 15:38:37
xmshao 回答时间:2016-1-6 15:49:56
stm32L051K 自带2K eeprom 不能用?
yangsangelaile 回答时间:2016-1-6 16:39:28
xmshao 发表于 2016-1-6 15:49
stm32L051K 自带2K eeprom 不能用?

flash操作要更省电,还更快,所以....还是用flash吧
yangsangelaile 回答时间:2016-1-6 16:41:15
yanhaijian 发表于 2016-1-6 15:29
这个问题我在做STC单片机时也遇到,我也没分析出原因,但是我想办法把这个问题给避掉。 ...

又要节约flash的容量,又要省电...不好做...
yanhaijian 回答时间:2016-1-6 16:47:16
yangsangelaile 发表于 2016-1-6 16:41
又要节约flash的容量,又要省电...不好做...

你能想到FLASH的这种特性,并对这种特性进行利用还是很厉害的。
废鱼 回答时间:2016-1-6 16:49:54
ST单次写入的是双字节型的,理论是写入一次后,这一位就不会被写入了。
yangsangelaile 回答时间:2016-1-6 22:24:31
yanhaijian 发表于 2016-1-6 16:47
你能想到FLASH的这种特性,并对这种特性进行利用还是很厉害的。

要被电能逼疯了
废鱼 回答时间:2016-1-7 09:04:39
理论同一个地址只能写入一次。
拼命三郎 回答时间:2016-1-8 09:15:25
我有点不大懂啊,不是说写的话,只能由1变0吗,那你怎么实现的在同一位置写入0b 0001之后,再次写入0b 0011(不知道楼主是不是这个意思),但是这样操作的话是不是使第二位由0写成1了吗?
12下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版