我对STM32相当陌生,但在微芯片MPASM和C上工作了很长时间。
我的代码在包含文件中声明了一个二维数组,并将其存储在闪存中。在运行时,将在我的应用程序中引用该数组。效果很好。然而,我需要有能力写现有的闪存数组偶尔。
我理解STM32擦除/写入循环的原理,并有基于HAL的例程来实现这一点。但是,我不知道如何声明原始数组以从扇区开始地址开始。我的研究发现了相互矛盾的建议,现在我感到困惑。
我假设我必须使用编译器指令(正如我多次使用Microchip项目所做的那样),例如:
__attribute__ ((section ("FLASH_SECTOR_11))) ArrayRecord_t FlashArray[] {
/* Here I define my array records */
{1, 1600},
{10, 3200},
etc
};有办法这样做吗?我撞错树了吗?
谢谢。
发布于 2022-05-26 15:56:57
所以,我找到了答案:
多维数组必须使用链接器表令牌声明,然后必须在链接器文件中定义令牌。例如:
static const MyArrayRecord_t MyArray[] __attribute__ ((section(".MySectionName"))) = {
{10, 100},
{20, 112},
{31, 156}
};然后在链接器文件(例如: MyProject_FLASH.ld)中添加相应的节定义:
.MySectionName 0x8060000 :
{
. = ALIGN(4);
KEEP(*(.MySectionName))
. = ALIGN(4);
} > FLASH在芯片上,我使用的地址0x8060000对应于闪存段地址的开始。要覆盖这个闪存数组,首先需要解锁闪存(请参阅手动或HAL_FLASH_Unlock())。然后抹去整个扇区。在此之后,可以覆盖闪存数组。请注意,这假设闪存数组小于闪存段。
在您的代码中,可以引用FLASH数组,就像引用RAM数组一样。
HTH
https://stackoverflow.com/questions/72381277
复制相似问题