打印
[STM32F4]

写入内部flash数据遇到问题了,求助!!!

[复制链接]
4546|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tkyl01|  楼主 | 2016-1-7 15:16 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 tkyl01 于 2016-1-7 15:29 编辑

MCU:STM32F415RG

最近在做 蓝牙IAP,在写入flash代码时遇到了问题
这个片子的内部flash的 扇区也太大了,读写都有点不方便了。

IAP程序写好后,连接上串口把程序下载到片子,发现没反应,后来就把flash APP区的代码读取了回来发现 与原程序代码 对应不上,两头都对,中间一截数据却莫名奇妙的不对应,上图……

   

   
        








向flash 写数据 代码:
void StmFlashWrite(u32 WriteAddr,u32 *pBuffer,u32 NumToWrite)
{
    FLASH_Status status = FLASH_COMPLETE;
    u32 addrx = 0;
    u32 endaddr = 0;
    if((WriteAddr < STM32_FLASH_BASE) || (WriteAddr%4)) return; //非法地址
    FLASH_Unlock();          //解锁
    FLASH_DataCacheCmd(DISABLE);            //FLASH擦除期间,必须禁止数据缓存
    addrx = WriteAddr;            //写入的起始地址
    endaddr = WriteAddr + NumToWrite*4;     //写入的结束地址
   
    if(addrx < 0X1FFF0000)           //只有主存储区,才需要执行擦除操作!!
    {
        while(addrx < endaddr)          //扫清一切障碍.(对非FFFFFFFF的地方,先擦除)
        {
            if(StmFlashReadWord(addrx) != 0XFFFFFFFF)//有非0XFFFFFFFF的地方,要擦除这个扇区
            {   
                status = FLASH_EraseSector(StmFlashGetSector(addrx),VoltageRange_3);//VCC=2.7~3.6V之间!!
                if(status != FLASH_COMPLETE)    break; //发生错误了
            }
            else addrx += 4;
        }
    }
    if(status == FLASH_COMPLETE)
    {
        while(WriteAddr < endaddr)//写数据
        {
            if(FLASH_ProgramWord(WriteAddr,*pBuffer) != FLASH_COMPLETE)//写入数据
            {
                break; //写入异常
            }
            WriteAddr += 4;
            pBuffer ++;
        }
    }
    FLASH_DataCacheCmd(ENABLE); //FLASH擦除结束,开启数据缓存
    FLASH_Lock();//上锁
}
求助 大家 帮忙分析一下

程序 bin.rar (538.5 KB)


沙发
maiweiqi| | 2016-1-7 15:27 | 只看该作者
是不是传进去的数据不对,在准备写错误的那个地址的时候,在写入之前先打印一次出来看看呗。

使用特权

评论回复
板凳
tkyl01|  楼主 | 2016-1-7 16:14 | 只看该作者
解决了,原先用的
void IapWriteAppBin(u32 appxaddr,u8 *appbuf,u32 appsize)
{
u32 iapbuf[512] = {0};  //2K字节缓存
    u32 t = 0;
u16 i = 0;
u32 temp = 0;
u32 fwaddr = appxaddr;//当前写入的地址
u8 *dfu = appbuf;
for(t = 0;t < appsize;t += 4)
{         
  temp = (u32)dfu[3] << 24;   
  temp |= (u32)dfu[2] << 16;   
  temp |= (u32)dfu[1] << 8;
  temp |= (u32)dfu[0];   
  dfu += 4;//偏移4个字节
  iapbuf[i ++] = temp;     
  if(i == 512)
  {
   i = 0;
   StmFlashWrite(fwaddr,iapbuf,512);
   fwaddr += 2048;//偏移2048  512*4=2048
  }
}
if(i)   StmFlashWrite(fwaddr,iapbuf,i);//将最后的一些内容字节写进去.  
}

把程序写入flash的,现在改掉了 直接用的 StmFlashWrite(FLASH_APP1_ADDR + applenth,(u32 *)USART1_RX_BUF,RXlen/4);  代码见上边。



使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

71

帖子

1

粉丝