[mw_shl_code=c,true]void STMFLASH_Write(u32 WriteAddr,u16 *pBuffer,u16 NumToWrite)
{
u32 secpos; //???????·
u16 secoff; //?????????????·(16??×?????)
u16 secremain; //?????????à???·(16??×?????)
u16 i;
u32 offaddr; //????0X08000000?ó?????·
if(WriteAddr<STM32_FLASH_BASE||(WriteAddr>=(STM32_FLASH_BASE+1024*STM32_FLASH_SIZE)))return;//·?·¨???·
FLASH_Unlock(); //????
offaddr=WriteAddr-STM32_FLASH_BASE; //???????????·.
secpos=offaddr/STM_SECTOR_SIZE; //???????· 0~127 for STM32F103RBT6
secoff=(offaddr%STM_SECTOR_SIZE)/2; //??????????????(2??×??????ù±?????.)
secremain=STM_SECTOR_SIZE/2-secoff; //???????à?????ó??
if(NumToWrite<=secremain)secremain=NumToWrite;//???ó????????·??§
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)//?è??????
{
FLASH_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);//????????????
}else STMFLASH_Write_NoCheck(WriteAddr,pBuffer,secremain);//?????????????,?±?????????????à????.
if(NumToWrite==secremain)break;//?????á????
else//???????á??
{
secpos++; //???????·??1
secoff=0; //??????????0
pBuffer+=secremain; //????????
WriteAddr+=secremain; //?????·????
NumToWrite-=secremain; //×???(16??)??????
if(NumToWrite>(STM_SECTOR_SIZE/2))secremain=STM_SECTOR_SIZE/2;//???????????????????ê
else secremain=NumToWrite;//?????????????????ê??
}
};
FLASH_Lock();//????
}[/mw_shl_code]
secoff=(offaddr%STM_SECTOR_SIZE)/2; //??????????????(2??×??????ù±?????.)
secremain=STM_SECTOR_SIZE/2-secoff; //???????à?????ó??
扇区剩余空间如何得到的? 请高手帮忙分析下,thanks
|