一 stm32 的flash是什么、有什么用、注意事项、如何查看

一 、说明

它主要用于存储代码,FLASH 存储器的内容在掉电后不会丢失,STM32 芯片在运行的时候,也能对自身的内部 FLASH 进行读写,因此,若内部 FLASH 存储了应用程序后还有剩余的空间,我们可以把它像外部 SPI-FLASH 那样利用起来,存储一些程序运行时产生的需要掉电保存的数据。并且访问内部 FLASH 的速度要比外部的 SPI-FLASH 快得多,

二、结构

STM32 的内部 FLASH 包含主存储器、系统存储器、 OTP 区域以及选项字节区域,它们的地址分布及大小下表:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

各个存储区域的说明如下:

(1)主存储器
    一般我们说 STM32 内部 FLASH 的时候,都是指这个主存储器区域,它是存储用户应用程序的空间,芯片型号说明中的 1M FLASH、 2M FLASH 都是指这个区域的大小。
    主存储器分为两块,共 2MB,每块内分 12 个扇区,其中包含 4 个 16KB扇区、 1 个 64KB 扇区和 7 个 128KB 的扇区。如STM32F429IGT6 型号芯片,它的主存储区域大小为 1MB,所以它只包含有表中的扇区 0-扇区 11。
    与其它 FLASH 一样,在写入数据前,要先按扇区擦除,而有的时候我们希望能以小规格操纵存储单元,所以 STM32 针对 1MB FLASH 的产品还提供了一种双块的存储格式,见下表:

通过配置 FLASH 选项控制寄存器 FLASH_OPTCR 的 DB1M 位,可以切换这两种格式,切换成双块模式后,扇区 8-11 的空间被转移到扇区 12-19 中,扇区细分了,总容量不变。
    
    注意如果您使用的是 STM32F40x 系列的芯片, 它没有双块存储格式,也不存在扇区 12-23,仅 STM32F42x/43x 系列产品才支持扇区 12-23。
    
  (2)系统存储区
    系统存储区是用户不能访问的区域,它在芯片出厂时已经固化了启动代码,它负责实现串口、 USB 以及 CAN 等 ISP 烧录功能。
    
  (3)OTP 区域
    OTP(One Time Program),指的是只能写入一次的存储区域,容量为 512 字节,写入后数据就无法再更改, OTP 常用于存储应用程序的加密密钥。
    
  (4)选项字节
    选项字节用于配置 FLASH 的读写保护、电源管理中的 BOR 级别、软件/硬件看门狗等功能,这部分共 32 字节。可以通过修改 FLASH 的选项控制寄存器修改。

三、注意事项

32位的M3有4GB的寻址空间,STM32的存储器地址映射,地址范围为:0x0000_0000-0xFFFF_FFFF;其中代码区的地址是从0x0800_0000开始的,结束于0x0800_0000+芯片的Flash的大小;

所以就必须在MDK里设置Flash地址为0x0800 0000,
这样就还有一个问题,理论上,CM3中规定上电后CPU是从0地址开始执行,但是这里中断向量表却被烧写在0x0800 0000地址里,那启动时不就找不到中断向量表了?既然CM3定下的规矩是从0地址启动,SMT32当然不能破坏ARM定下的“规矩”,所以它做了一个启动映射的过程,就是和芯片上总能见到的BOOT0和BOOT1有关了,当选择从主Flash启动模式后,芯片一上电,Flash的0x0800 0000地址被映射到0地址处,不影响CM3内核的读取,所以这时的CM3既可以在0地址处访问中断向量表,也可以在0x0800 0000地址处访问中断向量表,而代码还是在0x0800 0000地址处存储的。这就是最难理解的地方,其实,这是基本上所有ARM芯片采用的启动映射方法。ARM7,ARM9没有内部Flash的通常都是这样做的。这个过程出自STM32 referenc manual手册,里面是有说明的。
值得注意的是 ,这个中断向量表是可以在程序中再次被映射的。控制它的就是CM3已经规定的NVIC寄存器SCB->VTOR。在STM32库中给出的启动代码里,startup_stm32f10x_hd.s文件里,第146行,是上电后读取中断向量表中的复位中断位置,并执行复位中断处理代码,代码如下:

; Reset handler
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT __main
IMPORT SystemInit
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP

注意复位后第一个被执行的是SystemInit代码,这个代码在库目录下的system_stm32f10x.c文件里,它初始化了时钟,NVIC等一系列操作,这里摘要与中断向量有关的代码:

void SystemInit (void)

{

…

#ifdef VECT_TAB_SRAM
SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM. /
#else
SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; / Vector Table Relocation in Internal FLASH. */
#endif
}

可以看出中断向量重映射是一个选择性编译,通常宏定义VECT_TAB_SRAM都没有被定义,所以这里执行结束后,SCB->VTOR就是FLASH_BASE了,值为0x0800 0000。以后CM3再取中断向量里,就会根据SCB->VTOR的设置,从这里取向量执行了。中断向量自此终于转正。

四、如何查看

在keil中map文件可以查看对应使用情况

(ROM)flash= (Code+RO_Data+RW Data),大小为字节

二 stm32的RAM、SRAM、ROM是什么,有什么用、注意事项、如何查看

一、说明

RAM(Random Access Memory) :掉电之后就丢失数据,读写速度块
ROM (Read Only Memory) :掉电之后仍然可以保持数据
在这里插入图片描述
RARAM类
SRAM‌:用于CPU缓存(如L1/L2/L3)、高速缓冲存储器等对速度要求极高的场景
‌DRAM‌:作为主内存(如DDR内存条),满足大容量存储需求
在这里插入图片描述
SRAM‌结构( IS62WV51216)在这里插入图片描述
大小 = (2^19 )(地址)/1024 *2(16位宽) = 512M

DRAM结构(W9825G6KH)
SDRAM和DDR类似、SDRAM速度一般为 133MHz、 166MHz 或 200MHz
在这里插入图片描述
W9825G6KH 的 A0~A8 是列地址,一共 9 位列地址
大小 =2^9 * 2^13(地址)=4194304B=4MB *2(16位宽)*4(4个块)=32M

DDR
DDR1 内存是 SDRAM 的升级版本,SDRAM 在一个 CLK 周期传输一次数据, DDR1 在一个 CLK 周期传输两次数据,也就是在上升沿和下降沿各传输一次数据,这个概念叫做预取(prefetch);
SDRAM 速度一般是 133~200MHz
DDR1 的传输速度就变为了 266~400MT/S,所以大家常说的 DDR266、 DDR400 就是这么来的
DDR2 在 DDR 基础上进一步增加预取(prefetch),增加到了 4bit,因此 DDR2 的数据传输速率就是 533~800MT/s
DDR3 在 DDR2 的基础上将预取(prefetch)提高到 8bit,因此在总线时钟同样为 266~400MHz 的情况下, DDR3 的传输速率就是 1066~1600MT/S

这里我们讲一下LPDDR3、 DDR3 和 DDR3L 的区别,这三个都是 DDR3,但是区别主要在于工作电压, LPDDR3
叫做低功耗 DDR3,工作电压为 1.2V。 DDR3 叫做标压 DDR3,工作电压为 1.5V,一般台式内
存条都是 DDR3。 DDR3L 是低压 DDR3,工作电压为 1.35V,一般手机、嵌入式、笔记本等都
使用 DDR3L
ROM

和RAM的分布
在这里插入图片描述

RAM的起始地址是0x2000_0000,结束于0x2000_0000+芯片的RAM大小。

可以发现ROM的起始地址对于刚刚将的的内部flash地址,所以stm32的flash就是ROM(通常保存着text段、Code、Ro-data、Rw-data)

二、作用

在这里插入图片描述

那么RAM是什么呢,RAM就是运行内存,掉电数据就丢失;(通常保存着堆、栈、bss段、data段、ZI-data、RW-data)
在map文件可以查看到RAM大小
RAM = RW-data + ZI-data

text:代码段,存储在FLASH中
data:初始化数据 数据段
bss:未初始化数据 数据段

可以发现RW-data 出现在了 RAM和FLASH(ROM)中,RW-data为什么会即占用Flash又占用RAM空间?
由前文知道RAM掉电数据会丢失,RW-data是非0初始化的数据,已初始化的数据需要被存储在掉电不会丢失的FLASH中,上电后会从FLASH搬移到RAM中。

三、查看与注意事项

下面是stm32f103zet6的配置
在这里插入图片描述

我们知道ROM(FLASH)的起始地址是0x8000000 512k的flash大小=512*1024=0x80000字节

RAM的起始地址为0x20000000 大小为 64*1024=0x10000字节

1、外扩RAM

那么有个问题要是我的设备现在要带一个GUI,RAM不够咋办,那就外扩一个SRAM或者DRAM,
下面是他们的特性
在这里插入图片描述
我们在使用外部SRAM的时候需要配置keill5的RAM大小吗,通过图可以发现是不需要的,并且外部ram的起始地址改为0x60000000了
在这里插入图片描述
如果我们使用的是 BANK1 的区域 3,所以HADDR[27:26]=10,故外部内存的首地址为 0X68000000。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐