***
关于跨块写flash出现的擦除再赋值不成功问题的解决
之前大学的时候关于写flash的接触不多用的是STM32ZET6,但是现在工作了,遇到些问题必须是我们去解决的,就是在断电再上电的过程通道的flash,我们一般用到的是norflash,这样的flash擦除时间比较久,写入的比较快,比较适合少量代码存储,此flash的大小也有很多,那就进入正题;
来到公司因为某些原因,这些芯片的资料不能提供给大家,只能讲讲我的经历与一点点经验;
我知道之前使用的stm32在擦除时会有检测此变量存储地址开始到变量结束的存储空间是否在一个数据块上,如果不在,会擦出两块连续的区域,如果在,只擦除本块flash存储空间,但是工作了不再是以前那些芯片,可能会存在不一样,这需要我们自己去看底层sdk是否做了这样的处理,这里需要我们自己一些思考,我以前就从来没有考虑过这些,拿到配好的sdk就看是上手。
我用的是2M的flash,每个数据存储扇区是4K,也就是会有512扇数据,我们可以看数据手册,也可以直接计算出每块的首地址,如果不想进一步玩一下flash,从每块开始写数据,用户变量区自己保存(少量变量数据,不适合大量存储)的,一般不会超过一块的存储容量,不用考虑跨块的问题
如果需要跨块,如果了解的底层接口功能之后,这时候才知道问题的根源
在这里需要备注的是,一次擦出的最小单位为1扇,此扇的大小可能会不同,需要看datasheet,与读的方式不同,我的其他博客也有专门解析sta32的flash和eeprom的,可以参考
下面是遇到的问题截图加解决方法:
问题1:擦除整片芯片flash,首次跨块赋值成功,再次按照原来的方法擦除再写入,跨块前的数据修改成功,跨块区域为数值0
读取flash的初始值:
![结构体变量aaa,bbb,ccc的初始值](https://img-blog.csdnimg.cn/2020021411260417.png)
初始赋值:
![初始值赋值成功](https://img-blog.csdnimg.cn/20200214112909277.png)
二次赋值:
![aaa变量赋值成功,bbb,ccc赋值失败,读出数据值为0](https://img-blog.csdnimg.cn/2020021411295479.png)
解决办法:
![将跨快区域后一块擦除,添加擦除](https://img-blog.csdnimg.cn/20200214113155690.png)
结果,成功赋值
谢谢
第一次写文,希望能有所帮助,小白一个,大神莫喷!