STM32,保存在flash中的变量无法在其他文件中更新
STM32, variable stored in flash could not be updated in other file
我用的是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
永远不会在另一个文件中更改(作为参数传递)。
我错过了什么吗?
由于闪存的物理设计,您不能像写入 RAM 一样写入闪存。确切地说,您需要擦除 sector/page(假设 ~ 1-4kB,它在您的 MCU 数据表中指定)。原因是闪存即使在未通电时也能保持状态,每当您想更改值 0 -> 1 的任何位时,您需要擦除整个扇区(擦除后所有位都将设置为 1) .
所以你不能使用闪存作为数据存储器,你可以做的是使用闪存作为存储常量(只读)值的变量,所以任何查找表都可以完美地放入其中(通常是编译器,当你const 的 stat 变量会将它们放入 flash 中)。如何写入flash可以看你的MCU参考手册。
我用的是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
永远不会在另一个文件中更改(作为参数传递)。
我错过了什么吗?
由于闪存的物理设计,您不能像写入 RAM 一样写入闪存。确切地说,您需要擦除 sector/page(假设 ~ 1-4kB,它在您的 MCU 数据表中指定)。原因是闪存即使在未通电时也能保持状态,每当您想更改值 0 -> 1 的任何位时,您需要擦除整个扇区(擦除后所有位都将设置为 1) .
所以你不能使用闪存作为数据存储器,你可以做的是使用闪存作为存储常量(只读)值的变量,所以任何查找表都可以完美地放入其中(通常是编译器,当你const 的 stat 变量会将它们放入 flash 中)。如何写入flash可以看你的MCU参考手册。