0

我正在使用 STM32F103 并将我的代码移动到 STM32F746。F103 能够以每页为基础更新 1KB 和 2KB 的 Flash。我有 STM32F746ZG Nucleo-board,我的代码很大,flash 占用了 0x08038000。我想将其他小型应用程序保存在 0x08040000(sector_5) 上。该应用程序由几个 2KB 大小组成。我需要在 Sector_5 中存储多个应用程序,而 M7 不能以 1KB 或 2KB 为增量使用 Flash。

以下是 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 的闪存组成,从扇区 5 到扇区 7。如果我想使用 Sector_5,我必须擦除整个一个扇区。如果我只想更新 Sector_5 前面的大约 2KB 并保持 2KB 之后的区域完好无损怎么办?这意味着我只将内容从 0x08040000 更新到 0x08042000。我必须保持从 0x08042001 到 0x0807FFFF。

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

4

2 回答 2

2

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

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

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

于 2019-06-01T19:51:12.750 回答
0

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

如果您的芯片允许写入 0xff 填充的 FLASH,您可以将数据存储在该扇区的另一个位置。如果不是,您需要将数据复制到另一个扇区,重新启动该扇区并将数据写回。

于 2019-06-01T14:49:03.573 回答