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

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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版