STM32,存储在闪存中的变量无法在其他文件中更新

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

我使用的是STM32F411RE。 因为我的 RAM 中没有更多内存了。我决定在闪存中存储大变量。为此,我在

section.ld
中创建了一个部分。

 .large_buffer: ALIGN(4)
    {
        . = ALIGN(4) ;
        *(.large_buffer.large_buffer.*)
        . = ALIGN(4) ;
    } >FLASH

main.c
文件中,我声明变量如下:

uint8_t buffer[60 * 200] __attribute__ ((section(".large_buffer"), used));

此时一切正常,缓冲区未存储在RAM(bss)中,我可以访问它并重写它。

buffer[25] = 42;
printf("%d\n", buffer[25]); // 42

当我想从其他文件编辑变量时,问题就出现了。

main.c

uint8_t buffer[60 * 200] __attribute__ ((section(".large_buffer"), used));

int main()
{
  myFunc(buffer);
}

other.c

myFunc(uint8_t* buffer)
{
    buffer[25] = 42;
    printf("%d\n", buffer[25]); // 0
}

buffer
永远不会在另一个文件中更改(作为参数传递)。

我错过了什么吗?

c linker sections flash-memory stm32f4
2个回答
2
投票

由于闪存的物理设计,您不能像写入 RAM 那样以相同的方式写入闪存。确切地说,您需要擦除扇区/页(比方说~ 1-4kB,它在您的 MCU 数据表中指定)。原因是闪存即使未通电也会保留状态,每当您想要更改值 0 -> 1 中的任何位时,您需要擦除整个扇区(擦除后所有位将设置为 1) 。

所以你不能使用Flash作为数据存储器,你可以做的是使用Flash来存储const(只读)值的变量,所以任何查找表都将完美地适合那里(通常是编译器当你将变量stat变量设置为const时)会将它们放入闪存内)。如何写入Flash您可以阅读您的MCU参考手册。


0
投票

我想更新内存中的一个值,在程序(ST Link Utility)中你可以编辑每个房子,但是如何用该代码编辑地址?

© www.soinside.com 2019 - 2024. All rights reserved.