ARM Cortex-M 内存映射详解:如何基于寄存器直接读写 寄存器映射方式编码程序 直接操作硬件寄存器来控制 MCU
ARM Cortex-M 的系统映射空间
在 STM32 等 ARM Cortex-M 系列 MCU 中,内存地址空间按照 存储功能 进行了严格划分,包括 Flash(程序存储)、RAM(数据存储)、外设寄存器(GPIO、UART、SPI 等)以及系统控制寄存器(中断、调试相关)。下面详细解析各个地址段的作用和特点。
1.1 内存地址映射总览
在 ARM Cortex-M 处理器(如 STM32 系列 MCU)中地址空间通常采用 32 位地址总线,因此可寻址 4GB(0x00000000 ~ 0xFFFFFFFF),但在嵌入式系统中,MCU 的可用内存远小于 4GB,并且地址空间被划分为多个功能区。
| 地址范围 | 存储内容 | 描述 |
|---|---|---|
0x00000000 - 0x000003FF | 向量表(Vector Table) | 存放复位向量(起始栈指针)、异常入口地址 |
0x08000000 - 0x0800FFFF | Flash(代码存储) | 存储 程序代码(.text) 和 只读数据(.rodata) |
0x1FFFF000 - 0x1FFFF7FF | 系统 Boot ROM | 预留给 MCU BootLoader(ISP、IAP 相关) |
0x20000000 - 0x20004FFF | RAM(可变数据存储) | SRAM(RAM,存储 .data、.bss、堆、栈) |
0x40000000 - 0x500607FF | 外设寄存器 | 片上 GPIO、UART、SPI、I2C、TIM、ADC 等外设的控制寄存器 |
0xE0000000 - 0xE00FFFFF | System 控制寄存器 | NVIC(中断控制)、SysTick(系统定时器)、调试接口 |
1.20x00000000 - 0x000003FF:向量表 (Vector Table)
MCU 复位后,系统从 0x00000000 地址处读取向量表,该表包含了复位后跳转到 main() 的入口地址。
作用:
- 存储异常和中断向量表,即异常/中断入口地址。
- 第一项存放的是栈指针初值(SP),用于 CPU 复位时初始化堆栈。
- 其余项是中断服务程序(ISR)地址,例如:
- 复位向量(Reset Vector)
- 硬件故障处理(HardFault、NMI)
- 外设中断(UART、GPIO、TIM 等)
向量表示例
0x00000000: 0x20004FFF ; 初始栈指针地址(RAM 顶部)
0x00000004: 0x08000239 ; 复位处理函数(Reset_Handler)
0x00000008: 0x08000321 ; NMI_Handler
0x0000000C: 0x08000345 ; HardFault_Handler
该表通存储于 Flash(0x08000000)
1.3 0x08000000 - 0x0800FFFF:Flash(程序存储)
作用
- 存放 MCU 固件(程序代码),包括:
.text(代码段).rodata(只读数据)
- 代码段的存储区域,运行时 CPU 直接从 Flash 取指令,不会加载到 RAM。
特点
- Flash 只能按扇区擦除,不能按字节修改(通常 1 次擦除需要 20ms 左右)。
- RAM 访问速度远快于 Flash,因此 关键代码可拷贝到 RAM 执行。
1.4 0x1FFFF000 - 0x1FFFF7FF:系统 Boot ROM
作用
- STM32 MCU 内置 Bootloader(引导程序),支持:
- ISP(In-System Programming):通过 UART/SWD 进行固件烧录。
- IAP(In-Application Programming):运行时更新 Flash 代码。
特点
- Bootloader 可以让 MCU 在 Flash 损坏的情况下仍然可以进行固件更新。
- 通过
BOOT0/BOOT1硬件引脚可以选择启动 Flash 还是 Bootloader。
1.5 0x20000000 - 0x20004FFF:RAM(数据存储)
作用
- 存储 MCU 运行时的变量和数据,包括:
.data段:已初始化的全局变量(上电后从 Flash 复制到 RAM).bss段:未初始化的全局变量(上电后初始化为 0)- 堆(Heap):
malloc()动态分配的内存 - 栈(Stack**)**:局部变量、函数调用信息
结构
+------------------+ 0x20005000 (RAM 结束)
| Heap | 动态分配(malloc)
+------------------+
| Stack | 栈(局部变量、返回地址)
+------------------+
| .bss | 未初始化数据(RAM)
+------------------+
| .data | 已初始化全局变量(RAM)
+------------------+ 0x20000000 (RAM 起始)
注意
- 栈向下增长,堆向上增长,如果二者相遇会导致崩溃(Stack Overflow)。
- 优化方法:
- 尽量使用
const让数据存入 Flash,减少 RAM 占用。 - 避免使用
malloc(),防止内存碎片化。
- 尽量使用
1.6 0x40000000 - 0x500607FF:外设寄存器
作用
- 用于 MCU 片上外设的控制,如:
- GPIO(0x40010800):控制 I/O 口输入/输出。
- UART(0x40013800):串口收发数据。
- SPI(0x40013000):SPI 传输数据。
- ADC(0x40012400):模拟信号转换。
代码示例
#define GPIOC_ODR (*((volatile uint32_t*) 0x4001100C))
GPIOC_ODR |= (1 << 13); // 置位 PC13(LED 亮)
特点
- 访问外设寄存器时 必须使用
volatile修饰,否则编译器可能优化导致错误。
1.7 0xE0000000 - 0xE00FFFFF:System 控制寄存器
作用
- 控制 中断、调试、系统时钟,主要包括:
- NVIC(Nested Vectored Interrupt Controller,中断控制器)
- SysTick(系统定时器)
- SCB(System Control Block,系统控制块)
代码示例
#define NVIC_ISER0 (*((volatile uint32_t*) 0xE000E100))
NVIC_ISER0 |= (1 << 6); // 使能外部中断 6
特点
- NVIC 允许中断嵌套,可以配置优先级。
- SysTick 是 Cortex-M 内置的 24-bit 计时器,用于系统心跳计时
相关文章:
ARM Cortex-M 内存映射详解:如何基于寄存器直接读写 寄存器映射方式编码程序 直接操作硬件寄存器来控制 MCU
ARM Cortex-M 的系统映射空间 在 STM32 等 ARM Cortex-M 系列 MCU 中,内存地址空间按照 存储功能 进行了严格划分,包括 Flash(程序存储)、RAM(数据存储)、外设寄存器(GPIO、UART、SPI 等&am…...
深度学习实战车辆目标跟踪与计数
本文采用YOLOv8作为核心算法框架,结合PyQt5构建用户界面,使用Python3进行开发。YOLOv8以其高效的实时检测能力,在多个目标检测任务中展现出卓越性能。本研究针对车辆目标数据集进行训练和优化,该数据集包含丰富的车辆目标图像样本…...
django中视图作用和视图功能 以及用法
在 Django REST Framework(DRF)中,视图(View)是处理 HTTP 请求并返回响应的核心组件。DRF 提供了多种视图类,适用于不同的场景和需求。以下是 DRF 中常见的视图类及其作用、使用方法的详细说明: 一、DRF 视图的分类 DRF 的视图可以分为以下几类: 基于函数的视图(Func…...
【每日学点HarmonyOS Next知识】输入框自动获取焦点、JS桥实现方式、Popup设置全屏蒙版、鼠标事件适配、Web跨域
1、HarmonyOS TextInput或TextArea如何自动获取焦点? 可以使用 focusControl.requestFocus 对需要获取焦点的组件设置焦点,具体可以参考文档: https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/ts-universal-attribut…...
【学习思维模型】
学习思维模型 一、理解类模型二、记忆类模型三、解决问题类模型四、结构化学习模型五、效率与习惯类模型六、高阶思维模型七、实践建议八、新增学习思维模型**1. 波利亚问题解决四步法****2. 主动回忆(Active Recall)****3. 鱼骨图(因果图/Ishikawa Diagram)****4. MECE原则…...
MyBatis-Plus分页控件使用及使用过程发现的一个坑
最近维护一个旧项目的时候,出现了一个BUG,经排查后发现是Mybatis-plus分页控件使用的时候需要注意的一个问题,故在本地使用MybatisPlus模拟出现了一下这个问题。 首先,先说一下MyBatis-Plus的使用: 1)引入…...
STM32的APB1和APB2的区别
STM32微控制器中的APB1和APB2的区别 STM32微控制器中的APB1和APB2是两种不同的外设总线,主要区别在于时钟速度、连接的外设以及用途。以下是它们的详细对比: 1. 时钟速度 APB1 (Advanced Peripheral Bus 1): 低速总线,时钟频率通常为系统时钟…...
JS一些小知识点
一、|| 运算符 plain this.ctx.body { type: type || 0, // ||在此处用法用于默认值填充,判断是否传参或该值是否存在,如果不存在就使用||后买你的值作为默认值 code: code || 0, msg: msg || SUCCESS, data: data || {}, ...others }; 二、trim() 方…...
手写Tomcat:实现基本功能
首先,Tomcat是一个软件,所有的项目都能在Tomcat上加载运行,Tomcat最核心的就是Servlet集合,本身就是HashMap。Tomcat需要支持Servlet,所以有servlet底层的资源:HttpServlet抽象类、HttpRequest和HttpRespon…...
C#变量与变量作用域详解
一、变量基础 1. 声明与初始化 声明语法:<数据类型> <变量名>(如 int age; string name)初始化要求: 1、 类或结构体中的字段变量(全局变量)无需显式初始化,默认值…...
SV学习笔记——数组、队列
一、定宽数组 定宽数组是静态变量,编译时便已经确定其大小,其可以分为压缩定宽数组和非压缩定宽数组:压缩数组是定义在类型后面,名字前面;非压缩数组定义在名字后面。Bit [7:0][3:0] name; bit[7:0] name [3:0]; 1.1定宽数组声明 数组的声…...
API调试工具的无解困境:白名单、动态IP与平台设计问题
引言 你是否曾经在开发中遇到过这样的尴尬情形:你打开了平台的API调试工具,准备一番操作,结果却发现根本无法连接到平台?别急,问题出在调试工具本身。今天我们要吐槽的就是那些神奇的开放平台API调试工具,…...
Git清理本地残留的、但已经在服务器上被删除的分支
要筛选出已经被服务器删除的本地分支,并在本地删除这些分支,可以按照以下步骤进行操作: 步骤 1: 获取远程分支信息,确保本地的远程分支信息是最新的: git fetch -p步骤 2: 列出本地分支和远程分支: git …...
HTTPS实现内容加密的逻辑
加密过程 使用非对称加密,网站生成公钥和私钥浏览器获取到网站公钥(通过验证和解析CA证书),随即生成一串字符串,然后使用公钥加密,发送给网站。网站用私钥将加密内容解析,然后使用这串字符串对…...
使用vue3.0+electron搭建桌面应用并打包exe
使用vue3.0electron搭建桌面应用并打包exe_如何使用electron将vue3vite开发完的项目打包成exe应用程序-CSDN博客...
JSAR 基础 1.2.1 基础概念_空间小程序
JSAR 基础 1.2.1 基础概念_空间小程序 空间空间自由度可嵌入空间空间小程序 最新的技术进展表明,官网之前的文档准备废除了,基于xsml的开发将退出历史舞台,three.js和普通web结合的技术将成为主导。所以后续学习请移步three.js学习路径&#…...
mysql练习
创建数据库db_ck,再创建表t_hero,将四大名著中的主要人物都插入这个表中,将实现过程中sql提交上上来 1、创建数据库db_ck mysql> create database db_ck; 2、创建表t_hero mysql> use db_ck Database changed mysql> create table …...
2025年2月平价旗舰手机性能对比
1、荣耀Magic7 点评:缺席潜望式长焦,3X直立长焦体验还行。兼顾性能、游戏、屏幕、影像、续航、快充等诸多方面,且外围配置比较齐全。 2、vivo x200 点评:潜望式长焦相机,拍照效果好,30W无线充电着实鸡肋&a…...
基于Spring Boot的扶贫助农系统的设计与实现(LW+源码+讲解)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...
物联网中如何增加其可扩展性 协议 网络 设备 还包括软件层面上的
物联网(IoT)系统的可扩展性是指系统能够随着设备数量、数据流量和业务需求的增长而灵活扩展的能力。为了增加物联网的可扩展性,需要从协议、网络、设备和软件等多个层面进行优化和设计。以下是一些具体的策略和方法: 1. 协议层面的可扩展性 1.1 采用轻量级协议 轻量级协议…...
酒店门锁V10SDK接口说明-幽冥大陆(一百23)—东方仙盟
相关文件系统环境C# :NET.20,NET3.5,NET4,NET4.5,NET 5.0C:VS2005,VS2012,VS2015操作系统:未来之窗VOSWEB:CHROME43核心代码完整代码using System; using System.Collections.Generic; using System.Text; using System.Collections.Specialized;using System.Windo…...
自制射频功率计:基于AD8317芯片,成本43欧元实现1MHz-10GHz测量
1. 项目概述:为什么我要亲手打造一台射频功率计在无人机和模型飞行器的圈子里,尤其是在我们荷兰FMS Spaarnwoude俱乐部,合规飞行是头等大事。我给我的八轴飞行器加装了云台相机和图传系统,工作在5.8GHz频段。根据本地法规…...
力扣HOT100(30)两两交换链表中的节点
链表的交换要注意 “链表不断链”。前驱和后继都要连着迭代法(必学死磕!O (n) 时间,O (1) 空间)1. 为什么必须用虚拟头节点?因为交换后链表的头节点会变! 比如示例 1 中,原来的头是 1࿰…...
Windows 10/11系统下,SecureCRT 8.7.2保姆级安装与激活图文指南(含Keygen使用避坑点)
Windows平台SecureCRT 8.7.2全流程部署与安全配置指南在当今远程运维与网络管理的日常工作中,一款可靠的终端仿真工具如同工程师的瑞士军刀。作为行业标杆的SecureCRT,其8.7.2版本在Windows 10/11环境下的部署却常让新手陷入各种技术陷阱——从安装路径选…...
嵌入式快速原型开发:基于Sceptre平台与LPC2148的实战指南
1. 项目概述:Sceptre,一个被低估的嵌入式快速原型利器 在嵌入式开发的世界里,我们总是在寻找那个“刚刚好”的平台:它要足够强大,能跑复杂的算法;要足够小巧,能塞进各种外壳;要足够便…...
放弃编码器!纯靠MPU6050和PID算法,手把手教你用TT马达实现平衡小车稳定控制(STM32F103C8T6实战)
纯MPU6050STM32F103的TT马达平衡车实战:无编码器PID控制全解析当大多数平衡小车方案都在强调编码器对速度反馈的不可或缺性时,我们决定挑战一个更极简的配置:仅用5美元的TT马达、9轴的MPU6050和STM32F103C8T6最小系统板,完全舍弃编…...
Unity Visual Scripting不是拖拽玩具:中阶开发者的编程范式重构指南
1. 为什么Unity官方Visual Scripting不是“拖拽完就能跑”的玩具,而是一套需要重新理解的编程范式很多人第一次点开Unity的Visual Scripting(VS)面板时,看到那些五颜六色的节点和丝滑的连线,下意识觉得:“这…...
AutoPentest:面向红队的渗透测试决策引擎架构解析
1. 这不是又一个“自动化扫描器”,而是一套能替你做决策的渗透测试工作流引擎AutoPentest这个名字,第一眼容易让人联想到Nmap加个for循环、或者Burp Suite里点几下Intruder——但实际用过的人很快会意识到:它根本不在同一个维度上。我第一次在…...
Windows 11 LTSC安装微软商店的终极解决方案:3步恢复完整应用生态
Windows 11 LTSC安装微软商店的终极解决方案:3步恢复完整应用生态 【免费下载链接】LTSC-Add-MicrosoftStore Add Windows Store to Windows 11 24H2 LTSC 项目地址: https://gitcode.com/gh_mirrors/ltscad/LTSC-Add-MicrosoftStore LTSC-Add-MicrosoftStor…...
自动加字幕软件推荐:口播视频如何批量加字幕过
口播视频加字幕,为什么越做越累?一位知识类博主连续两周日更3条口播视频,每条12–18分钟,需手动校对字幕、拆分金句切片、补气口停顿、匹配背景音乐——最后一条视频发布时,字幕错漏率达17%,平台审核未过。…...
