我正在尝试将数据存储在STM32F411VET6的闪存中。我希望即使重新启动MC后也可以存储并保留内存。我已经看过this,this,this和this的例子,但是我仍然不确定我是否正确地做到了。我可以在内存中创建一个位置(我在地图文件中签入),并以此作为分散文件:
LR_IROM1 0x08000000 0x00080000 { ; load region size_region
ER_IROM1 0x08000000 0x00060000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
.ANY (+XO)
}
USER_CONFIG 0x08060000 0x0001FFFF {
userConfig.o (+RW)
}
RW_IRAM1 0x20000000 0x00020000 { ; RW data
.ANY (+RW +ZI)
}
}
这是我的代码(改编自this示例):
__attribute__((__section__("USER_CONFIG"))) const char userValues[64];
void Write_Flash(uint32_t data[], uint8_t flashTypeProgram)
{
uint8_t addressGap;
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_7, VOLTAGE_RANGE_3);
int ii = 0;
for (ii = 0; ii < 64 / pow(2, flashTypeProgram); ii++)
{
addressGap = pow(2, flashTypeProgram) * ii;
HAL_FLASH_Program(flashTypeProgram, userValues[0] + addressGap, data[ii]);
}
HAL_FLASH_Lock();
}
但是每当构建代码时,我都会收到一个错误,即“没有任何部分与模式userConfig.o相匹配”。
我有什么设置不正确的原因吗?或者为什么我错过了某个地方的通话?
答案 0 :(得分:1)
我能够在Kamil Cuk的帮助下获得解决方案,该解决方案帮助我解决了一些问题。我在分散文件中遇到的问题之一是我的加载和执行地址不同,导致链接器无法按预期工作(在this link中有很好的解释)。我将.sct文件修改为以下内容:
LR_IROM1 0x08000000 0x00060000 { ; load region size_region
ER_IROM1 0x08000000 0x00060000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
.ANY (+XO)
}
RW_IRAM1 0x20000000 0x00020000 { ; RW data
.ANY (+RW +ZI)
}
}
LR_IROM2 0x08060000 0x00020000 { ; load region size_region
USER_CONFIG 0x08060000 0x00020000 {
*(.user_data)
}
}
此实现创建了另一个加载区域,这会使我的加载地址和异常地址相同。
然后,如果有人也来这里寻求帮助,这是我闪烁的代码:
__attribute__((section(".user_data"))) const char userConfig[64];
[...]
void Write_Flash(uint32_t data[], uint8_t flashTypeProgram)
{
uint8_t addressGap;
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_7, VOLTAGE_RANGE_3);
int ii = 0;
for (ii = 0; ii < 64 / pow(2, flashTypeProgram); ii++)
{
addressGap = pow(2, flashTypeProgram) * ii;
HAL_FLASH_Program(flashTypeProgram, (uint32_t) &userConfig[0] + addressGap, data[ii]);
}
HAL_FLASH_Lock();
}
该程序使我可以将数据存储在内部闪存中,即使在硬重启后(断开所有电源然后又重新连接到主板上),该数据也将保留。