FLASH写问题

2019-08-17 06:28发布

用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出错了,但是没找到原因。
请大神指点迷津。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
13条回答
cookles
1楼-- · 2019-08-17 06:52
void STMFLASH_Write(u32 WriteAddr,u16 *pBuffer,u16 NumToWrite)   看下这个函数的写入步骤, 首先确定写入地址所在的页,然后读取整页数据出来 ,判断数据是否全部是0xFF,是则写入数据,否则先檫除该页。  你第一次写入1000字节后,第二次写入地址还是和第一次写入的地址属于同一页, 所以第二次写入的时候,读取数据判断数据是否全部是0xFF,这步的结果是否,然后程序檫除该页, 你前面写入的数据会被全部檫除掉。   所以正确的做法是一次写1K的整数倍。
密耳
2楼-- · 2019-08-17 12:07
 精彩回答 2  元偷偷看……
hyarcher25
3楼-- · 2019-08-17 15:47
密耳 发表于 2016-9-13 13:09
RX_BUF【1024】

一定要1024么。。。
62021732
4楼-- · 2019-08-17 15:55
关于Flash读写的问题我觉得你可以先写个小程序验证一下。另外,FLASH写之前要进行擦除操作。
jermy_z
5楼-- · 2019-08-17 20:50
你两边协议定好啊,第一次接收正确并写入,再开始第二次的发送接收,循环这个步骤
hyarcher25
6楼-- · 2019-08-17 21:47
jermy_z 发表于 2016-9-13 15:21
你两边协议定好啊,第一次接收正确并写入,再开始第二次的发送接收,循环这个步骤

嗯嗯,我就是这个思路。
就是怀疑第二次开始写入的那个地址是不是不正确。
FLASH_APP1_ADDR+(cishu*1000)

一周热门 更多>