首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在闪存中创建可以用代码覆盖的数组?使用STM32CubeIDE 1.9.0

如何在闪存中创建可以用代码覆盖的数组?使用STM32CubeIDE 1.9.0
EN

Stack Overflow用户
提问于 2022-05-25 16:26:57
回答 1查看 315关注 0票数 0

我对STM32相当陌生,但在微芯片MPASM和C上工作了很长时间。

我的代码在包含文件中声明了一个二维数组,并将其存储在闪存中。在运行时,将在我的应用程序中引用该数组。效果很好。然而,我需要有能力写现有的闪存数组偶尔。

我理解STM32擦除/写入循环的原理,并有基于HAL的例程来实现这一点。但是,我不知道如何声明原始数组以从扇区开始地址开始。我的研究发现了相互矛盾的建议,现在我感到困惑。

我假设我必须使用编译器指令(正如我多次使用Microchip项目所做的那样),例如:

代码语言:javascript
复制
__attribute__ ((section ("FLASH_SECTOR_11))) ArrayRecord_t FlashArray[] {
/* Here I define my array records */
{1, 1600},
{10, 3200},
etc
};

有办法这样做吗?我撞错树了吗?

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2022-05-26 15:56:57

所以,我找到了答案:

多维数组必须使用链接器表令牌声明,然后必须在链接器文件中定义令牌。例如:

代码语言:javascript
复制
static const MyArrayRecord_t MyArray[] __attribute__ ((section(".MySectionName"))) = {
{10, 100},
{20, 112},
{31, 156}
};

然后在链接器文件(例如: MyProject_FLASH.ld)中添加相应的节定义:

代码语言:javascript
复制
.MySectionName 0x8060000 :
{
. = ALIGN(4);
KEEP(*(.MySectionName))
. = ALIGN(4);
} > FLASH

在芯片上,我使用的地址0x8060000对应于闪存段地址的开始。要覆盖这个闪存数组,首先需要解锁闪存(请参阅手动或HAL_FLASH_Unlock())。然后抹去整个扇区。在此之后,可以覆盖闪存数组。请注意,这假设闪存数组小于闪存段。

在您的代码中,可以引用FLASH数组,就像引用RAM数组一样。

HTH

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72381277

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档