请教各位,使用的芯片是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模式可以覆盖全部。我实在有点搞不懂,感觉混在一起了,不知道是不是我理解不对,望各位大佬指点一下 |
《MCSDK5.X中增加位置环》提及mc_position.c/mc_position.h
STM32G473 DRDY不置位?
stspin32G4这颗mcu里面集成的是哪一款G4?能不能用cubemx来进行配置
STM32G473是否支持硬件AES?
STM32G473VET6同时使用6个片上放大器(OPAMP)的PGA加外部偏置模式,引脚位置让差分信号走线分离,信号有无较大影响?
L9663驱动开发
STM32G474 ADC无法正常启动转换
STM32G474 HRTIM无法正常触发ADC
stm32f103USART2无法收发信息
STM32G431RB,变量接受不到串口发下去的数据
下面文章你可以参考下:
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 设计的,好几个地方需要更改,能直接给参数的直接给,不要用获取参数的函数。