ST意法半导体
直播中

1123127317

8年用户 1048经验值
擅长:制造/封装 接口/总线/驱动
私信 关注
[问答]

STM32F746将数据写入内部闪存而不擦除整个扇区?

我正在使用 STM32f746 和 touchGFX 开发一个项目。我需要将一些数据存储到闪存中并在需要时更改它,我想我必须擦除整个扇区,但我不想这样做,因为我在每个扇区都有一些数据。我现在使用 85% 的闪存。那么有没有办法在写入前删除特定内存呢?









回帖(1)

李燕

2023-2-3 15:04:58
我将为向量表创建一个新的内存定义,并将 FLASH 的开头移到保留的闪存扇区之后。


  • MEMORY
  • {
  •   RAM    (xrw)    : ORIGIN = 0x20000000,   LENGTH = 320K
  •   FLASH_VECTOR    (rx)    : ORIGIN = 0x8000000,   LENGTH = 32K
  •   FLASH    (rx)    : ORIGIN = 0x8018000,   LENGTH = 928K /* 1024 - 3*32 */
  • }


  • /* Sections */
  • SECTIONS
  • {
  •   /* The startup code into "FLASH" Rom type memory */
  •   .isr_vector :
  •   {
  •     . = ALIGN(4);
  •     KEEP(*(.isr_vector)) /* Startup code */
  •     . = ALIGN(4);
  •   } >FLASH_VECTOR
  •   .after_vector :
  •   {
  •     . = ALIGN(4);
  •     KEEP(*(.after_vector))
  •     . = ALIGN(4);
  •   } >FLASH_VECTOR

并保持其他一切不变。
现在 0x08008000 和 0x08018000 之间的内存,即闪存扇区 1 和 2 不再由链接器管理,因此您可以拥有自己的函数来读写该区域,如参考手册闪存章节中所述。
vector table之后大约有31kbytes的flash空间被浪费了,如果内存还紧张,可以把一些只读的数据移进去。查看 .map 文件,寻找只读数据结构,大小加起来大约为 31 k 的数组。CubeIDE 在 Build Analyzer 视图中有一个内存详细信息表,其中包含与 .map 文件或多或少相同的信息,打开 flash 下的 .rodata 部分,按大小排序,然后从中选择一些对象。在 .c 源代码中将以下行放在它们的定义之前:


  • __attribute__((section(".after_vector")))

这样就不会浪费这 31 KB 的闪存。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分