stm32f10x系列flash操作:看似简单却也不简单

        话说小编前几天还在玩IAP,由于工作需要,小编要在flash中开辟一段存储区来保存几个变量的值。当时小编就一声冷笑,呵,我都手握官方flash操作的库,不就是调用一下flash_read()和flash_write()吗,这有什么难的,然而。。。。现实总是残忍的,小编花了好大一番功夫才成功在重刷程序后依然能够读取到flash的值,在此记录,望各位童鞋能够不走弯路。

        首先要从flash写入与读取的地址出发,小编一开始可是很理想化的,我就要把数据存入0x08xxxxxx这个地址(这边这个0x08xxxxxx小编是知道要在所下载的工程文件大小之后的,也就是你的代码区不能与你想存入的地址重复),好,开始调用函数,把我的数据写入0808xxxxxx,再读取出来,看看是否为我存入的地址,然后一运行。。直接卡死,上网一查,才发现,原来stm32f10x的flash都是分页的,根据单片机容量的大小每页的大小也是有不同的,而且每次操作一定要对整页操作。这倒是提醒了我,马上把写入的地址改成整数倍的每页大小,还真的可以读取到我想要的信息。由于我写入和读取时在一个工程里,我马上新建了一个工程,只有读取操作,一刷进去,懵逼了,我读取出来的信息全变成了0xFF,这是怎么回事。再下载那个含有读写功能的工程,又是正常的。经过尝试,我直接通过寻址方式获取了写入区的信息,这下发现数据确确实实是写进去了,那为什么后来没有了呢,只有一种可能,在刷新程序的时候把存入的内容刷掉了。可明明我的程序大小全写入也写不到存变量的数据区啊。一开始我怀疑是以下的设置出了问题:IROM1区的size。

可是当小编不管是将size改成小于0x08xxxxxx还是大于它,所遇到的情况还是程序刷新后内容不复存在。进过大量时间的搜索,终于在网上看到了一点希望的曙光,请看以下这幅图:

在我们选中芯片的时候,其右下角会出现art、ize两个内容,前一个是起始写入flash的地址,后一个是flash的大小,通过设置ize参数可以设置下载程序时flash擦除的大小。这个刚刚可以解决flash覆盖的问题。然而小编还是没成功,最后根据对比,终于发现这张图左上角还有一个Erase Sector,而小编一开始的是Erase Full C,至此,所有问题终于解决,看似简单的flash还是有很多值得回味的地方,虽然小编写文章的时候感觉没什么太多的内容,但一路自己摸索过来还是花了点精力的。flash操作让我联想到IAP的APP程序,我们是不是可以设置Flash DownLoad的内容来直接下载APP程序呢?这个值得尝试哦!

猜你喜欢

转载自blog.csdn.net/qq_36514344/article/details/83145396