C 嵌入式 - 在 STM32 内部分配内存和围绕该内存构建的正确方法是什么?

问题描述 投票:0回答:1

我正在用STM32构建一个系统,该系统使用需要校准的设备(数据可以存储在一个32位寄存器中)。由于我仍在构建和更新代码,因此我理想情况下希望该区域保持在同一个位置,这样每次我构建和启动时就不必重新校准。显然,鉴于其校准数据,MCU 不会初始化该区域中的值。

现在我刚刚在闪存区域内选择了一个遥远的地址,并希望编译器不会覆盖它。它工作得很好,但感觉有一种正确的方法可以从编译器端阻塞内存。

c embedded stm32
1个回答
0
投票

非常直接的过程。首先,在链接器(.ld)文件中建立一个内存区域:

MEMORY
{
  RAM    (xrw)    : ORIGIN = 0x20000000,   LENGTH = 24K
  FLASH    (rx)    : ORIGIN = 0x8000000,   LENGTH = 128K
  CALIBRATION (rx) : ORIGIN = 0x0801FFE0,   LENGTH = 8 /* new 8 byte section */
}

然后在各部分的几行下面,我添加了:

.calibration (NOLOAD) :
  {
    . = ALIGN(4);
    KEEP(*(.calibration))
    . = ALIGN(4);
  } >CALIBRATION

关键部分是NOLOAD,它确保里面的值在启动时不被初始化。

然后在主文件中,只需要添加读写的指针和地址即可:

volatile uint32_t *calibration_value = (uint32_t *)0x0801FFE0; // create pointer at address
InitialCalib = *calibration_value; // use deferenced pointer to access data
© www.soinside.com 2019 - 2024. All rights reserved.