【问题】STM32G0芯片擦除flash失败,发现死在FLASH_SR_CFGBSY一直为1(已解决)

这篇具有很好参考价值的文章主要介绍了【问题】STM32G0芯片擦除flash失败,发现死在FLASH_SR_CFGBSY一直为1(已解决)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本人开发stm32g030和g070都遇到过擦除flash失败的问题,HAL库中按照例程方式擦除存在擦除失败问题。例程基本流程如下:

HAL_FLASH_Unlock();
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_ALL_ERRORS) ;
HAL_FLASHEx_Erase(&pEraseInit,&PageError);
HAL_FLASH_Lock() ;

按照这种方式其实很容易擦除失败。网上多数是说中断问题等,还有些是看门狗喂狗问题。

以上问题之外,本人遇到的是FLASH_FLAG_CFGBSY一直被置位,导致擦除函数里判断等待超时以后就略过去了。

【问题】STM32G0芯片擦除flash失败,发现死在FLASH_SR_CFGBSY一直为1(已解决)

尝试注释掉这一部分的话,会在执行擦除时之后触发硬件错误中断。所以该方法不可取。作者开始寻找在擦除前通过某些操作把FLASH_SR_CFGBSY标志位给置0,由于该标志位是硬件置位的,软件没法置0,因此只能通过其他方式。

作者在尝试了诸多方法都没法把FLASH_SR_CFGBSY标志置0,想换个方式解决,就是找到发生该标志被置1的原因,结果发现本人的项目是因为串口1的发送执行之后,FLASH_SR_CFGBSY就被置1了。

调用串口1发送前下图:

【问题】STM32G0芯片擦除flash失败,发现死在FLASH_SR_CFGBSY一直为1(已解决)

调用串口1发送后下图:

【问题】STM32G0芯片擦除flash失败,发现死在FLASH_SR_CFGBSY一直为1(已解决)

本人项目对打印日志的需求还是很需要的,所以不可能将就不使用打印的,于是又是在网上漫长地寻找答案。某些论坛上也遇到同病相怜的开发者发表了一样CFGBSY标志置1不恢复的问题,没人给出合适的答案。

偶然间自己尝试通过iar的debug强制修改字符结果神奇的事情发生。

【问题】STM32G0芯片擦除flash失败,发现死在FLASH_SR_CFGBSY一直为1(已解决)

随便写个‘1’

 【问题】STM32G0芯片擦除flash失败,发现死在FLASH_SR_CFGBSY一直为1(已解决)

按下回车键确定,发生如下图的结果:

【问题】STM32G0芯片擦除flash失败,发现死在FLASH_SR_CFGBSY一直为1(已解决)

 CFGBSY置0了,同时报了3个错误标志来。

作者由此得来灵感,在unlock前,判断CFGBSY是否置位1,如果在flash代码区域中在自己觉得没用的区域执行写入操作,就能够把CFGBSY置0,同时报其他flash错误标记,然后通过清除这些标记的手段实现擦除动作。具体代码参考如下:

#define FLASH_FLAG_ALL_ERRORS           (FLASH_FLAG_OPERR   | FLASH_FLAG_PROGERR | FLASH_FLAG_WRPERR | \
                                         FLASH_FLAG_PGAERR  | FLASH_FLAG_SIZERR  | FLASH_FLAG_PGSERR | \
                                         FLASH_FLAG_MISERR  | FLASH_FLAG_FASTERR | \
                                         FLASH_FLAG_OPTVERR | FLASH_FLAG_ECCC    | FLASH_FLAG_ECCD)
uint8_t lc_flash_ram_to_rom(void)
{
    FLASH_EraseInitTypeDef pEraseInit ;

    uint32_t PageError = 0;
    pEraseInit.TypeErase = FLASH_TYPEERASE_PAGES ;
    pEraseInit.Page = WORK_STORE_TABLE_PAGE ;
    pEraseInit.NbPages = 1 ;
    // pEraseInit.Banks = FLASH_BANK_1 ;

again:

    if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_CFGBSY) != 0x00U)
    {
        *(uint32_t *)(WORK_STORE_TABLE_ADDR+240) = 12323;//flash随意写入一个值,使flash触发错误
        __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_ALL_ERRORS) ;
    }
    if(HAL_FLASH_Unlock() != HAL_OK)
    {
        goto again ;
    }
    FLASH_WaitForLastOperation(10) ;//等待一下,提升擦除成功率

    HAL_FLASHEx_Erase(&pEraseInit,&PageError);
    
    if(PageError != 0xFFFFFFFF) {
        DEBUG_printf("\r\nerase fail\r\n") ;
        goto again ;//失败时重新执行
    }

    uint32_t flash_unit_n = (sizeof(work_store_table) / FLASH_UNIT_VALUE) + 1 ;
    uint64_t * flash_pdata = (uint64_t *)(&work_store_table) ;
    for(uint32_t i = 0 ; i < flash_unit_n ; ++i) {
        HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD,WORK_STORE_TABLE_ADDR+i*8,*(flash_pdata+i)) ;
    }
    HAL_FLASH_Lock() ;

    return 1 ;
}

      关键代码:

  *(uint32_t *)(WORK_STORE_TABLE_ADDR+240) = 12323

该方法只是随意在flash块中在自己想要擦除的地方随意写一个值。

通过多次测试,成功率100%,认为已经解决该问题,至于该工程的串口1为什么会触发CFGBSY置位,已经不用关系。虽然找不到根本原因,但是只要能解决问题的话作者已经不在深究。文章来源地址https://www.toymoban.com/news/detail-499654.html

到了这里,关于【问题】STM32G0芯片擦除flash失败,发现死在FLASH_SR_CFGBSY一直为1(已解决)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32单片机Flash不擦除直写案例分析

    产品跳闸前需保存致使产品动作的故障类型和具体的故障分析数据,并在产品二次上电后读取故障类型,进行相应指示;之后清除故障类型的相关Flash,但故障分析数据仍保存,以便后续读出分析。然而,Flash扇区擦除时间较长,会影响程序正常运行、判断。 Flash的编程原理都

    2024年02月16日
    浏览(37)
  • STM32G473VET6 FlashDB数据库移植(裸机、片内Flash)

    此文档也适用于STM32G070 此处使用FlashDB官方最新源码 FlashDB: 一款支持 KV 数据和时序数据的超轻量级数据库 (gitee.com) 克隆源码后目录如下 红框中几个为移植必要文件与参考 根据FlashDB官方文档可知,FlashDB底层依赖于RT-Thread的FAL组件,所以需要先移植FAL FlashDB源码中port目录下即

    2024年01月21日
    浏览(36)
  • STM32G030F6P6 芯片实验 (一)

    淘宝搞了几片, 没试过 G系列, 试试感觉. 先搞片小系统版: 套 STM32F103C8T6小系统板格式. (1) Ref 有点跳, 从 STM32F103C8T6 系统板改的, 没重编号. (2) Type-C 纯给电, 砍了 16pin的, 直接换 6pin的。 (3) 测试LED放 B2。 (4) 测试底板用原来 STM32F103C8T6的。 直接用嘉立创EDA画了板, EDA用起来还可以

    2024年02月08日
    浏览(29)
  • STM32G030F6 (SOP-20)Cortex ® -M0+, 32KB Flash, 8KB RAM, 17 GPIOs

    淘宝淘了一批 STM32G030F6P6 SOP20.先备注一下, 还没想到能干嘛用. 手上的 STM32F103C6T6还剩一些. 一堆 “淘宝原厂STM32F103C8T6”, 还烫着手. 理解信息: ( 逐步补充 ) System Clock GPIOs USART Timer ADC I2C STM32G030F6 (SOP-20) Arm ® Cortex ® -M0+ 32-bit MCU, 32 KB Flash, 8 KB RAM, 2x USART, timers, ADC, comm. I/Fs

    2024年02月10日
    浏览(28)
  • STM32使用QSPI控制FLASH(FLASH芯片型号:MX25L25645G)

             本篇详细的记录了如何使用STM32CubeMX配置STM32H723ZGT6的QSPI外设与 SPI Flash 通信(MX25L25645G)。 1、MX25L25645G引脚示意如图: 手册上的各个引脚的定义如图:         由以上可知,该芯片可以使用SPI/QSPI控制,SPI模式使用SO、SI,SCLK,以及CS角,此状态下WP角被作为

    2024年04月22日
    浏览(41)
  • stm32同芯片但不同flash工程更换Device出现报错

    stm32同芯片但不同flash工程更换Device出现报错 更换Device,我是从ZE换为C8: 把这个从HD更换为MD 解决!

    2024年02月09日
    浏览(32)
  • (超详细)STM32芯片Flash读写操作讲解和代码(寄存器版本)

    关于Flash,官方的解释为:Flash为32位宽的存储单元,可用于存储代码和数据常量。Flash模块位于微控制器内存映射中的特定基址……。而对于我们来说,只要知道Flash闪存区是一个掉电后也不会清除的数据存储地。(相信大家对于Flash闪存也有着一定 的了解了,我也不多说废话

    2023年04月19日
    浏览(36)
  • 解决stm32芯片锁死 出现Error:Flash Download Failed-“Cortex-M3“

    打开MDK软件使用SW当时连接单片机发现能连接到板子 显示已经连接上 但是再下载的时候出现Error:Flash Download Failed-\\\"Cortex-M3\\\"下载错误 首先排除硬件连接问题,能够连接到stm32说明硬件连接没有问题,再排除软件编译错误,最后预估可能是硬件stm32芯片由于脉冲电平的干扰导致芯

    2024年02月15日
    浏览(65)
  • STM32芯片flash被锁导致Error Flash Download failed Cortex-M4,解决办法(全)亲测有效

    STM32芯片flash被锁导致Error: Flash Download failed - \\\"Cortex-M4\\\",解决办法(全)亲测有效🤩! 方法1:由于Keil 中debug的仿真器配置出错导致的下载失败(这种问题虽然是低级错误,但我还是觉得非常有必要确认一下自己的配置有没有出错) 方法2:使用第三方烧录软件,通过串口烧录

    2024年02月12日
    浏览(42)
  • 解决STM32G431输出PWM扫频消失问题

            最近练习蓝桥杯嵌入式的题目,需要输出一个PWM扫频的信号,遇到了PWM变频率时有几率消失的问题, 下面来研究下原因和解决方案。          由于Keil怎么改设置都不肯给我看外设寄存器,下面用CubeIDE复现下PWM消失的情况,用ST-Link调试。         时钟倍频

    2024年04月10日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包