我正在使用STM32F103并将我的代码转移到STM32F746。F103能够在1KB和2KB的基础上以页为单位更新闪存。我有STM32F746ZG核板,我的代码很大,flash占用了0x08038000。我想将其他小应用程序保存在0x08040000(sector_5)上。这个应用程序由几个2KB大小组成。我需要在Sector_5中存储多个应用程序,而M7不能以1KB或2KB为增量使用闪存。
以下是STM32F746ZG的扇区大小。
#define ADDR_FLASH_SECTOR_0 ((uint32_t)0x08000000) // 32 Kbytes
#define ADDR_FLASH_SECTOR_1 ((uint32_t)0x08008000) // 32 Kbytes
#define ADDR_FLASH_SECTOR_2 ((uint32_t)0x08010000) // 32 Kbytes
#define ADDR_FLASH_SECTOR_3 ((uint32_t)0x08018000) // 32 Kbytes
#define ADDR_FLASH_SECTOR_4 ((uint32_t)0x08020000) // 128 Kbytes
#define ADDR_FLASH_SECTOR_5 ((uint32_t)0x08040000) // 256 Kbytes
#define ADDR_FLASH_SECTOR_6 ((uint32_t)0x08080000) // 256 Kbytes
#define ADDR_FLASH_SECTOR_7 ((uint32_t)0x080C0000) // 256 Kbytes
从Sector_5到Sector7,STM32F746由每个256 KB扇区大小的闪存组成。如果我想使用Sector_5,我必须擦除整个扇区。如果我只想更新Sector_5前面的大约2KB,并保持2KB之后的区域不变,该怎么办?这意味着我只将内容从0x08040000更新到0x08042000。我必须保持从0x08042001到0x0807FFFF。
我甚至不能将256KB的闪存复制到RAM中。因为F746只有240KB的内存,而我的许多任务已经使用了内存,所以没有足够的内存来复制一个扇区。在这种情况下,请让我知道如何更新闪存中256KB的一部分。
发布于 2019-06-01 19:51:13
在ST的闪存技术上,如果不先擦除它,就无法在扇区的任何地方进行更新。因此,如果第一个2KB中有内容,则在不擦除扇区其余部分的情况下无法对其进行更新。
一种可能性是,您可以保留一个扇区作为临时缓冲区,而从不将其用于实际存储。假设你使用扇区7来做这个。因此,当您要更新扇区5时,请擦除扇区7,将扇区5复制到扇区7,然后擦除扇区5并将相关内容复制回来。
另一种可能是为此添加外部EEPROM或SRAM。SPI闪存EEPROM相当便宜,通常有100,000个写入周期,因此也非常适合此用途。
发布于 2019-06-01 14:49:04
这要看情况了。在许多STM32微控制器上,您可以在不擦除闪存的情况下将闪存的位清零。当然,你不能设置这些位--它只能通过擦除操作来完成。一些芯片不允许这样做,因为闪存扇区有自己的CRC。
如果您的芯片允许写入0xff填充的闪存,则可以将数据存储在此扇区的另一个位置。如果没有,您需要将数据复制到另一个扇区,重新创建该扇区,然后将数据写回。
https://stackoverflow.com/questions/56406902
复制相似问题