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

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 - 0x0800FFFFFlash(代码存储)存储 程序代码(.text)只读数据(.rodata)
0x1FFFF000 - 0x1FFFF7FF系统 Boot ROM预留给 MCU BootLoader(ISP、IAP 相关)
0x20000000 - 0x20004FFFRAM(可变数据存储)SRAM(RAM,存储 .data.bss、堆、栈)
0x40000000 - 0x500607FF外设寄存器片上 GPIO、UART、SPI、I2C、TIM、ADC 等外设的控制寄存器
0xE0000000 - 0xE00FFFFFSystem 控制寄存器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 中&#xff0c;内存地址空间按照 存储功能 进行了严格划分&#xff0c;包括 Flash&#xff08;程序存储&#xff09;、RAM&#xff08;数据存储&#xff09;、外设寄存器&#xff08;GPIO、UART、SPI 等&am…...

深度学习实战车辆目标跟踪与计数

本文采用YOLOv8作为核心算法框架&#xff0c;结合PyQt5构建用户界面&#xff0c;使用Python3进行开发。YOLOv8以其高效的实时检测能力&#xff0c;在多个目标检测任务中展现出卓越性能。本研究针对车辆目标数据集进行训练和优化&#xff0c;该数据集包含丰富的车辆目标图像样本…...

django中视图作用和视图功能 以及用法

在 Django REST Framework(DRF)中,视图(View)是处理 HTTP 请求并返回响应的核心组件。DRF 提供了多种视图类,适用于不同的场景和需求。以下是 DRF 中常见的视图类及其作用、使用方法的详细说明: 一、DRF 视图的分类 DRF 的视图可以分为以下几类: 基于函数的视图(Func…...

【每日学点HarmonyOS Next知识】输入框自动获取焦点、JS桥实现方式、Popup设置全屏蒙版、鼠标事件适配、Web跨域

1、HarmonyOS TextInput或TextArea如何自动获取焦点&#xff1f; 可以使用 focusControl.requestFocus 对需要获取焦点的组件设置焦点&#xff0c;具体可以参考文档&#xff1a; https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/ts-universal-attribut…...

【学习思维模型】

学习思维模型 一、理解类模型二、记忆类模型三、解决问题类模型四、结构化学习模型五、效率与习惯类模型六、高阶思维模型七、实践建议八、新增学习思维模型**1. 波利亚问题解决四步法****2. 主动回忆(Active Recall)****3. 鱼骨图(因果图/Ishikawa Diagram)****4. MECE原则…...

MyBatis-Plus分页控件使用及使用过程发现的一个坑

最近维护一个旧项目的时候&#xff0c;出现了一个BUG&#xff0c;经排查后发现是Mybatis-plus分页控件使用的时候需要注意的一个问题&#xff0c;故在本地使用MybatisPlus模拟出现了一下这个问题。 首先&#xff0c;先说一下MyBatis-Plus的使用&#xff1a; 1&#xff09;引入…...

STM32的APB1和APB2的区别

STM32微控制器中的APB1和APB2的区别 STM32微控制器中的APB1和APB2是两种不同的外设总线&#xff0c;主要区别在于时钟速度、连接的外设以及用途。以下是它们的详细对比&#xff1a; 1. 时钟速度 APB1 (Advanced Peripheral Bus 1): 低速总线&#xff0c;时钟频率通常为系统时钟…...

JS一些小知识点

一、|| 运算符 plain this.ctx.body { type: type || 0, // ||在此处用法用于默认值填充&#xff0c;判断是否传参或该值是否存在&#xff0c;如果不存在就使用||后买你的值作为默认值 code: code || 0, msg: msg || SUCCESS, data: data || {}, ...others }; 二、trim() 方…...

手写Tomcat:实现基本功能

首先&#xff0c;Tomcat是一个软件&#xff0c;所有的项目都能在Tomcat上加载运行&#xff0c;Tomcat最核心的就是Servlet集合&#xff0c;本身就是HashMap。Tomcat需要支持Servlet&#xff0c;所以有servlet底层的资源&#xff1a;HttpServlet抽象类、HttpRequest和HttpRespon…...

C#变量与变量作用域详解

一、变量基础 1. ‌声明与初始化‌ 声明语法‌&#xff1a;<数据类型> <变量名>&#xff08;如 int age; string name&#xff09;‌初始化要求‌&#xff1a; 1、 类或结构体中的字段变量&#xff08;全局变量&#xff09;‌无需显式初始化‌&#xff0c;默认值…...

SV学习笔记——数组、队列

一、定宽数组 定宽数组是静态变量&#xff0c;编译时便已经确定其大小&#xff0c;其可以分为压缩定宽数组和非压缩定宽数组:压缩数组是定义在类型后面&#xff0c;名字前面;非压缩数组定义在名字后面。Bit [7:0][3:0] name; bit[7:0] name [3:0]; 1.1定宽数组声明 数组的声…...

API调试工具的无解困境:白名单、动态IP与平台设计问题

引言 你是否曾经在开发中遇到过这样的尴尬情形&#xff1a;你打开了平台的API调试工具&#xff0c;准备一番操作&#xff0c;结果却发现根本无法连接到平台&#xff1f;别急&#xff0c;问题出在调试工具本身。今天我们要吐槽的就是那些神奇的开放平台API调试工具&#xff0c;…...

Git清理本地残留的、但已经在服务器上被删除的分支

要筛选出已经被服务器删除的本地分支&#xff0c;并在本地删除这些分支&#xff0c;可以按照以下步骤进行操作&#xff1a; 步骤 1: 获取远程分支信息&#xff0c;确保本地的远程分支信息是最新的&#xff1a; git fetch -p步骤 2: 列出本地分支和远程分支&#xff1a; git …...

HTTPS实现内容加密的逻辑

加密过程 使用非对称加密&#xff0c;网站生成公钥和私钥浏览器获取到网站公钥&#xff08;通过验证和解析CA证书&#xff09;&#xff0c;随即生成一串字符串&#xff0c;然后使用公钥加密&#xff0c;发送给网站。网站用私钥将加密内容解析&#xff0c;然后使用这串字符串对…...

使用vue3.0+electron搭建桌面应用并打包exe

使用vue3.0electron搭建桌面应用并打包exe_如何使用electron将vue3vite开发完的项目打包成exe应用程序-CSDN博客...

JSAR 基础 1.2.1 基础概念_空间小程序

JSAR 基础 1.2.1 基础概念_空间小程序 空间空间自由度可嵌入空间空间小程序 最新的技术进展表明&#xff0c;官网之前的文档准备废除了&#xff0c;基于xsml的开发将退出历史舞台&#xff0c;three.js和普通web结合的技术将成为主导。所以后续学习请移步three.js学习路径&#…...

mysql练习

创建数据库db_ck&#xff0c;再创建表t_hero&#xff0c;将四大名著中的主要人物都插入这个表中&#xff0c;将实现过程中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 点评&#xff1a;缺席潜望式长焦&#xff0c;3X直立长焦体验还行。兼顾性能、游戏、屏幕、影像、续航、快充等诸多方面&#xff0c;且外围配置比较齐全。 2、vivo x200 点评&#xff1a;潜望式长焦相机&#xff0c;拍照效果好&#xff0c;30W无线充电着实鸡肋&a…...

基于Spring Boot的扶贫助农系统的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…...

物联网中如何增加其可扩展性 协议 网络 设备 还包括软件层面上的

物联网(IoT)系统的可扩展性是指系统能够随着设备数量、数据流量和业务需求的增长而灵活扩展的能力。为了增加物联网的可扩展性,需要从协议、网络、设备和软件等多个层面进行优化和设计。以下是一些具体的策略和方法: 1. 协议层面的可扩展性 1.1 采用轻量级协议 轻量级协议…...

基于DeepSeek与搜索引擎构建智能搜索摘要工具

基于DeepSeek与搜索引擎构建智能搜索摘要工具 1. 项目概述 本项目通过整合DuckDuckGo搜索引擎与DeepSeek大语言模型,实现了一个智能搜索摘要生成工具。系统可自动执行以下流程: 输入查询语句进行全网搜索获取并解析搜索结果调用AI模型生成结构化摘要输出带来源标注的专业级…...

SQL 简介

SQL 简介 引言 结构化查询语言&#xff08;Structured Query Language&#xff0c;简称 SQL&#xff09;是一种用于数据库管理和操作的标准查询语言。它广泛应用于各个领域的数据库管理系统&#xff08;DBMS&#xff09;中&#xff0c;用于存储、检索和管理数据。SQL 不仅是数…...

BLUEM2引擎源码2025最新版

BLUE 引擎解析&#xff1a;传奇私服圈中的热门引擎 一、BLUE 引擎简介 BLUE 引擎是传奇私服圈子中较为知名的一款游戏引擎&#xff0c;它在传统的传奇引擎基础上进行了优化和扩展&#xff0c;使得私服开发者可以更加方便地搭建和管理服务器。相比于早期的 GEE、LEG、Hero 等引…...

pytest结合allure

Allure 一、文档二、指令三、装饰器3.1 allure.step装饰器3.2 allure.description装饰器3.3 allure.title装饰器3.4 allure.link、allure.issue 和 allure.testcase装饰器3.5 allure.epic、allure.feature 和 allure.story装饰器3.6 allure.severity装饰器 一、文档 allure文档…...

【渗透测试】基于时间的盲注(Time-Based Blind SQL Injection)

发生ERROR日志告警 查看系统日志如下&#xff1a; java.lang.IllegalArgumentException: Illegal character in query at index 203: https://api.weixin.qq.com/sns/jscode2session?access_token90_Vap5zo5UTJS4jbuvneMkyS1LHwHAgrofaX8bnIfW8EHXA71IRZwsqzJam9bo1m3zRcSrb…...

Gateway:网关路由与登录鉴权

在微服务架构中&#xff0c;用户登录和身份校验的处理方式确实与单体应用有所不同。在单体架构中&#xff0c;一旦用户通过身份验证&#xff0c;其会话信息可以在整个应用范围内共享&#xff0c;所有模块都能访问到用户信息。然而&#xff0c;在微服务架构下&#xff0c;每个服…...

本地部署DeepSeek R1大数据模型知识库

DeepSeek-V3 的综合能力 DeepSeek-V3 在推理速度上相较历史模型有了大幅提升。在目前大模型主流榜单中&#xff0c;DeepSeek-V3 在开源模型中位列榜首&#xff0c;与世界上最先进OpenAI 闭源模型不分伯仲。 1、下载Ollama运行大数据库 Ollama支持 Llama 3.3, DeepSeek-R1, Phi-…...

使用 Python 开发的简单招聘信息采集系统

以下是一个使用 Python 开发的简单招聘信息采集系统,它包含用户登录、招聘信息收集和前后端交互的基本功能。我们将使用 Flask 作为后端框架,HTML 作为前端页面。 项目结构 recruitment_system/ ├── app.py ├── templates/ │ ├── login.html │ ├── index…...

【jstack查询线程信息】1.对比下arthas的thread 和jvm指令

1)jps拿到进程号 2)jstack <pid> > <xxx.txt> // jstack作用:分析线程信息,死循环,死锁 jstack 23647 > 23647.txt Found 1 deadlock 3)对比:arthas查看线程信息 [arthas68751]$ thread -n 10 "MainWorker" Id69 cpuUsage72.29% deltaTime156ms …...

苦瓜书盘官网,免费pdf/mobi电子书下载网站

苦瓜书盘&#xff08;kgbook&#xff09;是一个专注于提供6英寸PDF和MOBI格式电子书的免费下载平台&#xff0c;专为电子阅读器用户设计。该平台为用户提供了丰富的电子书资源&#xff0c;涵盖文学、历史、科学、技术等多个领域&#xff0c;旨在打造一个全面的电子书资源库。用…...