欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 美景 > stm32G473的flash模式是单bank还是双bank?

stm32G473的flash模式是单bank还是双bank?

2025/6/13 5:57:48 来源:https://blog.csdn.net/weixin_42550185/article/details/148448708  浏览:    关键词:stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?mod=viewthread&tid=644563

根据STM32G4系列参考手册《STM32G473 Flash存储模式解析》 可知,STM32G473属于双BANK结构。其次通过程序,根据最大的FLASH地址通过程序读取BANK ID,也可以知道是双还是单?

1、通过RM0440 Reference manual查看

《STM32G4系列参考手册》有讲,Table 2. Product specific features,见下图:

 

STM32G484,STM32G474,STM32G483,STM32G473和STM32G471为双BANK。
STM32G441,STM32G431,STM32G4A1和STM32G491为单BANK。

单一BANK结构的CPU采用“128位读取宽度”;双BANK结构的CPU采用“64位读取宽度”;
对于总容量为512K的CPU,单一BANK容量为512K,只有1个BANK,每页有4K字节,每个BANK有128页,页号码范围为:0~127
对于总容量为512K的CPU,双BANK容量为512K,有2个BANK,每页有2K字节,每个BANK有128页,页号码范围为:0~127
对于总容量为256K的CPU,单一BANK容量为256K,只有1个BANK每页有4K字节,每个BANK有64页,页号码范围为:0~63
对于总容量为256K的CPU,双BANK容量为256K,有2个BANK,每页有2K字节,每个BANK有64页,页号码范围为:0~63
对于总容量为128K的CPU,单一BANK容量为128K,只有1个BANK每页有4K字节,每个BANK有32页,页号码范围为:0~31
对于总容量为128K的CPU,双BANK容量为128K,有2个BANK,每页有2K字节,每个BANK有32页,页号码范围为:0~31

#define STM32G474_FLASH_BASE_ADDRESS   ( (uint32_t)0x08000000 ) //STM32 FLASH的编程起始地址
#define STM32_FLASH_END_ADDRESS    ( (uint32_t)0x08020000 )     //总容量为128K的FLASH编程结束地址
#define STM32_BANK_SIZE           2          //所选STM32G473的BANK数量

#if STM32_BANK_SIZE<2                   //CPU的的BANK数量小于2,单一BANK
#define STM_PAGE_SIZE           4096    //每页为4096个字节
#define STMFLASH_WriteLength_SIZE 256   //每页为256个4字
#define STM32_FLASH_START_ADDRESS  ( (uint32_t)0x0801f000 )  //数据保存到CPU最后一页,即第128页,号码为127,页大小为4KB
#define STM32_READ_WIDTH    16    //双BANK结构的CPU采用“16个字节读取宽度(128位)”;
#else
#define STM_PAGE_SIZE                2048  //每个页为2048个字节
#define STMFLASH_WriteLength_SIZE 256  //每页为256个双字
#define STM32_FLASH_START_ADDRESS  ( (uint32_t)0x0801f800 ) //数据保存到CPU的BANK 2的最后一页,即第128页,号码为127,页大小为2KB
#define STM32_READ_WIDTH    8    //双BANK结构的CPU采用“8个字节读取宽度(64位)”;
#endif

2、根据最大的FLASH地址通过程序读取BANK ID,也可以知道这个CPU是双BANK,还是单BANK

程序如下:

//函数功能:读取“BANK的ID号码”
uint32_t GetBank(uint32_t Addr)
{uint32_t bank = 0;if (READ_BIT(SYSCFG->MEMRMP, SYSCFG_MEMRMP_FB_MODE) == 0){//如果“BANK1”和“BANK2”没有交换,No Bank swapif (Addr < (FLASH_BASE + FLASH_BANK_SIZE)){bank = FLASH_BANK_1;//记录当前地址位于“BANK1”}else{bank = FLASH_BANK_2;//记录当前地址位于“BANK2”}}else{//如果“BANK1”和“BANK2”交换,Bank swapif (Addr < (FLASH_BASE + FLASH_BANK_SIZE)){bank = FLASH_BANK_2;//记录当前地址位于“BANK2”}else{bank = FLASH_BANK_1;//记录当前地址位于“BANK1”}}return bank;
}

记录一下,防止忘记。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词