在我的stm32 mcu上没有eeprom。因此,我使用内部闪存来保存一个字节的用户数据,以在电源循环之间保留它。,我是按照以下方式来做的
- 在链接器脚本的内存中添加数据段
MEMORY {
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 8K
FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 64K
DATA (xrw) : ORIGIN = 0x800F800, LENGTH = 2K //Allocated one full flash page
}
- 创建用户数据部分
.user_data :
{ . = ALIGN(4);
*(.user_data)
. = ALIGN(4);
} >DATA
- 创建一个变量以存储在闪存中
attribute((section(".user_data"))) const uint8_t userConfig[10]
- 使用以下函数写入数据
HAL_FLASH_Unlock();
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGSERR );
FLASH_PageErase(FLASH_PAGE_31);
HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, (uint32_t)&userConfig[index], someData);
HAL_FLASH_Lock();
当我尝试写入闪存时,它会失败,并设置了PGSERR标志。
-
0x0800 3800 - 0x0800 3FFF
是第7组,而不是第11组。 -
CCD_ 2通常是错误的,因为存储器在该微存储器中以64位字编程,并且地址必须与8字节边界对齐。
在对微控制器进行编程之前,请务必阅读文档。使用magic库并不能使您免于了解硬件。