请教大家,在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; 
} |   
     
  
 |