any012 发表于 2016-9-23 10:27:24

读stm32flash出错

想实现这么个功能:
有三个二维数组paraa, error, resRefValue需要保存,将三个数组写入到stm32f103内部flash的三个扇区里,上电时再重新读出来。

下面有读flash的函数,该函数只有一个参数。参数为0时,读出所有数据;参数为1-4时,读出存储的对应路数的数组。

计算好第一路的三个数组后,保存到了paraa[], error[], resRefValue[]里。
重新上电时,调用读flash函数,参数给的是0,应该读出所有参数,结果发现,第一路的前两个参数没有被保存,都是0,resRefValue[]倒是正常。
修改为上电时只读第一路的参数,结果倒是正常的。

void FlashRead(u8 readChanelNUmber)
{
      u8 i;
      if(readChanelNUmber == 0)
      {
                for(i = 0; i < 4; i++)
                {
                  STMFLASH_Read(FLASH_SAVE_ADDR+i*28, &paraa.u16_value, 28);
                        STMFLASH_Read(FLASH_SAVE_ADDR+i*28+0x0400, &error.u16_value, 28);
                        STMFLASH_Read(FLASH_SAVE_ADDR+i*28+0x0800, &resRefValue.u16_value, 28);
      }
      }
      else if(readChanelNUmber > 0 && readChanelNUmber < 5)
      {
                readChanelNUmber -= 1;
                STMFLASH_Read(FLASH_SAVE_ADDR+readChanelNUmber*28, ¶a.u16_value, 28);
                STMFLASH_Read(FLASH_SAVE_ADDR+readChanelNUmber*28+0x0400, &error.u16_value, 28);
                STMFLASH_Read(FLASH_SAVE_ADDR+readChanelNUmber*28+0x0800, &resRefValue.u16_value, 28);
                efValue[%d][%d] = %d", readChanelNUmber, i, resRefValue.u16_value);
      }      
}


xmshao 发表于 2016-9-23 10:27:25

你首先要保证写操作是正确的。

对于STM32F1系列来言,内部FLASH仅支持16位半字写。

高二毛 发表于 2016-9-23 12:32:48

查看一下代码,是否跟你的连续读有关系吧。

any012 发表于 2016-9-23 14:21:37

STMFLASH_Read(FLASH_SAVE_ADDR+i*28, &paraa.u16_value, 28);
该函数引用错误,第三个参数为写入的16位数据的个数,所以对应的第一个参数里的i*28就不合适了,应该改成i*14;
另,二维数组这样保存可能没必要,数组肯定是连着的。没必要加这个for循环,直接保存56个16位数据即可。

any012 发表于 2016-9-23 16:23:24

xmshao 发表于 2016-9-23 15:20
你首先要保证写操作是正确的。

对于STM32F1系列来言,内部FLASH仅支持16位半字写。 ...

已经解决,就是上边的问题,没有仔细看函数说明。
页: [1]
查看完整版本: 读stm32flash出错