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

发布于:2025-06-06 ⋅ 阅读:(16) ⋅ 点赞:(0)

今天突然有人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 swap
    if (Addr < (FLASH_BASE + FLASH_BANK_SIZE))
    {
      bank = FLASH_BANK_1;//记录当前地址位于“BANK1”
    }
    else
    {
      bank = FLASH_BANK_2;//记录当前地址位于“BANK2”
    }
  }
  else
  {//如果“BANK1”和“BANK2”交换,Bank swap
    if (Addr < (FLASH_BASE + FLASH_BANK_SIZE))
    {
      bank = FLASH_BANK_2;//记录当前地址位于“BANK2”
    }
    else
    {
      bank = FLASH_BANK_1;//记录当前地址位于“BANK1”
    }
  }

  return bank;
}

记录一下,防止忘记。


网站公告

今日签到

点亮在社区的每一天
去签到