60.一文搞懂STM32F407内存布局:Flash、SRAM与程序段的底层逻辑
一、基础概念ROM与RAM的本质区别在单片机领域我们常说的ROM只读存储器和RAM随机访问存储器在STM32F407中分别对应Flash和SRAMFlashROM断电后数据不丢失用于存储程序代码、常量等固定信息就像图书馆的书架存放的是“永久资料”。SRAMRAM断电后数据丢失用于存储程序运行时的变量、堆栈等临时数据就像写字的白板用于临时记录和修改。二、STM32F407的Flash布局程序的“永久仓库”STM32F407的Flash起始地址为0x08000000总容量1MB分为12个扇区扇区号大小起始地址结束地址016KB0x080000000x08003FFF116KB0x080040000x08007FFF216KB0x080080000x0800BFFF316KB0x0800C0000x0800FFFF464KB0x080100000x0801FFFF5-11128KB0x080200000x080FFFFFFlash操作的核心规则擦除必须按扇区进行下载工具会根据固件大小自动选择需要擦除的扇区。程序代码、常量数据如const修饰的变量、字符串常量都存储在Flash中。代码示例Flash读写操作#include stm32f4xx_hal.h // 写入Flash以扇区0为例 HAL_StatusTypeDef Flash_Write(uint32_t address, uint8_t *data, uint32_t len) { HAL_StatusTypeDef status; FLASH_EraseInitTypeDef eraseInit; uint32_t sectorError; // 解锁Flash HAL_FLASH_Unlock(); // 配置擦除参数 eraseInit.TypeErase FLASH_TYPEERASE_SECTORS; eraseInit.Sector FLASH_SECTOR_0; eraseInit.NbSectors 1; eraseInit.VoltageRange FLASH_VOLTAGE_RANGE_3; // 擦除扇区 status HAL_FLASHEx_Erase(eraseInit, sectorError); if (status ! HAL_OK) { HAL_FLASH_Lock(); return status; } // 写入数据 for (uint32_t i 0; i len; i) { status HAL_FLASH_Program(FLASH_TYPEPROGRAM_BYTE, address i, data[i]); if (status ! HAL_OK) break; } // 锁定Flash HAL_FLASH_Lock(); return status; } // 读取Flash void Flash_Read(uint32_t address, uint8_t *data, uint32_t len) { for (uint32_t i 0; i len; i) { data[i] *(__IO uint8_t*)(address i); } }三、STM32F407的SRAM布局程序的“临时工作台”STM32F407的SRAM起始地址为0x20000000总容量192KB分为两个区域普通SRAM128KB起始地址0x20000000可被DMA访问用于存储变量、堆栈、DMA缓冲区等。CCM内存64KB起始地址0x10000000直连CPU总线访问速度更快但不能被DMA访问适合存储高频访问的变量。SRAM操作的核心规则普通SRAM可以直接被CPU和DMA访问是程序运行时的主要数据存储区域。CCM内存只能被CPU访问适合存储对实时性要求高的变量如中断服务函数中的临时变量。代码示例CCM内存的使用// 定义CCM内存中的变量 uint8_t ccm_buffer[1024] __attribute__((at(0x10000000))); // 普通SRAM中的DMA缓冲区 uint8_t dma_buffer[1024] __attribute__((at(0x20000000))); void CCM_Example(void) { // 访问CCM内存CPU可直接访问 for (int i 0; i 1024; i) { ccm_buffer[i] i; } // DMA只能访问普通SRAM HAL_DMA_Start(hdma_memtomem_dma2_stream0, (uint32_t)dma_buffer, (uint32_t)SPI1-DR, 1024); }四、STM32F407的其他关键内存区域除了Flash和SRAMSTM32F407还有四个重要的内存区域外设寄存器区起始地址0x40000000包含所有外设的控制寄存器如GPIO、USART、SPI等。系统存储器起始地址0x1FFF0000存储出厂Bootloader用于串口下载程序。Cortex-M4私有外设区起始地址0xE0000000包含NVIC中断控制器、SysTick系统滴答定时器等内核外设。FSMC外部存储区起始地址0x60000000用于扩展外部SRAM、NOR Flash等存储设备。五、程序段的内存分配代码、变量的“安家之处”在嵌入式程序中不同类型的数据会被分配到不同的内存段段名存储位置用途.textFlash存储程序的可执行代码函数、中断服务函数等.rodataFlash存储只读常量如字符串常量、const修饰的全局变量.dataFlash SRAM存储初始化的全局变量/静态变量初始值存于Flash运行时复制到SRAM.bssSRAM存储未初始化的全局变量/静态变量运行时清零.heapSRAM动态内存分配区域如malloc使用.stackSRAM存储函数调用的栈帧、局部变量代码示例程序段的验证#include stdio.h // .rodata段Flash const char *rodata_str This is in .rodata section; // .data段初始值非0 int data_var 100; // .bss段未初始化 int bss_var; // .stack段局部变量 void stack_example(void) { int stack_var 200; // 存储在栈中 printf(Stack var: %d\n, stack_var); } int main(void) { printf(RO data: %s\n, rodata_str); printf(Data var: %d\n, data_var); printf(BSS var: %d\n, bss_var); // 未初始化默认值为0 stack_example(); return 0; }六、总结内存布局的核心逻辑STM32F407的内存布局可以总结为Flash存储程序代码和常量断电不丢失。SRAM存储运行时变量、堆栈断电丢失。外设寄存器区控制硬件外设的“接口”。系统存储器用于程序下载的“引导区”。理解内存布局是嵌入式开发的基础它能帮助我们优化程序性能、解决内存溢出、DMA传输失败等问题。在实际开发中我们可以通过Keil的map文件查看程序段的具体分配情况进一步优化内存使用。参考资料[1] STM32F407参考手册RM0090- STMicroelectronics[2] 野火STM32 HAL库开发实战指南 - 野火产品资料下载中心[3] STM32F407内存布局深度解析 - CSDN博客[4] 链接脚本与内存段划分 - 华清远见官网[5] STM32F407 DMA使用详解 - CSDN博客

相关新闻

智慧商业运营平台建设方案:服务区商业数字化从“收银工具”到“增长引擎”的全流程拆解(PPT)

智慧商业运营平台建设方案:服务区商业数字化从“收银工具”到“增长引擎”的全流程拆解(PPT)

高速公路服务区、商业综合体、交通枢纽等线下商业空间,最容易陷入一个误区:把数字化等同于安装一套 POS、上线一个小程序、做一个大屏。事实上,真正决定商业运营效率的,并不是系统数量,而是能否把顾客、商户、商品、订…

2026/7/23 22:52:36 阅读更多 →
沁园春·智能

沁园春·智能

云端胜景,千亿参数,万卷成潮。 望网络内外,惟余算力; 星河上下,顿显滔滔。 模型如塔,智能似浪,欲与苍穹试比高。 须顷刻,看妙笔生花,分外妖娆。科技如此多娇,…

2026/7/23 22:52:36 阅读更多 →
SSRF-Labs 综合靶场-WP(超详细)

SSRF-Labs 综合靶场-WP(超详细)

该靶场是基于国光师傅搭建的,很适合刚入门的师傅们学习SSRF的利用 摘要:本文基于国光师傅搭建的SSRF靶场,详细记录了从靶场搭建到内网渗透的全过程。通过SSRF漏洞对内网多个服务进行攻击测试,涵盖命令执行、SQL注入、XXE模板注入…

2026/7/23 22:52:36 阅读更多 →

最新新闻

炸裂!Python布尔数组内存压缩到极致:比numpy省90%内存,性能还快30%

炸裂!Python布尔数组内存压缩到极致:比numpy省90%内存,性能还快30%

前言 做大数据、机器学习特征工程、位图索引的同学应该都遇到过布尔数组内存爆炸的问题:- 1亿个用户标记,用Python list存要800MB,GC直接卡爆- 用numpy bool数组,也要100MB,数据量再大一点还是顶不住- 用普通位数组&am…

2026/7/23 23:01:40 阅读更多 →
nomachine画面显示分辨率不对设置方法

nomachine画面显示分辨率不对设置方法

连接后鼠标移到画面的右上角,等页面卷成三角形:

2026/7/23 23:01:40 阅读更多 →
亲测有效!本地部署 Hermes Agent 完整记录,从此拥有 24 小时在线的 AI 员工

亲测有效!本地部署 Hermes Agent 完整记录,从此拥有 24 小时在线的 AI 员工

关于HermesAgent是什么?可以看《关于爱马仕Hermes Agent是什么?》; 关于WSL2和Ubuntu的安装,可以看《WSL2和Ubuntu安装记录》; 关于Ubuntu的迁移,可以看《Ubuntu迁移记录》; 接下来接着Ubunt…

2026/7/23 23:01:40 阅读更多 →
CST能否进行屏蔽仿真及其具体流程

CST能否进行屏蔽仿真及其具体流程

电磁屏蔽技术在众多电子设备中发挥着不可或缺的作用,它确保设备在面临电磁干扰时能够稳定运行,同时也防止设备自身产生的电磁干扰对其他设备造成影响。CST(Computer Simulation Technology)作为一款功能卓越的电磁仿真软件&#x…

2026/7/23 23:01:40 阅读更多 →
C/C++ 命名空间(namespace)—— 从入门到“你最好真的会用”

C/C++ 命名空间(namespace)—— 从入门到“你最好真的会用”

C/C 命名空间(namespace)—— 从入门到“你最好真的会用”这篇文章不是那种“三分钟学会 namespace”的速食文,我想跟你聊点实在的:什么时候该用,什么时候别硬用,以及那些你踩过但没在意的坑。先说个扎心的…

2026/7/23 23:01:40 阅读更多 →
【毕设分享】SSM笔记本在线销售系统32649

【毕设分享】SSM笔记本在线销售系统32649

源码获取 私信联系我即可~ 大家点赞、收藏、关注、评论啦 精彩专栏推荐订阅:在下方专栏👇🏻 👇🏻 精彩专栏 推荐订阅👇🏻 java精品项目案例【3000套】 java精品项目案例【3000套】https://blog…

2026/7/23 23:00:39 阅读更多 →

日新闻

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

更多请点击: https://intelliparadigm.com 第一章:从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表) 当AI副业主理人不再仅满足于单次服务交付,而是主动构建可复用、可裂变、可…

2026/7/23 0:00:25 阅读更多 →
AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

更多请点击: https://codechina.net 第一章:AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析 在对2,346篇跨行业AI生成文案的A/B测试数据进行聚类分析后,我们发现&#xff1…

2026/7/23 0:01:26 阅读更多 →
Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具 【免费下载链接】chitchatter Secure peer-to-peer chat that is serverless, decentralized, and ephemeral 项目地址: https://gitcode.com/gh_mirrors/ch/chitchatter Chitchatter是一款革命性的安…

2026/7/23 0:01:26 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/22 8:58:19 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/22 19:43:43 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/23 17:49:47 阅读更多 →

月新闻