STM32F746ZG - 如何更新闪存中 256 KB 扇区的某些部分

STM32F746ZG - How to update some part of 256 KB sector in flash

我正在使用 STM32F103 并将我的代码移至 STM32F746。 F103 能够以每页为单位更新 1KB 和 2KB 的闪存。 我有 STM32F746ZG Nucleo 板,我的代码量很大,闪存占用了 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

STM32F746 由扇区大小为 256 KB 的闪存组成,从 Sector_5 到扇区 7。如果我想使用 Sector_5,我必须擦除整个扇区。如果我只想更新Sector_5前面的2KB左右,而2KB之后的区域保持不变怎么办?这意味着我只更新从 0x08040000 到 0x08042000 的内容。我必须保持从 0x08042001 到 0x0807FFFF。

我什至无法将 256 KB 的闪存复制到 RAM。因为F746只有240KB的内部RAM,而我的很多任务都已经使用了RAM,所以没有足够的RAM来复制一个扇区。在这种情况下,请告诉我如何更新闪存中的256KB的一部分。

这取决于。在许多 STM32 微控制器上,您可以将 FLASH 的位清零而不用擦除它。但是你当然不能设置这些位——它只能通过擦除操作来完成。有些芯片不允许这样做,因为闪存扇区有自己的 CRC。

如果你的芯片允许写入0xff填充的FLASH,你可以将数据存储在这个扇区的其他地方。如果不是您需要将数据复制到另一个扇区,将该扇区擦除并将数据写回。

在 ST 的闪存技术上,如果不先擦除扇区,则无法更新扇区中的任何位置。因此,如果前 2KB 中有内容,则必须擦除该扇区的其余部分才能更新它。

一种可能是您可以保留一个扇区作为临时缓冲区,永远不要将其用于实际存储。假设您为此使用扇区 7。所以当你要更新5扇区时,擦除7扇区,将5扇区复制到7扇区,然后再擦除5扇区,将相关内容复制回来。

另一种可能性是为此添加一个外部 EEPROM 或 SRAM。 SPI 闪存 EEPROM 相当便宜,并且它们具有典型的 100,000 次写入周期,因此也非常适合这种用途。