
存储器是单片机结构的重要组成部分,存储器是用来存储编译好的程序代码和数据的,有了存储器单片机系统才具有记忆功能。按照存储介质的特性,可以分“易失性存储器”和“非易失性存储器”两类。易失性存储器断电后,里面存储的内容会丢失;非易失性存储器断电后,数据可以依然保持。5 U# k- s5 X/ d T* N1 L/ p/ f. @ * P5 ]3 c- K. i, S o ![]() CM3/CM4的存储结构 ![]() " q; _# X! ^- g6 T/ U5 E$ Y o$ R STM32是在CM3或CM4内核的基础上进行设计,故要了解STM32的存储器的结构必须先了解COM3/CM4内核的结构(COM3和COM4存储结构划分是一样的)。Cortex-M3的地址空间有4G,分成8个块:代码、SRAM、外部RAM、外部设备、专用外设总线-内部、专用外设总线-外部、特定厂商,每块大小为512MByte(0.5GB),但它只是对这4G空间作出了预先的定义,并指出各块该分给哪些设备,具体的实现又芯片厂商决定,4G存储器开始地址为0x00000000,结束地址为0xFFFFFFFF,地址的位数是32位,那么2^32=4294967296。由于一个基本的存储单元是8bits即1Byte,因此4294967296/1024=4194304KB,4194304/1024=4096MB,4096/1024=4GB。- h. x! M( A4 S, ~ ![]() 代码块:地址为0x00000000至0x1FFFFFF的区域是存放代码的,STM32采用的是NandFlash具体是多因为是基于CM3内核的理论最大是512MB,现实STM32F103RB为例flash 128KB。 片上SRAM:地址0x2000000至0x3FFFFFF的区域,用于让芯片制造商连接片上的SRAM,STM32F103RB为例RAM 20KB,它主要用来存储程序中用到的变量。凡是整个程序中,所用到的需要被改写的量(包括全局变量、局部变量、堆栈段等),都存储在RAM中。4 I0 U* I5 {4 [/ P1 B6 Q% l & I) G" f( Y7 s- J8 w2 L 片上外设:地址为0x4000000至0x5fffffff,片上外设的寄存器即映射到这个区域。# ~' ^* i! S W+ ]1 {/ y, |! \ 片外RAM和片上外设2个1GB的范围,起始地址分别为0x60000000和0xA0000000,分别用于连接外部RAM和外部设备,它们之中没有位段。 最后0.5GB系统组件和内外部私有外设总线地带,地址从0xE000000开始。NVIC、SysTic、代码调试控制所用的寄存器等即位于改区域。# l2 x0 F4 c$ M( ^" V! N 7 N5 G" A3 U" [0 S5 r4 j STM32存储器结构图3 f* `* _2 p( M% s! O: F CM3/CM4搭好存储器框架后,ST公司再在其上实现具体的存储器。ST公司实现的主要是Flash(CM3的代码区)和SRAM这2个区域。; A8 L& d; q( W+ X! g w . p) M+ h9 g( n y9 d- B$ G |/ n % O( b: d5 t* |" I0 o2 k % x0 E! ^3 L3 i, d3 S, y 片内Flash,它是由 一次性编程区OTP、主存、系统存储器、选项字节等组成。系统存储区是系统保留区,叫做bootloader(ISP Bootloader程序),通过运行此段区域里的程序,可以对主存储区进行重新烧录。 片内SRAM,不同类型的STM32单片机的SRAM大小是不一样的,但是他们的起始地址都是0x20000000,终止地址都是0x2000 0000+其固定的容量大小。SRAM的作用是用来存取各种动态的输入输出数据、中间计算结果以及与外部存储器交换的数据和暂存数据。设备断电后,SRAM中存储的数据就会丢失。$ [0 K. ^2 u& m# P! {$ x7 o c 1 ]9 x) `6 d: p STM32存储代码实例分析 ![]() ![]() 1、栈区(stack):由编译器自动分配释放,存放函数的参数值,局部变量的值等。 2、堆区(heap):一般由程序员分配释放,若程序员不释放,程序结束时可能由OS释放。8 `& [0 P5 N- k3 h4 ]! Z; e& t6 _6 W # N8 D. f# N/ b) Q3 R 3、全局变量、静态变量:初始化的全局变量和静态变量放在一块区域,未初始化的全局变量和和未初始化的静态变量在相邻的的另一块区域。程序结束后由系统自动释放。 8 @3 T3 f% w5 S% {2 w 4、文字常量:常量字符串就是放在这里的。这些数据是只读的,分配在RO-data(只读数据存储区),则被包含在flash中,程序结束后由系统自动释放: f7 g }( V' V q 5 }" k8 _' B# m) G( ?0 W 5、程序代码(code):存放函数体的二进制代码。 $ H& r6 w$ s8 H- j: U# n: L) ` Code为程序代码部分 = 程序代码区(code) RO-data 表示 程序定义的常量 = 文字常量区- n! i' ~0 k! K+ M' ^) j , i$ R# V3 G* b: s% H" m% L RW-data 表示 已初始化的全局变量 = 栈区(stack)堆区(heap)全局区(静态区)(static) # \) |5 a) {. M: Z) i& H ZI-data 表示 未初始化的全局变量+ E8 X& w4 l8 A3 y3 h ![]() (来源CSDN: Tree-gg https://blog.csdn.net/Yuanghxb/article/details/127523910) |
利用STM32MP1和STM32MP2为嵌入式Linux提供有效的安全措施:供当今决策者参考的3条宝贵经验
有奖直播 | STM32MP2x 资源隔离架构 (RIF) 介绍与使用
白皮书下载|边缘 AI 变革:MCU集成 NPU 的破局与领航
OpenSTLinux:为STM32 MPU生态系统带来超强助力
【STM32MP257】轻松搭建A35 Linux编译及调试环境
【STM32MP257】🥳STM32MP257-DK-开发板开箱体验
【STM32MP157】从ST官方例程中分析RPMsg-TTY/SDB核间通信的使用方法
【STM32MPU 安全启动】 TF-A BL2 TrustedBoot原理学习
《STM32MPU安全启动》学**结
《STM32MPU安全启动》学习心得