读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, ¶a.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);
}
}
你首先要保证写操作是正确的。
对于STM32F1系列来言,内部FLASH仅支持16位半字写。 查看一下代码,是否跟你的连续读有关系吧。 STMFLASH_Read(FLASH_SAVE_ADDR+i*28, ¶a.u16_value, 28);
该函数引用错误,第三个参数为写入的16位数据的个数,所以对应的第一个参数里的i*28就不合适了,应该改成i*14;
另,二维数组这样保存可能没必要,数组肯定是连着的。没必要加这个for循环,直接保存56个16位数据即可。 xmshao 发表于 2016-9-23 15:20
你首先要保证写操作是正确的。
对于STM32F1系列来言,内部FLASH仅支持16位半字写。 ...
已经解决,就是上边的问题,没有仔细看函数说明。
页:
[1]