[STM32L4] 擦除总是出错

[复制链接]
 楼主| chuxh 发表于 2021-2-5 21:18 | 显示全部楼层 |阅读模式
STM32L431的板子上加入IAP升级引导工程后,原本APP程序中的flash擦写时,擦除总是出错
stly 发表于 2021-2-5 21:21 | 显示全部楼层

还有什么现象?能再详细描述下吗?
renyaq 发表于 2021-2-5 21:26 | 显示全部楼层
IAP程序的问题啊
 楼主| chuxh 发表于 2021-2-5 21:28 | 显示全部楼层
但屏蔽掉flash操作功能部分,IAP+APP结构的程序,不管在线调试还是不在线都可以正常运行,这样IAP好像没有问题。
houcs 发表于 2021-2-5 21:30 | 显示全部楼层
flash擦写函数的问题
 楼主| chuxh 发表于 2021-2-5 21:31 | 显示全部楼层
仅烧写APP程序时,又能正常操作flash
morrisk 发表于 2021-2-5 21:33 | 显示全部楼层
修改IAP和APP两个工程的flash区域配置
 楼主| chuxh 发表于 2021-2-5 21:37 | 显示全部楼层
两个工程不管有没有flash 交叉,都存在擦除失败的问
yufe 发表于 2021-2-5 21:39 | 显示全部楼层
flash操作的函数看下
 楼主| chuxh 发表于 2021-2-5 21:41 | 显示全部楼层
先擦除一页,再写数据
 楼主| chuxh 发表于 2021-2-5 21:44 | 显示全部楼层

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;
}
 楼主| chuxh 发表于 2021-2-5 21:46 | 显示全部楼层
当前IAP仅仅实现了程序的跳转功能。
 楼主| chuxh 发表于 2021-2-5 21:48 | 显示全部楼层
程序能按照APP的输出运行,说明跳转应该是对的
happy_10 发表于 2021-2-5 21:51 | 显示全部楼层
没看明白你到底擦哪里的flash
zhuhuis 发表于 2021-2-5 21:53 | 显示全部楼层
IAP区还是APP区?
chenho 发表于 2021-2-5 21:55 | 显示全部楼层
页擦除时,此刻CPU没法访问FLASH的。
juventus9554 发表于 2021-2-5 21:58 | 显示全部楼层
确认下页地址是否正确;
dingy 发表于 2021-2-5 22:07 | 显示全部楼层
擦除函数的写法可以参考下cube库中的void FLASH_PageErase(uint32_t Page, uint32_t Banks)
 楼主| chuxh 发表于 2021-2-5 22:10 | 显示全部楼层

嗯,我再好好缕一缕吧,有了好消息及时通知大家
晓伍 发表于 2021-3-2 13:59 | 显示全部楼层
时钟对不对啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

936

主题

11296

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部