乐鑫 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 集成了 41 个外设。除 PID 控制器之外,其余外设都可以被两个 CPU 用相同地址访问。系统中有两个 PID 控制器分别服务于 PRO_CPU 和 APP_CPU。PRO_CPU 和 APP_CPU 都只能访问自己的 PID 控制器,不能访问对方的 PID 控制器。
-
eFuse 块
eFuse 内存为一次性可编程 (OTP) 内存,可用于存储硬件和加密配置参数。作为一种非易失性存储单位,eFuse 的 bit 一旦被烧写为 1,不可再恢复为 0。
请参考最新版《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 的外设可通过两个外设总线 PeriBus1 和 PeriBus2 进行访问。 每个外设总线在数据总线上都有自己的地址空间。
PeriBus1 具有预测性读的功能,可提高性能。但不能保证每次的读访问都有效。因此,在使用 PeriBus1 时需要使用易失性声明。但在访问特殊寄存器如 FIFO 时,必须使用 PeriBus2,访问速度虽然慢,但可以确保安全访问。
-
eFuse 块
eFuse 内存为一次性可编程 (OTP) 内存,包含 4096 个 bit,可用于存储硬件和加密配置参数。作为一种非易失性存储单位,eFuse 的 bit 一旦被烧写为 1,不可再恢复为 0。
请参考最新版《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 可通过指令总线或数据总线分别访问存储器。
-
外设
外设模块可使用数据总线或指令总线通过固定地址段进行访问。每个外设模块的基地址和地址空间大小,决定了其边界地址。外设地址空间大小一般为 4 KB。更多信息,请查看设备的技术参考手册。
-
eFuse 块
eFuse 内存为一次性可编程 (OTP) 内存,包含 4096 个 bit,可用于存储硬件和加密配置参数。作为一种非易失性存储单位,eFuse 的 bit 一旦被烧写为 1,不可再恢复为 0。
请参考最新版《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。
-
外设
CPU 可通过数据/指令总线的固定地址空间访问外设模块。每个外设模块的基地址和地址空间大小,决定了其边界地址。地址空间大小一般为 4 KB。更多信息见技术参考手册。
-
eFuse 块
eFuse 内存为一次性可编程 (OTP) 内存,包含 4096 个 bit,可用于存储硬件和加密配置参数。作为一种非易失性存储单位,eFuse 的 bit 一旦被烧写为 1,不可再恢复为 0。
请参考最新版《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 中的程序和数据。
-
外设
CPU 可通过数据/指令总线的固定地址空间访问外设模块。每个外设模块的基地址和地址空间大小,决定了其边界地址。地址空间大小一般为 4 KB。更多信息见技术参考手册。
-
eFuse 块
eFuse 内存为一次性可编程 (OTP) 内存,包含 4096 个 bit,可用于存储硬件和加密配置参数。作为一种非易失性存储单位,eFuse 的 bit 一旦被烧写为 1,不可再恢复为 0。
请参考最新版《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的全双工模式ÿ…...
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 题 单选题 运行以下程序࿰…...
告别命令行恐惧!用这个可视化软件5分钟搞定Abaqus三维Voronoi泡沫模型
零代码革命:5分钟用可视化工具构建Abaqus三维Voronoi泡沫模型 在材料科学与工程仿真领域,Voronoi结构因其独特的几何特性,成为模拟泡沫、多孔材料和晶体结构的黄金标准。然而传统建模方法对编程技能的硬性要求,让许多材料工程师和…...
全球BGA锡球市场高速成长:2025年2.55亿美元筑基,2032年剑指4.43亿,8.3%CAGR锚定长期高增长逻辑
BGA锡球(BGA Solder Ball) 是用于替代IC元件封装结构中引脚的核心连接件,满足电性互连及机械连接的双重要求。简而言之,它是BGA封装工艺中不可或缺的焊接材料。QYResearch调研显示,2025年全球BGA锡球市场规模大约为2.5…...
Linux内核镜像构建与管理:从源码到部署的工程化实践
1. 项目概述:从“kernel-images”看内核镜像的构建与管理在Linux系统开发、嵌入式设备定制或者云原生基础设施的维护中,我们经常会遇到一个看似简单却至关重要的环节:内核镜像的构建与管理。无论是为了修复一个安全漏洞、启用一个新的硬件驱动…...
构建工程化提示词库:提升AI开发效率与代码质量
1. 项目概述:一个面向开发者的提示词库如果你和我一样,在过去的几年里深度参与了AI应用开发,尤其是基于大语言模型(LLM)的各类项目,那你一定对“提示工程”这个词又爱又恨。爱的是,一段精心设计…...
基于大语言模型的智能BI工具:从自然语言到SQL与可视化的工程实践
1. 项目概述:一个开源的商业智能对话工具最近在折腾数据分析和可视化,发现一个挺有意思的开源项目,叫openchatbi。简单来说,它就是一个能让你用自然语言跟数据库“聊天”的工具。你不需要写复杂的 SQL 语句,直接问“上…...
【C/C++】libusb实战:从零构建ADB USB通信框架
1. 为什么需要自己实现ADB USB通信? 很多开发者第一次接触ADB时,都是直接使用官方提供的adb命令行工具。这个工具确实方便,但当你需要深度定制Android设备调试流程,或者开发自动化测试框架时,官方工具就显得不够灵活了…...
开源知识库OpenAshare:用Git管理技术资产的工程化实践
1. 项目概述:一个面向开发者的开源分享平台最近在GitHub上看到一个挺有意思的项目,叫OpenAshare。光看名字,你可能以为它又是一个普通的代码仓库,但点进去之后,我发现它的定位其实更偏向于一个“开源分享平台”或者说“…...
ItsyBitsy RP2040与CircuitPython实战:从硬件解析到环境数据记录仪项目
1. 项目概述:为什么选择ItsyBitsy RP2040?如果你玩过树莓派Pico,或者用过Adafruit的Feather系列开发板,那么第一次拿到ItsyBitsy RP2040时,你可能会和我有同样的感觉:这东西也太小了。它的尺寸只有1.4英寸长…...
PCF8591模数转换器实战指南:从I2C通信到多通道数据采集
1. 项目概述:为什么你需要一个PCF8591?在嵌入式开发和电子制作的世界里,我们常常需要处理一个核心矛盾:我们的大脑和代码生活在离散的数字世界(0和1),但我们身处的物理世界却是一个充满连续变化…...
大语言模型角色扮演:从提示工程到智能体框架的完整指南
1. 项目概述:当大语言模型学会“扮演”角色如果你最近在关注大语言模型(LLM)的应用,可能会发现一个有趣的现象:单纯让模型回答“11等于几”或者写一封邮件,已经越来越难以满足我们的好奇心和实际需求了。一…...
