你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm32g030f6p6 flash快速编程总是失败

[复制链接]
の风 提问时间:2021-4-8 21:35 / 未解决
使用stm32g030f6p6 对flash快速编程时总是第一次可以正常的写,第二次写就失败,失败地方总在 HAL_FLASH_Program这条函数,这个地方卡了好几个星期了,现在请广大的坛友帮忙解决或者分享下经验。
下面时个人写的程序,字节对齐时没错了,
   HAL_StatusTypeDef sta=0;
    uint32_t end_addr;

    HAL_FLASH_Unlock();                                                   
    if(init==FLASH_SAVE)
        flashAddr += FLASH_INDEX_SIZE;

    end_addr =flashAddr+write_num*FLASH_INDEX_SIZE;  

    if(end_addr > g_my_flash.flash_end_addr || init==FLASH_ERASER)/*如果如果地址大于存储的结束地址 则把当前页面的数据擦除*/
    {       
        flashAddr = g_my_flash.flash_start_addr;
        end_addr =flashAddr+write_num*FLASH_INDEX_SIZE;         
        ClrFlashPage();    //清除
    }

  while (flashAddr < end_addr)
  {
    if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, flashAddr, *p_Write) == HAL_OK)
    {
        p_Write+=1;
        flashAddr = flashAddr + 8;
    }
   else
    {
      /* Error occurred while writing data in Flash memory.
         User can add here some code to deal with this error */
      while (1)
      {        
            LED_ON;
            HAL_Delay(1000);
            LED_OFF;
            HAL_Delay(1000);
      }
    }
  }   
    flashAddr = flashAddr - FLASH_INDEX_SIZE;  
    HAL_FLASH_Lock();   

收藏 评论6 发布时间:2021-4-8 21:35

举报

6个回答
xmshao 回答时间:2021-4-9 08:51:40
你如果快速编程的话,相关函数要放到RAM里进行。前不久,我刚好基于G0测试过,你度娘一下这个   STM32L0芯片FLASH编程示例及提醒  做参考。快速编程函数放到RAM里进行。​二者快速编程不完全一样,G0的快速编程是页编程,即256字节的页编程。
xmshao 回答时间:2021-4-9 08:56:40
对于G0而言,如果标准FLASH编程,你要遵循双字(64bits)对齐,如果快速编程,你要遵循页对齐即256字节对齐,而且还要在RAM里运行快速编程函数。
の风 回答时间:2021-4-10 09:39:39
xmshao 发表于 2021-4-9 08:56
对于G0而言,如果标准FLASH编程,你要遵循双字(64bits)对齐,如果快速编程,你要遵循页对齐即256字节对齐 ...

我用的不是快速编程,一次只存储两个字 对齐是64,现在还是不行,每次写数据都死在这里:
/* check flash errors. Only ECC correction can be checked here as ECCD
      generates NMI */
  error = (FLASH->SR & FLASH_FLAG_SR_ERROR);

  /* Clear SR register */
  FLASH->SR = FLASH_FLAG_SR_CLEAR;

  /* Update error with ECC error value */
  eccerr = (FLASH->ECCR & FLASH_FLAG_ECCC);

  if(eccerr != 0x00u)
  {
    FLASH->ECCR |= eccerr;
    error |= eccerr;
  }

  if (error != 0x00U)
  {
    /*Save the error code*/
    pFlash.ErrorCode = error;

    return HAL_ERROR;
  }
飞奔的皮卡丘 回答时间:2021-4-13 11:42:04
请问楼主说的“总是第一次可以正常的写,第二次写就失败”是什么意思?
是同一个扇区同一个位置写第一次成功,写第二次失败?还是同一个扇区写第一个双字正确,写第二个双字就出错?
如果是写同一个扇区的同一个位置,有确认在写操作之前已经正确擦除么?
の风 回答时间:2021-4-15 10:32:37
飞奔的皮卡丘 发表于 2021-4-13 11:42
请问楼主说的“总是第一次可以正常的写,第二次写就失败”是什么意思?
是同一个扇区同一个位置写第一次成 ...

每次写不是同一个地址的,写入新的地址都是新的空白地址,新的地址是就地址经过偏移得到的,目前是上电运行我的测试程序是可以正常整页擦除操作的,但是进入到main函数的时候再调用,就会出现问题,
荻夜 回答时间:2021-5-9 08:32:21
の风 发表于 2021-4-10 09:39
我用的不是快速编程,一次只存储两个字 对齐是64,现在还是不行,每次写数据都死在这里:
/* check flash ...

执行编程之前最好先清除一下相关标志位
  1.     /* 清楚错误标志位*/
  2.     __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_ECCC | FLASH_FLAG_ECCD);
  3.     __HAL_FLASH_CLEAR_FLAG(FLASH_SR_CLEAR);
复制代码
另外g030的flash要写数据,一定要保证要写的地址的内容当前是0xFFFFFFFFFFFFFFFF
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版