初级会员

- 积分
- 133
- 金钱
- 133
- 注册时间
- 2014-10-27
- 在线时间
- 23 小时
|
10金钱
原子哥的flash当作eeprom用例程中,擦除之后,为什么要复制,并且要从扇区首地址进行写入
while(1)
{
STMFLASH_Read(secpos*STM_SECTOR_SIZE+STM32_FLASH_BASE,STMFLASH_BUF,STM_SECTOR_SIZE/2);//读出整个扇区的内容
for(i=0;i<secremain;i++) //校验数据
{
if(STMFLASH_BUF[secoff+i]!=0XFFFF)break;//需要擦除
}
if(i<secremain) //需要擦除
{
STMFLASH_ErasePage(secpos*STM_SECTOR_SIZE+STM32_FLASH_BASE);//擦除这个扇区
for(i=0;i<secremain;i++)//复制
{
STMFLASH_BUF[i+secoff]=pBuffer;
}
STMFLASH_Write_NoCheck(secpos*STM_SECTOR_SIZE+STM32_FLASH_BASE,STMFLASH_BUF,STM_SECTOR_SIZE/2);//写入整个扇区
/*****************************************************
个人觉得上面需要擦除里面是不是可以这样写? 请高手指点,谢谢!!!
if(i<secremain) //需要擦除
{
STMFLASH_ErasePage(secpos*STM_SECTOR_SIZE+STM32_FLASH_BASE);//擦除这个扇区
STMFLASH_Write_NoCheck(WriteAddr,pBuffer,secremain);/写入整个扇区
}
***********************************************************/
}else STMFLASH_Write_NoCheck(WriteAddr,pBuffer,secremain);//写已经擦除了的,直接写入扇区剩余区间.
if(NumToWrite==secremain)break;//写入结束了
else//写入未结束
{
secpos++; //扇区地址增1
secoff=0; //偏移位置为0
pBuffer+=secremain; //指针偏移
WriteAddr+=secremain*2; //写地址偏移(16位数据地址,需要*2)
NumToWrite-=secremain; //字节(16位)数递减
if(NumToWrite>(STM_SECTOR_SIZE/2))secremain=STM_SECTOR_SIZE/2;//下一个扇区还是写不完
else secremain=NumToWrite;//下一个扇区可以写完了
}
};
|
最佳答案
查看完整内容[请看2#楼]
这样说吧,因为你操作的是secoff到secoff+secremain[/backcolor]下标的数据。然后你检查这里面有数据不是0XFFFF了,那这样是不是需要擦除后才写入,但是擦除是整个扇区的,所以你需要将不是你操作的 0到secoff下标数据存起来,因为你也不知道0到secoff有没有存数据,就算是没存,也不影响你写secoff到secoff+secremain[/backcolor]的数据。之后写入的话,0到secoff的数据就会恢复原状。若是你的代码,会直接将0到secoff的数据重 ...
|