打印
[STM32L4]

stm32 IAP FLASH 擦除失败

[复制链接]
3940|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xjtu2011|  楼主 | 2019-4-2 15:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请教大家,在STM32L431的板子上加入IAP升级引导工程后,原本APP程序中的flash擦写时,擦除总是出错,为什么?具体实验过的现象和疑问有:
如果是IAP程序的问题,但屏蔽掉flash操作功能部分,IAP+APP结构的程序,不管在线调试还是不在线都可以正常运行,这样IAP好像没有问题。
如果是flash擦写函数的问题,那么仅烧写APP程序时,又能正常操作flash。
试图修改IAP和APP两个工程的flash区域配置,两个工程不管有没有flash 交叉,都存在擦除失败的问题。
这问题到底在哪儿?
flash操作的函数如下,先擦除一页,再写数据:
void fsh_putbuf(uint32 adr, uint32 *buf, uint16 len)    //每页写入都是从起始位置写
{
  uint32_t prog_bit = 0;
   
  DIS_INT;
  HAL_FLASH_Unlock();
  
   __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_BSY|FLASH_FLAG_EOP|FLASH_FLAG_PGSERR|FLASH_FLAG_WRPERR);

  FirstPage = GetPage(adr);

  NbOfPages = 1;

  BankNumber = 1;
  /* Fill EraseInit structure*/
  EraseInitStruct.TypeErase   = FLASH_TYPEERASE_PAGES;
  EraseInitStruct.Banks       = BankNumber;
  EraseInitStruct.Page        = FirstPage;
  EraseInitStruct.NbPages     = NbOfPages;
  

  if (HAL_FLASHEx_Erase(&EraseInitStruct, &PAGEError) != HAL_OK)
  {
    while (1)
    {
//      __set_FAULTMASK(1);//发出复位请求前,先把FAULTMASK 置位。防止从SYSRESETREQ 被置为有效,到复位发生器执行复位命令期间,处理器响应中断请求。
//        HAL_NVIC_SystemReset();  
    }
  }

  //flash每次写入64bit,8个字节
  uint64 d1;
  uint64 d2;
  
  if(len % 8==0){
    len = len / 8;
  }
  else
  { len = len / 8+1;}
  
  while(len--)
  {   
    d1 = *(buf++);
    d2 = *(buf++);
   
    d1=d1|(d2<<32);
   
    FLASH_Program_DoubleWord(adr, d1);
    prog_bit = FLASH_CR_PG;
    adr += 8;               
  }
      if (prog_bit != 0)
    {
      CLEAR_BIT(FLASH->CR, prog_bit);
    }
  __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_BSY|FLASH_FLAG_EOP|FLASH_FLAG_PGSERR|FLASH_FLAG_WRPERR);
  
  HAL_FLASH_Lock();
  EN_INT;
}

使用特权

评论回复
沙发
xjtu2011|  楼主 | 2019-4-2 16:06 | 只看该作者
补充一下,当前IAP仅仅实现了程序的跳转功能。程序能按照APP的输出运行,说明跳转应该是对的

使用特权

评论回复
板凳
香水城| | 2019-4-2 17:00 | 只看该作者
没看明白你到底擦哪里的flash? IAP区还是APP区?

页擦除时,此刻CPU没法访问FLASH的。

确认下页地址是否正确;

擦除函数的写法可以参考下cube库中的void FLASH_PageErase(uint32_t Page, uint32_t Banks)

使用特权

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

本版积分规则

1

主题

2

帖子

0

粉丝