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

STM32G0B1无法操作FLASH,解锁FLASH失败

[复制链接]
ZPKL 提问时间:2021-7-7 21:55 / 已解决
使用STM32G0B1写内部的Flash时出现问题,代码:
#pragma arm section code = "RAMCODE"
uint32_t NorFlash_Write_ttu(uint16_t operateCmd, uint32_t startAddr, uint32_t * pPageDatas, uint16_t datasLen)
{
    uint16_t writeCount = datasLen / 8; //因为datasLen传入的长度是固定1024(按byte算的),而实际写Flash是按64字节写入的,所以这里转换为uint64_t类型时的长度
    uint16_t i;
    uint8_t retry = 3;
    HAL_StatusTypeDef status = HAL_OK;
   
    // 清除Flash待处理标识
    //__HAL_FLASH_CLEAR_FLAG(HAL_FLASH_GetError());
    // 解锁Flash写
    HAL_FLASH_Unlock();
    // 检查BUSY状态
    do
    {
            status = FLASH_WaitForLastOperation(10);
            if((HAL_ERROR == status) || (--retry == 0))
            {
                //HAL_FLASH_Lock();
                return HAL_FLASH_GetError();
            }
        }while(HAL_TIMEOUT == status);
        
    // 擦除将要写入的地址页
    if(operateCmd & 0x0002) //设标志判断是否需要擦除
    {
        FLASH_PageErase(FLASH_BANK_1, (startAddr - NORFLASH_START_ADDRESS) / NORFLASH_PAGE_SIZE);
        retry = 3;
        do
        {
            status = FLASH_WaitForLastOperation(10);
            if((HAL_ERROR == status) || (--retry == 0))
            {
                //HAL_FLASH_Lock();
                return HAL_FLASH_GetError();
            }
        }while(HAL_TIMEOUT == status);
        // 注:擦除完成后控制寄存器(CR寄存器)的擦除使能位(PER位)不会自动清除,需要手动清除
        CLEAR_BIT(FLASH->CR, FLASH_CR_PER);
    }
    // 写入数据
    for(i = 0; i < writeCount; ++i)
    {
        // 写入Flash,注意写入时是64位写入,i*2是因为pPageDatas是uint32_t类型(为了代码兼容)
        if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, startAddr + i * 8, *(uint64_t *)(pPageDatas+i*2)) != HAL_OK)
        {
            //HAL_FLASH_Lock();
            return HAL_FLASH_GetError();
        }
    }
    // 加锁FLASH
    HAL_FLASH_Lock();
   
    // 判断写入结果
    return HAL_OK;
}
#pragma arm section
遇到的问题是,基于nucleo-g0b1re开发板,新建的工程实现这个写flash操作和一个串口输出log,每次起来后在HAL_FLASH_Unlock()之后,状态寄存器(SR)都会置位0x000000A0,即PGA编程对齐错误和PGSERR编程顺序错误;另外unlock()之后的FLASH_WaitForLastOperation()中清除SR寄存器语句之后,会置位成0x00040000,即CFGBSY 编程或擦除配置繁忙位置1,所以把HAL_FLASH_Lock()屏蔽了,执行这个会导致程序hard_fault
有在HAL_Init()和SystemClock_Config()处加断点查看SR寄存器,此时就已经是0x000400A0。有怀疑芯片坏了,但换芯片后仍旧有问题。

求教如何解决,或相关的代码
收藏 评论5 发布时间:2021-7-7 21:55

举报

5个回答
butterflyspring 最优答案 回答时间:2021-7-9 12:09:36
官方有现成的例程,可以参考一下
STM32Cube_FW_G0_V1.4.1\Projects\NUCLEO-G0B1RE\Examples\FLASH\FLASH_EraseProgram
Hans.he 回答时间:2021-8-2 12:25:04
butterflyspring 发表于 2021-7-9 12:09
官方有现成的例程,可以参考一下
STM32Cube_FW_G0_V1.4.1\Projects\NUCLEO-G0B1RE\Examples\FLASH\FLASH_Er ...

兄弟 你的后面咋解决 我也碰到了,仿真器只要一运行,FLASH_SR寄存器的CFGBSY就置1了, 完全无法操作,不管代码里面是否有操作flash 均如此。直觉告诉我是仿真器的匹配问题但是发现几个仿真器均如此。有其他兄弟碰到过吗?可否指导一下
Hans.he 回答时间:2021-8-17 16:19:14
butterflyspring 发表于 2021-7-9 12:09
官方有现成的例程,可以参考一下
STM32Cube_FW_G0_V1.4.1\Projects\NUCLEO-G0B1RE\Examples\FLASH\FLASH_Er ...

用官方例程,什么都不更改,直接下载进去运行 也是如此。个人感觉是:仿真器和编译器与芯片哪里没有匹配好,不过目前没有足够的证据证明该问题,ST原厂也没有回复,不知道大家是否有碰到该问题。
有碰到的解决了的麻烦大家支援一下,
我在阿莫电子论坛上看到有类似的问题,但是那是17年关于F4的flash操作,也有类似问题,后面那位大哥的解决方案是:原厂支援把MDK升级和仿真器升级,问题就解决了,代码没有改动。
Hans.he 回答时间:2021-9-17 12:04:28
哥们 你这个问题 我也碰到了 是否后面有解决,事怎么解决的 方便共享一下解决办法和发现吗
Hans.he 回答时间:2021-9-23 14:28:42
butterflyspring 发表于 2021-7-9 12:09
官方有现成的例程,可以参考一下
STM32Cube_FW_G0_V1.4.1\Projects\NUCLEO-G0B1RE\Examples\FLASH\FLASH_Er ...

例程一样的有问题,
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版