打印
[STM32L4]

擦除总是出错

[复制链接]
1647|34
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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好像没有问题。

使用特权

评论回复
5
houcs| | 2021-2-5 21:30 | 只看该作者
flash擦写函数的问题

使用特权

评论回复
6
chuxh|  楼主 | 2021-2-5 21:31 | 只看该作者
仅烧写APP程序时,又能正常操作flash

使用特权

评论回复
7
morrisk| | 2021-2-5 21:33 | 只看该作者
修改IAP和APP两个工程的flash区域配置

使用特权

评论回复
8
chuxh|  楼主 | 2021-2-5 21:37 | 只看该作者
两个工程不管有没有flash 交叉,都存在擦除失败的问

使用特权

评论回复
9
yufe| | 2021-2-5 21:39 | 只看该作者
flash操作的函数看下

使用特权

评论回复
10
chuxh|  楼主 | 2021-2-5 21:41 | 只看该作者
先擦除一页,再写数据

使用特权

评论回复
11
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;
}

使用特权

评论回复
12
chuxh|  楼主 | 2021-2-5 21:46 | 只看该作者
当前IAP仅仅实现了程序的跳转功能。

使用特权

评论回复
13
chuxh|  楼主 | 2021-2-5 21:48 | 只看该作者
程序能按照APP的输出运行,说明跳转应该是对的

使用特权

评论回复
14
happy_10| | 2021-2-5 21:51 | 只看该作者
没看明白你到底擦哪里的flash

使用特权

评论回复
15
zhuhuis| | 2021-2-5 21:53 | 只看该作者
IAP区还是APP区?

使用特权

评论回复
16
chenho| | 2021-2-5 21:55 | 只看该作者
页擦除时,此刻CPU没法访问FLASH的。

使用特权

评论回复
17
juventus9554| | 2021-2-5 21:58 | 只看该作者
确认下页地址是否正确;

使用特权

评论回复
18
dingy| | 2021-2-5 22:07 | 只看该作者
擦除函数的写法可以参考下cube库中的void FLASH_PageErase(uint32_t Page, uint32_t Banks)

使用特权

评论回复
19
chuxh|  楼主 | 2021-2-5 22:10 | 只看该作者

嗯,我再好好缕一缕吧,有了好消息及时通知大家

使用特权

评论回复
20
晓伍| | 2021-3-2 13:59 | 只看该作者
时钟对不对啊

使用特权

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

本版积分规则

936

主题

11296

帖子

2

粉丝