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 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;
}

记录一下,防止忘记。

### STM32G0微控制器内部Flash特性 STM32G0系列微控制器内置闪存(Flash),具有高可靠性和灵活性,支持多次编程操作。该系列设备通常配备高达128KB的嵌入式闪存存储器,用于保存程序代码和静态数据[^1]。 #### Flash特性概述 - **容量范围**:根据不同型号,提供多种不同大小的选择,最高可达128 KB。 - **擦写寿命**:典型情况下可承受至少十万次擦/写周期,在整个工作温度范围内保持稳定性能。 - **读取速度**:优化后的架构允许快速访问指令流,从而提高应用程序执行效率。 - **低功耗模式下保留能力**:即使在系统进入待机状态时也能安全地保护已存储的信息。 ```c // 示例:查询当前芯片上的Flash信息 HAL_FLASHEx_GetBankInfo(&bank_info); ``` ### 使用方法与编程接口 为了简化对内建Flash的操作过程,官方提供了丰富的库函数来处理常见的任务,比如页级或扇区级别的擦除命令、字节级别写入等功能调用。开发者可以通过标准外设驱动API来进行这些基本操作: ```c // 擦除指定地址所在的页面 if (HAL_FLASH_Unlock() != HAL_OK) { Error_Handler(); } __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_WRPERR | FLASH_FLAG_PGERR); if (HAL_FLASHEx_Erase(&eraseInitStruct, &pageError) != HAL_OK){ Error_Handler(); } // 锁定Flash再次防止意外修改 HAL_FLASH_Lock(); ``` 对于更复杂的场景,则建议利用专用工具如STM32CubeMX配置项目并生成初始化代码框架;之后再基于此基础编写自定义逻辑实现特定需求的功能模块。 ### 擦除机制详解 当需要更新固件或其他重要数据时,可以选择不同的方式完成这一目标——既可以采用全片擦除的方法彻底清除所有现有内容以便重新加载全新版本的应用程序;也可以仅限于影响某些特定区域内的少量Sector/Page元,以此减少不必要的资源消耗并加快部署进度[^2]。 ```c // 定义要擦除的具体位置参数结构体变量 FLASH_EraseInitTypeDef EraseInitStruct; EraseInitStruct.TypeErase = TYPEERASE_PAGES; // 或TYPEERASE_MASS_ERASE EraseInitStruct.PageAddress = ADDR_FLASH_PAGE_256; EraseInitStruct.NbPages = 1; // 执行实际的擦除动作前解锁Flash控制寄存器权限 HAL_FLASH_Unlock(); // 清楚可能存在的错误标志位 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_ALL_ERRORS); // 调用库函数实施具体类型的擦除流程 if(HAL_FLASHEx_Erase(&EraseInitStruct,&PageError)!= HAL_OK){ while (1); // 处理失败情况下的异常分支 } ``` ### 生命周期管理策略 考虑到长期运行环境中可能出现的各种不确定因素,合理规划Flash内存空间分配方案显得尤为重要。一方面应当尽可能避免频繁的小规模改写行为以免过早损耗硬件耐久度;另一方面则需定期备份关键资料以防万一发生不可逆损坏事件造成无法挽回的数据丢失风险。此外还可以考虑引入冗余校验算法增强整体系统的鲁棒性表现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值