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

内存划分包括 Flash存储器、SRAM 和 外设寄存器

STM32F407VETx 的内存划分包括 Flash存储器SRAM外设寄存器 三大部分。以下是详细的划分说明,并附上典型应用示例。


1. Flash 存储器(512KB)

地址范围0x0800 0000 - 0x0807 FFFF
用途:存储程序代码(固件)、常量数据、配置参数等。
扇区划分(STM32F407VETx 只有 Sector 0~7):

扇区起始地址结束地址大小典型用途
Sector 00x0800 00000x0800 3FFF16KB中断向量表 + 启动代码
Sector 10x0800 40000x0800 7FFF16KB核心固件(RTOS/Kernel)
Sector 20x0800 80000x0800 BFFF16KB应用程序代码
Sector 30x0800 C0000x0800 FFFF16KB应用程序代码
Sector 40x0801 00000x0801 FFFF64KB文件系统(FatFS/LittleFS)
Sector 50x0802 00000x0803 FFFF128KB固件备份(OTA 备用区)
Sector 60x0804 00000x0805 FFFF128KB用户数据(日志/配置)
Sector 70x0806 00000x0807 FFFF128KB用户数据(大块存储)

关键点

  • Sector 0 必须放中断向量表(Cortex-M4 强制要求)。
  • Sector 5 可用于 OTA 升级,存放新固件,校验后跳转执行。
  • Sector 6/7 适合存储配置数据(如 Wi-Fi 密码、校准参数)。

2. SRAM(192KB)

地址范围0x2000 0000 - 0x2002 FFFF
用途:运行时变量、堆栈、动态内存分配。
SRAM 划分

区域地址范围大小用途
SRAM10x2000 0000 - 0x2001 FFFF128KB主堆栈、全局变量、RTOS任务栈
SRAM20x2002 0000 - 0x2002 FFFF64KB高速缓存、DMA缓冲区
CCM RAM0x1000 0000 - 0x1000 FFFF64KB核心专用(无 DMA 访问)

关键点

  • SRAM1:默认存储 .data(已初始化变量)、.bss(未初始化变量)、heap(动态内存)、stack(主堆栈)。
  • SRAM2:适合 DMA 操作(如串口接收缓冲、SD卡读写)。
  • CCM RAM:仅 CPU 可访问,适合实时性要求高的任务(如 PID 控制)。

示例链接脚本(GCC)

MEMORY {FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 512KSRAM1 (rwx) : ORIGIN = 0x20000000, LENGTH = 128KSRAM2 (rwx) : ORIGIN = 0x20020000, LENGTH = 64KCCMRAM (rwx) : ORIGIN = 0x10000000, LENGTH = 64K
}

3. 外设寄存器

地址范围0x4000 0000 - 0x5003 FFFF
用途:控制 GPIO、USART、SPI、TIM 等外设。
典型外设地址

  • GPIOA0x4002 0000
  • USART10x4001 1000
  • SPI10x4001 3000
  • TIM20x4000 0000

访问方式(HAL 库示例):

GPIOA->MODER |= GPIO_MODER_MODER5_0;  // 设置 PA5 为输出
USART1->BRR = 0x0683;                 // 设置波特率 115200

4. 内存管理策略

(1) Flash 管理

  • 中断向量表 必须放在 0x0800 0000(Sector 0)。
  • OTA 升级
    • 新固件写入 Sector 5(128KB)。
    • 校验成功后,修改向量表跳转地址。
  • 配置存储
    #define CONFIG_ADDR 0x08060000  // Sector 6 起始地址
    void Save_Config(void *data, uint32_t size) {HAL_FLASH_Unlock();FLASH_Erase_Sector(FLASH_SECTOR_6);for (int i = 0; i < size; i += 4) {HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, CONFIG_ADDR + i, *(uint32_t*)(data + i));}HAL_FLASH_Lock();
    }
    

(2) SRAM 管理

  • 堆栈分配(启动文件 startup_stm32f407xx.s):
    _estack = 0x20020000;   /* 栈顶 = SRAM1 末尾 */
    Heap_Size EQU 0x2000;   /* 8KB 堆 */
    Stack_Size EQU 0x1000;  /* 4KB 栈 */
    
  • 动态内存管理(FreeRTOS 示例)
    #define configTOTAL_HEAP_SIZE ((size_t)64 * 1024)  // 64KB 给 FreeRTOS
    

(3) CCM RAM 优化

  • 将高频访问的数据(如 PID 计算变量)放入 CCM:
    __attribute__((section(".ccmram"))) float pid_error[100];
    

5. 典型内存布局(Keil 工程)

FLASH (512KB)
├─ 0x08000000:中断向量表(16KB)
├─ 0x08004000:RTOS 内核(16KB)
├─ 0x08008000:应用程序(32KB)
├─ 0x08010000:文件系统(64KB)
└─ 0x08060000:配置数据(128KB)SRAM (192KB)
├─ 0x20000000:全局变量 + 堆(128KB)
├─ 0x20020000:DMA 缓冲区(64KB)
└─ 0x10000000:核心数据(64KB,CCM)

总结

存储区地址范围大小主要用途
Flash0x0800 0000 - 0x0807 FFFF512KB程序代码、配置数据
SRAM10x2000 0000 - 0x2001 FFFF128KB堆、栈、全局变量
SRAM20x2002 0000 - 0x2002 FFFF64KBDMA 缓冲区
CCM0x1000 0000 - 0x1000 FFFF64KB实时任务数据

推荐策略

  1. Flash:前 16KB 放向量表,最后 128KB 存配置。
  2. SRAM:默认变量放 SRAM1,DMA 用 SRAM2,关键数据放 CCM。
  3. 外设:直接通过 HAL 库或寄存器操作。
http://www.xdnf.cn/news/6205.html

相关文章:

  • nginx 出现大量connect reset by peer
  • 第二章日志分析-apache日志分析
  • 秒删node_modules[无废话版]
  • 数据结构(八)——查找
  • 达梦数据库 【-6111: 字符串转换出错】问题处理
  • HVV蓝队实战面试题
  • 全新开发-iVX图形化编程VS完整IDE
  • 有关多线程
  • vue中,created和mounted两个钩子之间调用时差值受什么影响
  • Ubuntu摄像头打开失败
  • 16S18S_OTU分析(3)
  • 正则表达式(二)-高级应用_谨慎使用
  • Spark之搭建Yarn模式
  • 日本动漫风格人像街拍Lr调色预设,手机滤镜PS+Lightroom预设下载!
  • 【PostgreSQL数据分析实战:从数据清洗到可视化全流程】附录-D. 扩展插件列表(PostGIS/PostgREST等)
  • 搭建Caffeine+Redis多级缓存机制
  • ChatGPT 能“记住上文”的原因
  • nputop:昇腾 NPU 交互式监控工具
  • 基于 NanoDet 的工厂巡检机器人目标识别系统研究与实现​
  • Fluent Bit持久化配置:保障数据可靠传输的关键
  • MVCC:数据库并发控制的利器
  • 【计算机哲学故事1-5】版本更新:拒绝停滞,成长是最好的修复
  • 部署GraphRAG配置Neo4j实现知识图谱可视化【踩坑经历】
  • 【SSL证书系列】https双向认证中客户端认证的原理
  • 边缘计算网关工业物联网应用:空压机远程运维监控管理
  • 自动化 NuGet 包打包与上传:完整批处理脚本详解(含 SVN 支持)
  • MySQL基础原理
  • python之Pandas合并数据终极指南:pd.concat参数详解
  • IDEA 新建 SpringBoot 项目时,没有高版本 SpringBoot 可选
  • Android逆向学习(十) IDA逆向编辑Android so文件