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

乐鑫 SoC 内存映射入门

微控制器 (MCU) 的性能和内存能力逐步提升,其复杂度也随之加大。特别是当用户需要配置内存管理单元来映射外部存储器芯片 (Flash/SPIRAM) 时,这种现象尤其明显。

开始在乐鑫 SoC 上运行 Zephyr RTOS 时,会发现这些 SoC 与 ARM 架构的 MCU 相比,完全是不同的世界。ARM Cortex-M 基于冯-诺伊曼内存架构,而乐鑫 SoC 使用哈佛内存架构。架构不同,使用复杂度也有差异。 

乐鑫为用户提供了很多开源文档,如《技术规格书》或《技术参考手册》​​​​​​​是获取 SoC 技术信息的第一手资料。但这些内容对于一些用户来说,读起来颇具挑战,因为有一部分重要的信息被隐藏在冗长的文字描述中,用户很难快速获取核心重点。 

本文将从《技术参考手册》中提取重要信息,并绘制成视觉丰富,内容详实的描述性文档。将本文与 SoC《技术规格书》和《技术参考手册》搭配使用,用户可以更好地理解乐鑫 SoC 的内部结构。这在系统开发和驱动开发过程中,例如在移植到 Zephyr RTOS 等其他系统时,尤其重要。


目录

ESP32 

  • ROM 
  • SRAM 
  • RTC-SRAM 
  • 指令 Cache & 数据 Cache 
  • 外设 
  • eFuse 块 

ESP32-S2 

  • ROM 
  • SRAM 
  • RTC-SRAM 
  • 指令 Cache & 数据 Cache 
  • 外设 
  • eFuse 块 

ESP32-S3 

  • ROM 
  • SRAM 
  • RTC-SRAM 
  • 指令 Cache & 数据 Cache 
  • 外设 
  • eFuse 块 ​​​​​​​

ESP32-C3 

  • ROM 
  • SRAM 
  • RTC-SRAM 
  • 指令 Cache & 数据 Cache 
  • 外设 
  • eFuse 块 ​​​​​​​

ESP32-C6 

  • ROM 
  • SRAM 
  • 指令 Cache & 数据 Cache 
  • 外设 
  • eFuse 块 

资料下载 

结语 


ESP32 

ESP32 采用 Xtensa LX6 双核微处理器,是 ESP32 系列中最先发布的 SoC 产品。 

此款 SoC 可使用 SPI 接口访问外部 flash 存储器。也可以访问外部 SPIRAM,但仅限通过数据总线访问。 

点击链接可查看 Zephyr-RTOS 已支持的 ESP32 开发板。 

  • ROM 

ROM 用于存储主引导加载程序代码和其他用户可使用的库函数。ROM 中存储的内容已在生产过程中固化,不可更改。请参考《ESP32 系列芯片勘误表》查看更多 ECO 版本信息。TLDR 使用最新的 ECO v3 及之后的 ESP32 芯片版本。 

  • SRAM 

ESP32 内置三个 SRAM 模块。SRAM0 大小为 192 KB,头 64 KB 可配置为 MMU Cache,用于外部存储器访问。不作为 Cache 使用时,头 64 KB 可以被两个 CPU 通过指令总线读写。 

内部 SRAM1 大小为 128 KB。既可以被两个 CPU 通过数据总线读写,也可以被两个 CPU 通过指令总线读写。 

指令总线地址和数据总线地址访问的 word 是逆序的。 

  • RTC-SRAM 

RTC-FAST 内存仅能被 PRO_CPU 通过数据总线固定地址或指令总线固定地址访问。与其他内存不同,该内存不可通过 APP_CPU 访问。 

RTC-SLOW 内存可以被两个 CPU 通过数据总线和指令总线读写。 

RTC 内存可在 Deep-sleep 期间保存数据。 

  • 指令 Cache & 数据 Cache 

指令和数据 Cache 地址空间为虚拟地址空间,指令或数据总线可以在其中访问 flash 或 SPIRAM 等外部存储器。 

ESP32 内存和 Cache 地址空间
  • 外设 

ESP32 集成了 41 个外设。除 PID 控制器之外,其余外设都可以被两个 CPU 用相同地址访问。系统中有两个 PID 控制器分别服务于 PRO_CPU 和 APP_CPU。PRO_CPU 和 APP_CPU 都只能访问自己的 PID 控制器,不能访问对方的 PID 控制器。 

  • eFuse 块 

eFuse 内存为一次性可编程 (OTP) 内存,可用于存储硬件和加密配置参数。作为一种非易失性存储单位,eFuse 的 bit 一旦被烧写为 1,不可再恢复为 0。 

ESP32 片上外设及对应的 eFuse 地址空间

 请参考最新版《ESP32 技术参考手册》查看更多信息。 


ESP32-S2 

ESP32-S2 是基于 ESP32 的一款 SoC,与 ESP32 非常相似。但 ESP32-S2 属于单核 SoC,且内存组成略有不同。 

与 ESP32 相比,ESP32-S2 可以通过数据总线和指令总线访问外部 SPIRAM,可以运行程序和访问数据。 

点击链接可查看 Zephyr-RTOS 已支持的 ESP32-S2 开发板。 

  • ROM 

ROM 用于存储主引导加载程序代码和其他用户可使用的库函数。ROM 中存储的内容已在生产过程中固化,不可更改。 

  • SRAM 

ESP32-S2 的 SRAM0 可以配置为硬件 Cache,用于访问外部存储器。CPU 可以通过数据或指令总线同序进行读写访问。 

  • RTC-SRAM 

RTC-SLOW 内存可以被 CPU 通过数据总线和指令总线读写,也可以通过 PeriBus1 和 PeriBus2 访问。 

  • 指令 Cache & 数据 Cache 

CPU 通过 Cache 访问外部存储器。通过 I-Cache 访问的地址空间可达 7.5 MB。通过 I-Cache 访问的只读数据总线地址空间可达 4 MB。可访问的外部 flash 或 SPIRAM 地址空间可达 10.5 MB。 

ESP32-S2 内存和 Cache 地址空间
  • 外设 

ESP32-S2 的外设可通过两个外设总线 PeriBus1 和 PeriBus2 进行访问。 每个外设总线在数据总线上都有自己的地址空间。 

PeriBus1 具有预测性读的功能,可提高性能。但不能保证每次的读访问都有效。因此,在使用 PeriBus1 时需要使用易失性声明。但在访问特殊寄存器如 FIFO 时,必须使用 PeriBus2,访问速度虽然慢,但可以确保安全访问。 

  • eFuse 块 

eFuse 内存为一次性可编程 (OTP) 内存,包含 4096 个 bit,可用于存储硬件和加密配置参数。作为一种非易失性存储单位,eFuse 的 bit 一旦被烧写为 1,不可再恢复为 0。 

ESP32-S2 片上外设及对应的 eFuse 地址空间

请参考最新版《ESP32-S2 技术参考手册》查看更多信息。 


ESP32-S3 

ESP32-S3 是最新一款 Xtensa LX7 双核设计 SoC。除了两个主处理器外,ESP32-S3 还集成了两个超低功耗 RISC-V 协处理器。ESP32-S3 集成了一个 JTAG 调试器,可通过 USB 接口进行通信。ESP32-S3 还可以通过数据总线和指令总线访问外部 SPIRAM,可以运行程序和访问数据。 

点击链接可查看 Zephyr-RTOS 已支持的 ESP32-S3 开发板。 

  • ROM 

ROM 用于存储主引导加载程序代码和其他用户可使用的库函数。ROM 中存储的内容已在生产过程中固化,不可更改。 

  • SRAM 

ESP32-S3 内置三个 SRAM 模块。SRAM0 可配置为 I-Cache buffer,用来访问外部存储器的指令。SRAM0 也可用作静态内存由指令总线使用。SRAM1 可以通过数据总线和指令总线进行读写访问。SRAM2 可以配置为 D-Cache,也用作静态内存,可以通过数据总线进行读写访问。 

  • RTC-SRAM 

RTC-SLOW 内存可以通过数据总线和指令总线读写。RTC-FAST 内存可以通过数据总线和指令总线固定地址进行读写访问。 

  • 指令 Cache & 数据 Cache 

两个 CPU 可以通过缓存的 MMU 地址空间访问外部存储器。I-Cache 和 D-Dache 可通过指令总线或数据总线分别访问存储器。 

ESP32-S3 内存和 Cache 地址空间

  • 外设 

外设模块可使用数据总线或指令总线通过固定地址段进行访问。每个外设模块的基地址和地址空间大小,决定了其边界地址。外设地址空间大小一般为 4 KB。更多信息,请查看设备的技术参考手册。 

  • eFuse 块 

eFuse 内存为一次性可编程 (OTP) 内存,包含 4096 个 bit,可用于存储硬件和加密配置参数。作为一种非易失性存储单位,eFuse 的 bit 一旦被烧写为 1,不可再恢复为 0。 

ESP32-S3 片上外设及对应的 eFuse 地址空间 

请参考最新版《ESP32-S3 技术参考手册》查看更多信息。 


ESP32-C3 

ESP32-C3 是一款 32 位 RISC-V SoC,自带 “IMC” 扩展。与 Xtensa SoC 相比,ESP32-C3 地址空间极其简单。ESP32-C3 支持 JTAG 调试,可通过片上 USB 接口进行通信。 

点击链接可查看 Zephyr-RTOS 已支持的 ESP32-C3 开发板。 

  • ROM 

ROM 用于存储主引导加载程序代码和其他用户可使用的库函数。ROM 中存储的内容已在生产过程中固化,不可更改。 

  • SRAM 

ESP32-C3 有两个 SRAM 模块。SRAM1 可以配置为 I-Cache buffer,也用作静态内存。SRAM1 属于通用内存,可以通过数据总线和指令总线进行读写访问。 

  • RTC-SRAM 

RTC-FAST 内存可以通过 CPU 数据总线和指令总线读写。 

  • 指令 Cache & 数据 Cache 

ESP32-C3 支持以 SPI、Dual SPI、Quad SPI、QPI 等接口形式访问片外 flash。ESP32-C3 还支持手动加密和自动解密。I-Cache 和 D-Dache 可通过指令总线或数据总线分别访问外部 flash。 

ESP32-C3 内存和 Cache 地址空间
  • 外设 

CPU 可通过数据/指令总线的固定地址空间访问外设模块。每个外设模块的基地址和地址空间大小,决定了其边界地址。地址空间大小一般为 4 KB。更多信息见技术参考手册。 

  • eFuse 块 

eFuse 内存为一次性可编程 (OTP) 内存,包含 4096 个 bit,可用于存储硬件和加密配置参数。作为一种非易失性存储单位,eFuse 的 bit 一旦被烧写为 1,不可再恢复为 0。 

ESP32-C3 片上外设及对应的 eFuse 地址空间 

请参考最新版《ESP32-C3 技术参考手册》查看更多信息。 


ESP32-C6 

ESP32-C6 是一款 32 位 RISC-V SoC,自带 “IMAC” 扩展。与 Xtensa SoC 相比,ESP32-C6 地址空间极其简单。ESP32-C6 支持 JTAG 调试,可通过片上 USB 接口进行通信。 

Zephyr-RTOS 对 ESP32-C6 开发板的支持正在开发中。 

  • ROM 

ROM 用于存储主引导加载程序代码和其他用户可使用的库函数。ROM 中存储的内容已在生产过程中固化,不可更改。 

  • SRAM 

ESP32-C6 有两个 SRAM 模块。 

HP-SRAM 属于静态内存,HP CPU 和 LP CPU 可以通过数据总线或指令总线同序读写访问这部分内存。 

LP-SRAM 属于静态内存,HP CPU 和 LP CPU 可以通过数据总线或指令总线读写访问这部分内存。可使用高速模式或低速模式访问 LP-SRAM。 

  • 指令 Cache & 数据 Cache 

ESP32-C3 支持以 SPI、Dual SPI、Quad SPI、QPI 等接口形式访问片外 flash。ESP32-C6 还支持手动加密和自动解密,从而保护开发者片外 flash 中的程序和数据。 

ESP32-C6 内存和 Cache 地址空间 
  • 外设 

CPU 可通过数据/指令总线的固定地址空间访问外设模块。每个外设模块的基地址和地址空间大小,决定了其边界地址。地址空间大小一般为 4 KB。更多信息见技术参考手册。 

  • eFuse 块 

eFuse 内存为一次性可编程 (OTP) 内存,包含 4096 个 bit,可用于存储硬件和加密配置参数。作为一种非易失性存储单位,eFuse 的 bit 一旦被烧写为 1,不可再恢复为 0。 

ESP32-C6 片上外设及对应的 eFuse 地址空间 

请参考最新版《ESP32-C6 技术参考手册》查看更多信息。 


资料下载 

PDF 格式的图片可通过以下途径下载: 

  • ESP32 
  • ESP32-S2 
  • ESP32-S3 
  • ESP32-C3 
  • ESP32-C6 

结语 

有时候,当我们想要深入了解某些内容时,需要首先深入研究一些技术文档,然后再用我们自己的方式将有用信息提取出来,消化吸收。技术文档可能很难理解,如果不熟悉涉及的一些体系结构或特定领域,则更加难读懂技术文档。希望这篇博客可以让你轻松理解乐鑫 SoC 的内存映射。或者在你需要深入研究技术参考手册或技术规格书时,作为辅助参考使用。

相关文章:

乐鑫 SoC 内存映射入门

微控制器 (MCU) 的性能和内存能力逐步提升,其复杂度也随之加大。特别是当用户需要配置内存管理单元来映射外部存储器芯片 (Flash/SPIRAM) 时,这种现象尤其明显。 开始在乐鑫 SoC 上运行 Zephyr RTOS 时,会发现这些 SoC 与 ARM 架构的 MCU 相…...

蓝凌EIS智慧协同平台saveImg接口存在任意文件上传漏洞

蓝凌EIS智慧协同平台saveImg接口存在任意文件上传漏洞 一、蓝凌EIS简介二、漏洞描述三、影响版本四、fofa查询语句五、漏洞复现六、深度复现1、发送如花2、哥斯拉直连 免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者…...

【SEC 学习】美化 Linux 终端

一、步骤 1. 进入 /etc/bash.bashrc vim /etc/bash.bashrc2. 重新加载 bash.bashrc source /etc/bash.bashrc二、各参数指标 符号含义\u当前用户的账号名称\h仅取主机的第一个名字,如上例,则为fc4,.linux则被省略\H完整的主机名称。例如&…...

【Unity小技巧】可靠的相机抖动及如何同时处理多个震动(附项目源码)

文章目录 每篇一句前言安装虚拟相机虚拟相机震动测试代码控制震动清除震动控制震动的幅度和时间 两个不同的强弱震动同时发生源码完结 每篇一句 围在城里的人想逃出来,站在城外的人想冲进去,婚姻也罢,事业也罢,人生的欲望大都如此…...

【51单片机】51单片机概述(学习笔记)

一、课程简介 1、硬件设备 51单片机开发板 Win电脑 2、软件设备 Keil5:编写程序代码 STC-ISP:下载程序 有道词典 福昕阅读器 二、开发工具介绍 1、Keil5 keil.com > 下载C51版本 > 使用破解程序 2、STC-ISP 绿色版:直接运…...

make和new的区别

make和new都是golang用来分配内存(理论上都是在堆上分配),不同的是 new分配空间只是将内存清零,并没有初始化;而make分配之后只初始化内存new为每个类型都分配,而make专用于slice、map、channew返回类型指…...

vue3获取页面路径

import { useRouter, useRoute } from vue-routerconst router useRouter()router.currentRoute.value.path // 页面路径...

基于STM32闭环步进电机控制系统设计

**单片机设计介绍,1654基于STM32闭环步进电机控制系统设计(仿真,程序,说明) 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序文档 六、 文章目录 一 概要 基于STM32的闭环步进电机控制系统设计是…...

Java中的队列:各种类型及使用场景

在Java中,队列是一种重要的数据结构,用于存储按特定顺序排列的元素。队列在多线程环境中特别有用,因为它们可以用来解决并发问题。在Java中,队列主要分为以下几种类型: 接口: Queue: 这是Java Queue接口&…...

MappingMongoConverter原生mongo 枚举类ENUM映射使用的是name

j.l.IllegalArgumentException: No enum constant com.xxx.valobj.TypeEnum.stringat java.lang.Enum.valueOf...

Java中的锁:类型,比较,升级与降级

在Java中,锁是一种用于实现并发控制的重要工具。在多线程环境中,锁可以确保数据的一致性和完整性。Java提供了多种类型的锁,包括内置的synchronized关键字,ReentrantLock类以及更高级的并发工具,如StampedLock和ReadWr…...

STM32:串口轮询模式、中断模式、DMA模式和接收不定长数据

一.串口轮询模式底层机制: 在STM32每个串口的内部都有两个寄存器:发送数据寄存器(TDR)/发送移位寄存器,当我们调用HAL_UART_Transmit 把数据发送出去时,CPU会将数据依次将数据发送到数据寄存器中,移位寄存器中的数据会根据我们设置…...

【OJ for Divide and Conquer】OJ题解

文章目录 A - Ultra-QuickSortB - Hanoi Tower Troubles Again! [找规律递归]C - Fibonacci Again[找规律]E - [Fire Net](https://programmerall.com/article/7276104269/)[DFS 搜索 ⭐⭐]F - Gridland[找规律]G - Maximum Subarray Sum[动态规划/分治..经典⭐]I - Quoit Desi…...

使用 Sealos 一键部署 Kubernetes 集群

Sealos 是一款以 Kubernetes 为内核的云操作系统发行版,使用户能够像使用个人电脑一样简单地使用云。 与此同时,Sealos 还提供一套强大的工具,可以便利地管理整个 Kubernetes 集群的生命周期。 Sealos 不仅可以一键安装一个单节点的 Kubern…...

解读电力系统中的GPS北斗卫星同步时钟系统

随着电力系统的快速发展,变电站中的各类系统 :计算机监控系统、水情测报系统、视频监控系统 状态监测系统 生产信息管理系统等,各类装置:继电保护装置、故障录波装置、PMU装置、事件顺序记录SOE功能越来越强大,需要采集、记录的数…...

原子类:Java并发编程的利器

在多线程环境下,确保数据的一致性和原子性是至关重要的。Java提供了一些原子类,用于解决多线程并发问题。这些原子类能够确保操作在多线程环境下是原子的,即不会被其他线程干扰。本文将介绍Java中的原子类及其应用。 一、原子类概述 原子类…...

99%网工都会遇到的经典面试问题

①问题:介绍TCP连接的三次握手?追问:为什么TCP需要握手三次? 三次握手: 第一步:A向B发送一个SYN报文表示希望建立连接 第二步:B收到A发过来的数据包后,通过SYN得知这是一个建立连接的请求,于是发送ACK确认,由于TCP的全双工模式&#xff…...

html和css中图片加载与渲染的规则是什么?

浏览器渲染web页面的过程 解析html,构成dom树 2.加载css,构成样式规则树 3.加载js,解析js代码 4.dom树和样式树进行匹配,构成渲染树 5.计算元素位置进行页面布局 5.绘制页面,呈现到浏览器中 图片加载和渲染的过程 1.解…...

YOLO轻量化改进 , 边缘GPU友好的YOLO改进算法!

在本文中,作者根据现有先进方法中各种特征尺度之间缺少的组合连接的问题,提出了一种新的边缘GPU友好模块,用于多尺度特征交互。此外,作者提出了一种新的迁移学习backbone采用的灵感是来自不同任务的转换信息流的变化,旨…...

第15届蓝桥杯Scratch选拔赛中级(STEMA)真题2023年8月

第15届蓝桥杯Scratch选拔赛中级(STEMA)真题2023年8月 一、单选题 第 1 题 单选题 点击以下积木块,生成的随机数是一个( )。 A.整数 B.小数 C.整数或小数 D.以上都不对 第 2 题 单选题 运行以下程序&#xff0…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

微信小程序之bind和catch

这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

CSS | transition 和 transform的用处和区别

省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...