我正在使用 STM32U575ZIt6 micro,从闪存(最后一页)读取数据到 RAM 时遇到问题。基本上发生的情况是,当我执行代码时,读取的数据的校验和与我期望的不匹配,这是因为从闪存复制到 RAM 的数据丢失了某些部分。如果我使用调试器执行相同的代码,逐步读取,数据将成功复制并且校验和匹配。我的想法是存在一些计时问题,因此我尝试在读取功能中添加一些延迟,但这不起作用。我注意到的另一件事是,在读取函数和校验和计算之后添加代码会对数据读取产生影响。有什么线索吗? 感谢您的任何答复
这是我用来读取(正确)存储在闪存中的数据的函数
Read(BACKUP, (void*)&Regs, sizeof(fram_registers));
void Read(uint32_t data_address, uint32_t *data, uint16 len)
{
if ( len != 0 )
{
len/=4;
while(len--)
{
*data = *(__IO uint32_t *)data_address;
data_address += 4;
data++;
}
}
}
您没有显示
fram_registers
是什么。如果这个变量的长度是 4 那么一切都很好。
顺便说一句,你错过了最后一个参数中的
_t
,所以我不认为它是你使用的实际函数,因为它不会编译
memcpy
。void Read(uint32_t data_address, uint32_t *data, uint16_t len)
{
memcpy(data, (void *)data_address, len & (~3);
}
两边都需要使用 volatile:
*(volatile uint32_t *)data = *(volatile uint32_t *)data_address;
不需要延迟,因为闪存可以像任何其他存储位置一样读取。
如果您自己在 FLASH 中写入了某些内容,则调试器可能无法读取 FLASH(假定 FLASH 是常量)。我不使用 stm32link,但 J-link 需要特殊选项来force FLASH 重读