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;
}
记录一下,防止忘记。