打印
[APM32E1]

嵌入式开发必知:E103xE内外存储器(Flash/SRAM/EEPROM/SDRAM/SD卡)的终极对比

[复制链接]
250|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
嵌入式开发必知:E103xE内外存储器(Flash/SRAM/EEPROM/SDRAM/SD卡)的终极对比


以下是每种存储器模块的详细工作原理说明,涵盖其物理特性、访问方式和典型应用场景:
1. E103xE内部Flash(Nor Flash)
工作原理:
- 存储单元:基于浮栅MOSFET,通过F-N隧穿(Fowler-Nordheim)或热电子注入写入电荷。
- 读取:  
  - CPU直接通过地址总线访问(XIP模式),以并行方式读取数据。  
  - 读取时序类似SRAM,但延迟较高(约几十ns)。
- 写入/擦除:  
  - 必须按扇区/块擦除(通常4KB~128KB),再逐字/页写入。  
  - 写入需高压(~10V),由E103xE内部电荷泵生成。
- 典型操作:  
  ```c
  uint32_t addr = (uint32_t)0x08000000; // Flash起始地址
  uint32_t data = addr;                  // 直接读取
  FLASH_EraseSector(0);                   // 擦除扇区
  FLASH_ProgramWord(addr, 0x12345678);    // 写入数据
  ```
应用场景:  
- 存储Bootloader、RTOS或应用程序代码(如STM32的Firmware)。
---
2. E103xE内部SRAM
工作原理:
- 存储单元:基于6T结构(6个晶体管组成的双稳态触发器)。
- 访问方式:  
  - CPU通过地址总线直接访问,读写时序由时钟同步(同步SRAM)或异步(异步SRAM)。  
  - 读写延迟极低(1~3个时钟周期),带宽与CPU总线匹配。
- 特性:  
  - 无需初始化,上电即可使用。  
  - 掉电数据丢失,无写入次数限制。
- 示例(ARM Cortex-M):  
  ```asm
  LDR R0, =0x20000000  ; SRAM起始地址
  LDR R1, [R0]         ; 读取数据
  STR R2, [R0, 4]     ; 写入数据(偏移4字节)
  ```
应用场景:  
- 堆栈(Stack)、全局变量、动态内存(Heap)。
---
3. I²C控制的EEPROM(如AT24C02)
工作原理:
- 存储单元:基于浮栅晶体管或电荷陷阱技术,支持字节级擦写。
- I²C协议:  
  - 起始条件:SCL高电平时SDA下降沿。  
  - 设备寻址:7位地址 + 1位读写标志(如0xA0写,0xA1读)。  
  - 数据帧:每8位数据后跟一个ACK/NACK。
- 写入流程:  
  1. 发送设备地址(写模式)。  
  2. 发送目标存储地址(16位)。  
  3. 发送数据字节(自动递增地址)。  
- 读取流程:  
  1. 先发送写模式地址+目标地址,再发送读模式地址读取数据。  
- 时序示例:  
  ```
  START → 0xA0 → ACK → 0x00 → ACK → 0x12 → ACK → STOP(写入0x12到地址0x00)
  ```
应用场景:  
- 存储设备序列号、用户配置(如家电的温度设定)。
4. SPI控制的Flash(如W25Q16
工作原理:
- 存储单元:NAND/NOR架构,NAND Flash以页(通常2KB)为单位读写。
- SPI协议:  
  - 全双工,4线(SCK、MOSI、MISO、CS),支持模式0/3。  
  - 指令驱动:先发命令(如0x03读数据),再发地址和数据。
- 关键操作:  
  - 读取:发送读指令 + 24位地址 + 读数据(连续时钟输出)。  
  - 写入:需先擦除(0x20扇区擦除),再页编程(0x02)。  
  - 状态寄存器:检查BUSY位(0x05指令)。
- 示例代码:  
  ```c
  // 读取SPI Flash
  SPI_CS_LOW();
  SPI_Write(0x03);          // 读指令
  SPI_Write(0x00);          // 地址高字节
  SPI_Write(0x00);
  SPI_Write(0x00);          // 地址低字节
  data = SPI_Read();        // 读取数据
  SPI_CS_HIGH();
  ```
应用场景:  
- 存储文件系统(如LittleFS)、固件备份(ESP32的OTA分区)。
---
5. eMMC控制的SDRAM(M12L64164A-5TG2C)
工作原理:
- eMMC:  
  - 封装了NAND Flash + 控制器(FTL磨损均衡、坏块管理)。  
  - 通过eMMC协议(基于MMC总线)访问,支持多数据线(1/4/8bit)。  
  - 操作单位:扇区(通常512B),类似SD卡但集成度高。
- SDRAM:  
  - 存储单元:电容存储电荷,需定期刷新(~64ms)。  
  - 访问流程:  
    1. 激活行(ACTIVE命令 + 行地址)。  
    2. 读写列(READ/WRITE命令 + 列地址)。  
    3. 预充电(关闭当前行,准备下一行访问)。  
  - 时序控制:依赖时钟同步,需满足tRCD(行到列延迟)、tCAS等参数。
应用场景:  
- eMMC:手机系统镜像、工业设备的大容量存储。  
- SDRAM:运行Linux时的动态内存(如STM32MP157的DDR3)。
---
6. SDIO控制的SD卡
工作原理:
- 物理层:  
  - 存储介质为NAND Flash,但通过SDIO接口抽象为块设备。  
  - 支持SPI模式(兼容SPI主机)或SD模式(4线高速,时钟可达50MHz)。
- 协议层:  
  - 命令帧:48位格式(起始位+命令号+参数+CRC)。  
  - 数据传输:  
    - 单块读写(CMD17/CMD24)。  
    - 多块读写(CMD18/CMD25)。  
  - 初始化流程:  
    1. 发送CMD0(复位卡)。  
    2. 发送CMD8(检查电压兼容性)。  
    3. 发送ACMD41(初始化SDHC/SDXC卡)。
- 示例代码(SD模式):  
  ```c
  SD_SendCmd(CMD0, 0, 0x95);          // 复位卡
  SD_SendCmd(CMD8, 0x1AA, 0x87);      // 检查VHS
  SD_SendCmd(ACMD41, 0x40000000, 0x39); // 初始化
  ```
应用场景:  
- 相机照片存储、嵌入式系统的日志记录。
---
总结:核心差异
存储器类型
访问方式
操作粒度
寿命
内部Flash
并行/XIP
扇区擦除
10万次
SRAM
直接总线访问
字节
无限
EEPROM
I²C字节操作
字节
10万次
SPI Flash
指令+地址序列
页写入/块擦除
1万~10万次
eMMC
扇区读写(带控制器)
512B扇区
依赖FTL
SD卡
SDIO/SPI块操作
512B块
1万次
每种存储器的设计都是为了在速度、容量、成本和可靠性之间取得最佳平衡,满足不同层次的系统需求。


使用特权

评论回复
沙发
寂静小夜曲| | 2025-6-19 22:04 | 只看该作者
除了NorFlash封装外,还有哪些方式啊?
比如APM32F103使用的是不是也是NorFlash?

使用特权

评论回复
板凳
雾里闲逛| | 2025-6-20 11:09 | 只看该作者
还记得当年还搞过NandFlash呢!
还要标记坏块,管理正常的区块。
一个eMMC直接全部搞定。
当年也是掉了不少头发啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

42

主题

109

帖子

1

粉丝