Ham*_*Fet 12 microcontroller stm32 flash-memory stm32f4discovery
我正在尝试使用STM32F405的内部闪存来存储一堆用户可设置的字节,这些字节在重新启动后仍然存在.
我正在使用:
uint8_t userConfig[64] __attribute__((at(0x0800C000)));
Run Code Online (Sandbox Code Playgroud)
为我想要存储的数据分配内存.
当程序启动时,我检查第一个字节是否设置为0x42
,如果没有,我使用以下方法设置:
HAL_FLASH_Unlock();
HAL_FLASH_Program(TYPEPROGRAM_BYTE, &userConfig[0], 0x42);
HAL_FLASH_Lock();
Run Code Online (Sandbox Code Playgroud)
之后,我检查了价值userConfig[0]
,我看到0x42
......太棒了!
然而,当我点击重置时,再次查看该位置,它0x42
不再是......
知道我哪里错了吗?我也尝试过:
#pragma location = 0x0800C00
volatile const uint8_t userConfig[64]
Run Code Online (Sandbox Code Playgroud)
但我得到了相同的结果..
Ham*_*Fet 20
好的,我在ST论坛上找到答案,谢谢clive1
.此示例适用于STM32F405xG.
首先,我们需要修改链接描述文件(.ld文件)中的内存布局
修改现有FLASH并为DATA添加新行.我在这里分配了全部section 11
.
MEMORY
{
FLASH (RX) : ORIGIN = 0x08000000, LENGTH = 1M-128K
DATA (RWX) : ORIGIN = 0x080E0000, LENGTH = 128k
...
...
}
Run Code Online (Sandbox Code Playgroud)
在同一个文件中,我们需要添加:
.user_data :
{
. = ALIGN(4);
*(.user_data)
. = ALIGN(4);
} > DATA
Run Code Online (Sandbox Code Playgroud)
这创建了一个我们可以在程序代码中解决的section
调用.user_data
.
最后,在.c文件中添加:
__attribute__((__section__(".user_data"))) const uint8_t userConfig[64]
Run Code Online (Sandbox Code Playgroud)
这指定我们希望将userConfig
变量存储在.user_data
节中并const
确保地址userConfig
保持静态.
现在,要在运行时写入闪存的这个区域,可以使用stm32f4 stdlib或HAL闪存驱动程序.
在你可以写入闪存之前,它必须被擦除(所有字节都设置为0xFF)HAL库的指令由于某种原因而没有说明这样做...
HAL_FLASH_Unlock();
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGSERR );
FLASH_Erase_Sector(FLASH_SECTOR_11, VOLTAGE_RANGE_3);
HAL_FLASH_Program(TYPEPROGRAM_WORD, &userConfig[index], someData);
HAL_FLASH_Lock();
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
16768 次 |
最近记录: |