STM32-保留一段闪存

STM32-保留一段闪存,stm32,flash-memory,stm32h743,Stm32,Flash Memory,Stm32h743,按照的指示,我能够从专用于校准数据的闪存部分中保留和写入(以及读取) 问题: 然而,当我重新编程设备时,IDE会在编程之前清除整个内存,我们会丢失所有数据。由于我们处于调试周期中,我们不断地重新编程,并且每次都必须将校准作为第一步写回 有没有办法告诉IDE只擦除与程序数据相对应的特定内存区域?谢谢。ST社区来帮助我。答案是在链接器文件中使用(NOLOAD)来告诉编译器不要将初始化数据放在.elf文件中。可以在此处找到详细信息:AFAIK您可以通过相应地修改链接器脚本(保持想要的flash区域不变

按照的指示,我能够从专用于校准数据的闪存部分中保留和写入(以及读取)

问题
然而,当我重新编程设备时,IDE会在编程之前清除整个内存,我们会丢失所有数据。由于我们处于调试周期中,我们不断地重新编程,并且每次都必须将校准作为第一步写回


有没有办法告诉IDE只擦除与程序数据相对应的特定内存区域?谢谢。

ST社区来帮助我。答案是在链接器文件中使用(NOLOAD)来告诉编译器不要将初始化数据放在.elf文件中。可以在此处找到详细信息:

AFAIK您可以通过相应地修改链接器脚本(保持想要的flash区域不变),并确保程序员/IDE使用正确的编程命令,我只能在这里谈论与ST-LINK/V2一起使用的OpenOCD:程序命令写入ELF并自动擦除所需内存,另请参见:,但您可以通过不同的命令完全控制闪存发生的情况:/write to RAM也是可能的。顺便说一句……如果您只想写入数据(例如校准数据),您可以完全省略IDE,并使用一个简单的shell脚本将图像写入目标的闪存,在OpenOCD的情况下,该脚本执行编程命令(并随后写入保护该区域),请参阅:
flash erase\u sector num first last
/
stm32f4x unlock 0
/
flash protect 0 0 last off
/
flash write\u image[erase][unlock]filename[offset][type]
以及文档中的类似命令。谢谢@rel。您基本上是正确的-需要提醒链接器文件注意这些部分,并告诉它们不要碰它们。详情见我下面的帖子。如果通过指向闪存中固定地址的指针访问数据(例如,
uint8_t*data=(uint8_t*)0x8060000;
),并在单独的步骤中由程序员加载到目标,则也可以从链接器脚本IIRC中完全忽略该数据(您可以减小内存中的闪存大小),因为链接器看不到关于实际数据的任何信息,所以只有指针。如果它被定义为一个结构/数组(就像链接的有趣的文章中那样),并由链接器放入内存,那么(NOLOAD)指令似乎是正确的解决方案。我不知道,很好!