当前位置: 首页 > news >正文

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

记录一下,防止忘记。

http://www.xdnf.cn/news/881551.html

相关文章:

  • Android7 Input(十)View 处理Input事件pipeline
  • centos部署k8s v1.33版本
  • EC2安装Docker
  • 【虚拟机版本号】如果忘记了版本号,这样查找版本号
  • 论文速读《DexWild:野外机器人策略的灵巧人机交互》
  • 互联网大厂Java面试:从Spring Cloud到Kafka的技术考察
  • Spring WebFlux 整合AI大模型实现流式输出
  • PostgreSQL 的扩展pg_prewarm
  • Qt 5.12 上读取 .xlsx 文件(Windows 平台)
  • Vue.js 组件:深入理解与实践
  • opencv如何在仿射变换后保留完整图像内容并自动裁剪
  • uniapp+vue3实现CK通信协议(基于jjc-tcpTools)
  • 《如何使用MinGW-w64编译OpenCV和opencv_contrib》
  • JAVA开发工具——IntelliJ IDEA
  • Python Rio 【图像处理】库简介
  • 【图像处理3D】:点云图是怎么生成的
  • Unity VR/MR开发-VR设备与适用场景分析
  • Unity VR/MR开发-VR开发与传统3D开发的差异
  • 在 Vue 的template中使用 Pug 的完整教程
  • 高敏感应用如何保护自身不被逆向?iOS 安全加固策略与工具组合实战(含 Ipa Guard 等)
  • 从内核到应用层:Linux缓冲机制与语言缓冲区的协同解析
  • 数据集-目标检测系列- 猴子 数据集 monkey >> DataBall
  • 数字孪生在建设智慧城市中可以起到哪些作用或帮助?
  • Go语言底层(三): sync 锁 与 对象池
  • 结合Jenkins、Docker和Kubernetes等主流工具,部署Spring Boot自动化实战指南
  • 如何通过外网访问内网?哪个方案比较好用?跨网远程连接网络知识早知道
  • 在Docker里面运行Docker
  • Windows11:解决近期更新后无法上网的问题
  • .net ORM框架dapper批量插入
  • 案例分享--汽车制动卡钳DIC测量