
请教各位,使用的芯片是stm32g474cbt6,按照手册说法,single bank是单一flash区域,最小擦除是4k,dual bank是支持双flash区域,一边操作不影响另外一块,最小擦除是2k. 手册判定依据:读取flash option register,其中BFB2位是0,表示是单bank模式。 而我这边不管是打印出寄存器状态值,还是用cube工具读出来,都是BFB2为0,DBANK为1。bit22 DBANK 表示单bank和双bank的数据大小。同时我自己实测下来,默认状态的最小擦除是2k,但用hal的api,双bank操作不行,实际应该是单bank,但是single bank的擦除又是2k,和手册的最小4k不一致。。 下图是手册的bank模式的判定寄存器说明和cube工具的读出。 下图是手册说明,bank模式不同,分区和最小擦除单位不同。g474cbt6是3类flash 下图说DBANK是1,表示双bank。 我这边,上电默认 BFB2 是0, DBANK是1,我试了很多次结果一致,同时擦除最小单位2k,擦除用single bank模式可以覆盖全部。我实在有点搞不懂,感觉混在一起了,不知道是不是我理解不对,望各位大佬指点一下 |
STM432G4单片机IAP程序+上位机
关于STM32G474 双BANK的测试问题
STM32G473 flash擦除时程序卡死
使用stm32F407连接PHY芯片进行以太网通讯,一插网线就会进入错误中断。
STSPIN32G4内部驱动电压输出问题
comp输出用于tim1刹车,消隐源和pwm输出是不是得是同一个TIM?
STM32H7双核调试问题:CM7能成功调试但CM4始终报"Failed to read ROM table via AP 3"错误
STM32G431内部运放1和2输出连接的ADC为什么不是OPAMP?
workbench6.3.2生成的代码,无法用pilot电机参数识别,无法通讯
STM32G474高精度定时器HRTIM配置死区互补PWM极端输出问题
下面文章你可以参考下:
STM32G4 双BANK Flash模式页擦除话题
补充两点:
所以用single bank 時需要根據手冊修改這些宏定義的值,包括判斷參數的幾個函數。
至于BFB2,是基于双bank是否从BANK2的启动选项,不是单双判断标准。
至于单双BANK的page大小,手册描述没有问题,双BANK是2K,单banK是4K.
我刚才验证过了,基于单bank,每次页擦除就是4KB.
下面代码我就选择某一页进行擦除,看看到底擦2K还是4K.
FirstPage = GetPage(FLASH_USER_START_ADDR);
LastPage = GetPage(FLASH_USER_START_ADDR);
NbOfPages = LastPage- FirstPage + 1;
BankNumber = GetBank(FLASH_USER_START_ADDR);
EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
EraseInitStruct.Banks = BankNumber;
EraseInitStruct.Page = FirstPage/2;
EraseInitStruct.NbPages = NbOfPages;
if (HAL_FLASHEx_Erase(&EraseInitStruct, &PageError) != HAL_OK)
{
Error_Handler();
}
.....
温馨提示,我们的例程默认是按照双BANK做的。
另外,页码别给错了。我今天就卡在这个地方了出了一身汗。
您的意思是看hal库中,对应的宏定义吗?
我这边查到这个结果,FLASH_OPTR_BFB2和FLASH_OPTR_DBANK置位了,说明默认是dual bank模式吗
我懂您的意思,您那边的情况和手册一直。但我这边实测 上电后读取的DBANK置位,BFB2不置位,同时hal库中查到的FLASH_OPTR_BFB2和FLASH_OPTR_DBANK置位。这我提到的上面前提下,我对bank2进行操作擦除,结果是失败的,实际擦不掉,如下图,若赋值FLASH_BANK_2,同时页数随机从0~32(bank2模式),对应的擦除我这边是不生效的。这也就是我会提出这个帖子的原因,费解。
您那边能否也看下上电后您芯片默认的DBANK和BFB2位的数据,以及hal库的地址?
[md]多谢!
根据参考手册描述,128k 产品只有单bank功能,所以不用在它上面试了。
而且它的结构就是 2k page的。您在核对一下看看。
您好,感谢答复,我看到手册上stm32g474属于类别3,类别3中有关flash的划分也是有128k的,stmg474cbt6也是支持的吧?
再看了一遍手册,是我看错了。
你截图的部分是对的。
我这边没有128K的芯片,但是我用512k的Nucleo 板上的芯片测试是对的。
只是例程按照dual bank 设计的,好几个地方需要更改,能直接给参数的直接给,不要用获取参数的函数。
老哥,解决了吗 ?我这边芯片用的也是STM32G474CBT6 ,flash大小为128k,发现对bank2 也就是32-61页无法擦除写入,BANK1 就可以.😕
如果你用的是例程,注意PAGE的编号
#define FLASH_OPTR_DBANK 后
FirstPage 编号从 0 开始。
你可以调试一下并观测寄存器 PNB位是否对应