登录
创易栈 匿名提问者 2017-10-17
stm32f411内部flash问题,我把第6页有效数据拷贝到第7页,清空第6页,再把第7页数据拷贝回第6页,但是数据不在是以前数据,代码如下:
filehead.sof = *(uint8_t *)(FPFLASH_SEVEN_ADDR - 2*FPFILESIZE); //读取最后一个位置是否已满
if(filehead.sof == SOF) //判断第6块扇区是否存贮已满
{
for (addr=FPFLASH_START_ADDR; addr {
filehead.fileaddr = *(__IO uint32_t *)(addr + STFO(filehead_t, fileaddr));
if(filehead.fileaddr == VALIDSTATE)
{
CountID ++;
if(CountID > 253) //无需整理
goto DataOK;
}
else
break;
}
usartpackets.SendCMD(CMD_TIDYSTART, 0); //发送指令,提示开始整理Flash存贮
AddrCount1 = 1;
for (addr=FPFLASH_START_ADDR; addr {
filehead.fileaddr = *(__IO uint32_t *)(addr+STFO(filehead_t, fileaddr));

if(filehead.fileaddr == VALIDSTATE) //判断有效数据,如是,则备份
{
for (iTest=addr; iTest {
FlashTemp[(iTest-addr)/4] = *(uint32_t *)iTest; //连续读取Flash第6扇区数据到缓存
}
HAL_Delay(1);

HAL_FLASH_Unlock();
for (iTest=0; iTest {
while(HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, FPFLASH_SEVEN_ADDR + FPFILESIZE * AddrCount1 + iTest, *(uint32_t *)(FlashTemp + iTest)) !=HAL_OK);
}
HAL_FLASH_Lock();
AddrCount1 += 1;
HAL_Delay(1);
}
}

// for (iTest=FPFLASH_SEVEN_ADDR+FPFILESIZE; iTest// {
// FlashTemp[(iTest - FPFLASH_SEVEN_ADDR+FPFILESIZE)/4] = *(__IO uint32_t *)iTest; //连续读取Flash第7扇区数据到缓存
// }

FlashSectorErase_6(); //擦除第6块数据
AddrCount2 = 0;
for (addrbak=FPFLASH_SEVEN_ADDR+FPFILESIZE; addrbak < FPFLASH_END_ADDR; addrbak+=FPFILESIZE)
{
filehead.sof = *(__IO uint8_t *)(addr + STFO(filehead_t, sof));
if(filehead.sof != SOF) //判断有效数据,如是,则备份
break;

for (iTest=addrbak; iTest {
FlashTemp[(iTest - addrbak)/4] = *(uint32_t *)iTest; //连续读取Flash第7扇区数据到缓存
}
HAL_Delay(1);

HAL_FLASH_Unlock();
for (iTest=0; iTest {
while(HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, FPFLASH_START_ADDR + FPFILESIZE * AddrCount2 + iTest, *(uint32_t *)(FlashTemp + iTest)) !=HAL_OK);
}
HAL_FLASH_Lock();
AddrCount2 += 1;
HAL_Delay(1);
}
// for (addrbak=FPFLASH_START_ADDR; addrbak < FPFLASH_END_ADDR; addrbak+=FPFILESIZE)
// {
// for (iTest=addrbak; iTest// {
// FlashTemp[(iTest - addrbak)/4] = *(uint32_t *)iTest; // 测试读出
// }
// }

FlashSectorErase_7(); //擦除第7块数据
usartpackets.SendCMD(CMD_TIDYEND, 0); //发送指令,提示整理Flash存贮完成
}
3积分

悬赏完成 ,48小时抢答者被选中的人可获得赏金

回答
  • 创易栈 最初的梦想 1 积分
    写之...
    0元 点击围观更多答案内容
    1 2017-10-17 12:23:45
  • 创易栈 云FAE_3C*  | WIFI/MCU/传感器 1 积分
    题主...
    0元 点击围观更多答案内容
    1 2017-10-18 10:02:31
  • 创易栈 蓝图  | BLE/WIFI/MCU 1 积分
    FLASH...
    0元 点击围观更多答案内容
    0 2017-10-18 13:58:11
  • 创易栈 .小Di'咕
    擦除问题
    展开
    0 2017-10-19 15:32:35
相关问题

copyright@2014-2016 emakerzone.com 粤ICP备16121718号 公安局备案44030502001031 粤公网