中级会员
 
- 积分
- 204
- 金钱
- 204
- 注册时间
- 2017-3-17
- 在线时间
- 66 小时
|
10金钱
原子哥的STMFLASH_Write(FLASH_SAVE_ADDR1,LUA_str, 1500) ;往flash 中写3K的数据怎么只有1K写成功:用的是原子的例程。求大神指点
u16 STMFLASH_BUF[STM_SECTOR_SIZE/2];//×î¶àêÇ2K×Ö½ú
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£¬¼ì2éêÇ2»êÇFF
{
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();//éÏËø
}
#endif
|
|