Stm32 从闪存读取时出现问题(数据不正确)

问题描述 投票:0回答:1

我正在使用 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++;
        }
    }
}

This is data stored in backup

This is what i get

c stm32 ram flash-memory
1个回答
0
投票

您没有显示

fram_registers
是什么。如果这个变量的长度是 4 那么一切都很好。

顺便说一句,你错过了最后一个参数中的

_t
,所以我不认为它是你使用的实际函数,因为它不会编译

  1. 您不需要为此编写自己的函数(尤其是调用未定义的行为) - 您拥有
    memcpy
void Read(uint32_t data_address, uint32_t *data, uint16_t len)
{
    memcpy(data, (void *)data_address, len & (~3);
}
  1. 两边都需要使用 volatile:

    *(volatile uint32_t *)data = *(volatile uint32_t *)data_address;

  2. 不需要延迟,因为闪存可以像任何其他存储位置一样读取。

  3. 如果您自己在 FLASH 中写入了某些内容,则调试器可能无法读取 FLASH(假定 FLASH 是常量)。我不使用 stm32link,但 J-link 需要特殊选项来force FLASH 重读

© www.soinside.com 2019 - 2024. All rights reserved.