金牌会员
 
- 积分
- 1400
- 金钱
- 1400
- 注册时间
- 2016-6-2
- 在线时间
- 166 小时
|
1金钱
用107VC进行IAP在线升级,上位机每次发1000个字节,直到把整个APP代码发送完成,我能够接收一次就写一次flash,然后下一次再接收1000个字节,再写一次flash么?void STMFLASH_Write(u32 WriteAddr,u16 *pBuffer,u16 NumToWrite)
{
u32 secpos;
u16 secoff;
u16 secremain;
u16 i;
u32 offaddr;
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;
secoff=(offaddr%STM_SECTOR_SIZE)/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[i];
}
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++;
secoff=0;
pBuffer+=secremain;
WriteAddr+=secremain*2;
NumToWrite-=secremain;
if(NumToWrite>(STM_SECTOR_SIZE/2))secremain=STM_SECTOR_SIZE/2;
else secremain=NumToWrite;
}
};
FLASH_Lock();
}
我定义了一个u8 RX_BUF【1000】用来接收每次传过来的1000个字节,但每次发送完之后都无法运行APP程序。写地址是iap_write_appbin((FLASH_APP1_ADDR+(cishu*1000)),RX_BUF,recvlen);
cishu为接收次数,接收一次就加1,目测是写flash出错了,但是没找到原因。
请大神指点迷津。
|
最佳答案
查看完整内容[请看2#楼]
void STMFLASH_Write(u32 WriteAddr,u16 *pBuffer,u16 NumToWrite) 看下这个函数的写入步骤, 首先确定写入地址所在的页,然后读取整页数据出来 ,判断数据是否全部是0xFF,是则写入数据,否则先檫除该页。 你第一次写入1000字节后,第二次写入地址还是和第一次写入的地址属于同一页, 所以第二次写入的时候,读取数据判断数据是否全部是0xFF,这步的结果是否,然后程序檫除该页, 你前面写入的数据会被全部檫除掉。 所以正确 ...
|