初级会员

- 积分
- 183
- 金钱
- 183
- 注册时间
- 2015-5-25
- 在线时间
- 39 小时
|
我觉得这里代码好像写少了 乘以2,不知道是不是大家帮忙验证一下!
WriteAddr+=secremain; 改为 WriteAddr+=secremain*2;
源代码在下面
void STMFLASH_Write(u32 WriteAddr,u16 *pBuffer,u16 NumToWrite)
{
u32 secpos; //éèÇøμØÖ·
u16 secoff; //éèÇøÄúÆ«òÆμØÖ·(16λ×Ö¼ÆËã)
u16 secremain; //éèÇøÄúê£óàμØÖ·(16λ×Ö¼ÆËã)
u16 i;
u32 offaddr; //è¥μô0X08000000oóμÄμØÖ·
if(WriteAddr<STM32_FLASH_BASE||(WriteAddr>=(STM32_FLASH_BASE+1024*STM32_FLASH_SIZE)))return;//·Ç·¨μØÖ·
FLASH_Unlock(); //½aËø
offaddr=WriteAddr-STM32_FLASH_BASE; //êμ¼êÆ«òÆμØÖ·.
secpos=offaddr/STM_SECTOR_SIZE; //éèÇøμØÖ· 0~127 for STM32F103RBT6
secoff=(offaddr%STM_SECTOR_SIZE)/2; //ÔúéèÇøÄúμÄÆ«òÆ(2¸ö×Ö½úÎa»ù±¾μ¥λ.)
secremain=STM_SECTOR_SIZE/2-secoff; //éèÇøê£óà¿Õ¼ä′óD¡
if(NumToWrite<=secremain)secremain=NumToWrite;//2»′óóú¸ÃéèÇø·¶Î§
while(1)
{
STMFLASH_Read(secpos*STM_SECTOR_SIZE+STM32_FLASH_BASE,STMFLASH_BUF,STM_SECTOR_SIZE/2);//¶á3öÕû¸öéèÇøμÄÄúèY
for(i=0;i<secremain;i++)//D£Ñéêy¾Y
{
if(STMFLASH_BUF[secoff+i]!=0XFFFF)break;//Dèòa2á3y
}
if(i<secremain)//Dèòa2á3y
{
FLASH_ErasePage(secpos*STM_SECTOR_SIZE+STM32_FLASH_BASE);//2á3yÕa¸öéèÇø
for(i=0;i<secremain;i++)//¸′ÖÆ
{
STMFLASH_BUF[i+secoff]=pBuffer[i];
}
STMFLASH_Write_NoCheck(secpos*STM_SECTOR_SIZE+STM32_FLASH_BASE,STMFLASH_BUF,STM_SECTOR_SIZE/2);//D′èëÕû¸öéèÇø
}else STMFLASH_Write_NoCheck(WriteAddr,pBuffer,secremain);//D′òѾ-2á3yáËμÄ,Ö±½óD′èëéèÇøê£óàÇø¼ä.
if(NumToWrite==secremain)break;//D′èë½áêøáË
else//D′èëÎ′½áêø
{
secpos++; //éèÇøμØÖ·Ôö1
secoff=0; //Æ«òÆÎ»ÖÃÎa0
pBuffer+=secremain; //Ö¸ÕëÆ«òÆ
WriteAddr+=secremain; //D′μØÖ·Æ«òÆ
NumToWrite-=secremain; //×Ö½ú(16λ)êyμY¼õ
if(NumToWrite>(STM_SECTOR_SIZE/2))secremain=STM_SECTOR_SIZE/2;//ÏÂò»¸öéèÇø»1êÇD′2»íê
else secremain=NumToWrite;//ÏÂò»¸öéèÇø¿éòÔD′íêáË
}
};
FLASH_Lock();//éÏËø
}
|
|