STM32完整内存地址空间分配详解

在STM32这类基于ARM Cortex-M的32位微控制器中,整个4GB的地址空间(从0x00000000到0xFFFFFFFF)有着非常系统化的分配方案,每个区域都有其特定的用途。下面我将详细介绍这些地址区域的分配及其功能:

STM32完整内存地址空间分配详解(0x00000000-0xFFFFFFFF)

代码区域 (0x00000000-0x1FFFFFFF)

  • 0x00000000-0x07FFFFFF:

    • 别名区域: 根据BOOT引脚配置,这个区域映射到以下三者之一:
      • Flash存储器(从0x08000000开始)
      • 系统存储器(内置Bootloader)
      • SRAM(从0x20000000开始)
    • 主要用途: CPU复位后首先从0x00000000读取初始栈指针和程序计数器,这个重映射机制允许灵活选择启动设备
  • 0x08000000-0x0FFFFFFF:

    • Flash存储器区域: 内部Flash的实际物理地址
    • 用途: 存储程序代码、常量数据和向量表
    • 特点: 在大多数STM32中,只使用前几MB的地址空间(根据具体型号,从64KB到2MB不等)
  • 0x10000000-0x1FFFFFFF:

    • 片上存储器区域: 包含特殊功能内存
    • 包含:
      • CCM数据RAM(核心耦合内存): 0x10000000开始(在某些STM32F4/F7系列)
      • SRAM(某些STM32H7): 0x10000000-0x1001FFFF
      • TCM(紧耦合内存): 在STM32H7系列中的ITCM/DTCM
      • 系统存储器: 0x1FFF0000-0x1FFFFFFF(厂商预编程的引导加载程序位置)
      • OTP和设备ID: 0x1FFF7800-0x1FFF7A0F(一次性可编程区域)

SRAM区域 (0x20000000-0x3FFFFFFF)

  • 0x20000000-0x3FFFFFFF:
    • 片上SRAM区域: 内部SRAM的主要区域
    • 布局:
      • 主SRAM(SRAM1): 从0x20000000开始
      • 附加SRAM区域(SRAM2/3等): 紧接SRAM1后排列
      • 备份SRAM: 某些STM32中包含电池供电的小型SRAM
    • 用途: 存储全局变量、堆、栈和动态分配的数据

外设区域 (0x40000000-0x5FFFFFFF)

  • 0x40000000-0x4FFFFFFF:

    • APB1/APB2/AHB1/AHB2外设区域: 所有外设寄存器均映射在此区域
    • 划分:
      • APB1外设(低速): 0x40000000-0x4000FFFF(USART2/3, SPI2/3, I2C1/2/3, 各种定时器等)
      • APB2外设(高速): 0x40010000-0x4001FFFF(USART1, SPI1, TIM1/8, ADC等)
      • AHB1外设: 0x40020000-0x4007FFFF(GPIO, DMA, RCC, Flash接口等)
      • AHB2外设: 0x40080000-0x400FFFFF(USB OTG, DCMI等)
  • 0x50000000-0x5FFFFFFF:

    • 扩展外设区域: 主要用于更高级的STM32型号中的额外外设
    • 包含: 高级外设和特殊功能单元(如加密单元)

外部设备区域 (0x60000000-0x9FFFFFFF)

  • 0x60000000-0x7FFFFFFF:

    • 外部存储器(FMC/FSMC控制器的Bank 1和2)区域
    • 用途: 连接外部SRAM、NOR Flash和PSRAM
    • 特点: 通过灵活存储器控制器(FMC/FSMC)进行管理
  • 0x80000000-0x8FFFFFFF:

    • 外部存储器(FMC/FSMC控制器的Bank 3)区域
    • 用途: 主要用于连接外部NAND Flash
  • 0x90000000-0x9FFFFFFF:

    • 外部存储器(FMC/FSMC控制器的Bank 4)区域
    • 用途: 在STM32F4/F7/H7系列中用于连接PC卡和CompactFlash设备

高级外设区域 (0xA0000000-0xDFFFFFFF)

  • 0xA0000000-0xBFFFFFFF:

    • 保留区域/特定于型号的扩展区域
    • 用途: 用于特定产品的专用外设或将来扩展使用
  • 0xC0000000-0xCFFFFFFF:

    • 灵活存储器控制器(FMC)Bank 5和6区域
    • 用途: 在支持SDRAM的STM32中连接外部SDRAM
    • 特点: 主要在STM32F4/F7/H7系列中使用,支持DDR内存接口
  • 0xD0000000-0xDFFFFFFF:

    • 保留区域/设备扩展空间
    • 用途: 预留以支持更多FMC/FSMC存储器映射或未来功能

系统区域 (0xE0000000-0xFFFFFFFF)

  • 0xE0000000-0xE00FFFFF:

    • 内核外设区域(PPB - Private Peripheral Bus)
    • 包含:
      • SysTick系统定时器: 0xE000E010-0xE000E01F
      • NVIC中断控制器: 0xE000E100-0xE000E4EF
      • 系统控制块(SCB): 0xE000ED00-0xE000ED8F
      • MPU内存保护单元: 0xE000ED90-0xE000EDBF
      • DBGMCU调试单元: 0xE000EDF0-0xE000EDFC
    • 特点: 这些是ARM Cortex-M核心的标准外设,所有STM32系列都类似
  • 0xE0100000-0xFFFFFFFF:

    • 供应商特定区域/保留区域
    • 包含:
      • 厂商专用的调试接口
      • 高级调试和跟踪功能
      • 系统ROM表(0xE00FF000-0xE00FFFFF)
      • 大部分空间保留给未来的ARM架构扩展

特殊内存区域功能详解

位带区域 (Bit-banding) - ARM Cortex-M3/M4/M7核心特性

位带映射允许对特定内存区域的单个位进行原子操作,避免了读-修改-写操作中可能的中断问题。

  • SRAM位带区域:

    • 原始区域: 0x20000000-0x200FFFFF (1MB)
    • 位带别名区域: 0x22000000-0x23FFFFFF (32MB)
    • 映射关系: 别名区域中的每个地址对应原始区域中的一个位
  • 外设位带区域:

    • 原始区域: 0x40000000-0x400FFFFF (1MB)
    • 位带别名区域: 0x42000000-0x43FFFFFF (32MB)

AHB-APB桥接区域

STM32通过两种类型的APB总线将低速外设连接到高速AHB系统总线:

  • APB1 (较低速):

    • 连接: 通过AHB-APB1桥接到系统总线
    • 时钟: 通常为系统时钟的1/2或1/4(例如84MHz/42MHz,在STM32F4系列)
    • 映射区域: 0x40000000开始
    • 典型外设: 基本通信接口(USART2/3, I2C, SPI2/3),基本定时器,看门狗
  • APB2 (较高速):

    • 连接: 通过AHB-APB2桥接到系统总线
    • 时钟: 通常与系统时钟相同或1/2(例如168MHz/84MHz,在STM32F4系列)
    • 映射区域: 0x40010000开始
    • 典型外设: 高速通信接口(USART1, SPI1),高级定时器,ADC

实际应用示例

1. 复位行为与启动流程

当STM32上电或复位时:

  1. CPU从地址0x00000000获取初始MSP(主堆栈指针)值
  2. 然后从地址0x00000004获取复位处理程序地址
  3. 根据BOOT引脚设置,这些地址映射到:
    • Flash(0x08000000) - 正常应用启动
    • 系统存储器(~0x1FFF0000) - 引导加载程序启动
    • SRAM(0x20000000) - 调试特殊用途启动

2. 常用寄存器访问示例

// RCC时钟控制寄存器 - 位于AHB1外设区域
#define RCC_BASE    0x40023800
#define RCC_AHB1ENR (*(volatile uint32_t *)(RCC_BASE + 0x30))// 使用位操作启用GPIOA时钟
RCC_AHB1ENR |= (1 << 0);  // 设置位0,启用GPIOA时钟// 使用结构体方式访问GPIO - 位于AHB1外设区域
typedef struct {volatile uint32_t MODER;    // 地址偏移: 0x00// ...其他寄存器...
} GPIO_TypeDef;#define GPIOA_BASE   0x40020000
#define GPIOA        ((GPIO_TypeDef *)GPIOA_BASE)// 配置GPIOA第0引脚为输出
GPIOA->MODER &= ~(3 << 0);  // 清除之前配置
GPIOA->MODER |= (1 << 0);   // 设置为输出模式

3. RAM区域的高级应用

// 将时间关键代码放到CCM(核心耦合内存)执行以提高性能
// CCM内存位于0x10000000
__attribute__((section(".ccmram"))) void criticalFunction(void) {// 高性能处理代码// 这段代码运行在0等待状态的内存中,比Flash快
}// 将重要数据放到备份SRAM以在低功耗模式下保留
// 备份SRAM通常位于0x40024000(STM32F4)
__attribute__((section(".backup_sram"))) uint32_t persistentCounter = 0;

4. 特殊功能区域访问示例

// 访问设备唯一ID(位于OTP区域)
#define DEVICE_ID_BASE 0x1FFF7A10  // 在STM32F4中的设备ID基址
uint32_t deviceID[3];  // 96位ID存储在3个32位字中
deviceID[0] = *(volatile uint32_t *)(DEVICE_ID_BASE + 0);
deviceID[1] = *(volatile uint32_t *)(DEVICE_ID_BASE + 4);
deviceID[2] = *(volatile uint32_t *)(DEVICE_ID_BASE + 8);// 访问核心外设 - 例如NVIC(嵌套向量中断控制器)
#define NVIC_BASE   0xE000E100
#define NVIC_ISER0  (*(volatile uint32_t *)(NVIC_BASE + 0x00))// 启用EXTI0中断(IRQ编号为6)
NVIC_ISER0 = (1 << 6);

实际开发建议

  1. 性能优化:

    • 将频繁访问的数据和代码放在不同的内存区域,利用总线矩阵的并行访问能力
    • 将关键代码放在CCM/TCM等0等待状态内存中执行,绕过Flash等待状态限制
  2. 内存管理:

    • 了解不同内存区域的大小限制和特性,合理规划空间使用
    • 使用链接器脚本控制不同类型变量和函数在内存中的分配
  3. 外设访问:

    • 使用厂商提供的外设库函数或生成的HAL代码访问外设,减少直接操作寄存器的错误风险
    • 理解位带机制并利用它进行安全的位操作
  4. 安全性:

    • 使用MPU(内存保护单元)保护关键区域,防止程序错误导致的内存破坏
    • 合理配置选项字节区域中的读保护级别,保护知识产权

了解STM32的完整内存映射对于深入掌握这类微控制器的架构和优化系统性能至关重要。合理利用这些不同区域的特性,可以实现更高效、更可靠、更安全的嵌入式系统设计。
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/79134.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实现水平垂直居中的多种方法

在前端开发中&#xff0c;元素的居中是一个常见但又经常让人头疼的问题。本文将全面总结各种CSS居中方法&#xff0c;特别是如何实现一个div的水平垂直居中。 为什么居中这么重要&#xff1f; 居中布局是现代网页设计中最基础也最重要的布局方式之一。无论是导航菜单、登录框…

如何实现服务的自动扩缩容(Auto Scaling)

在云计算和分布式系统的时代,系统的弹性和适应性已成为企业构建高效IT基础设施的核心需求。自动扩缩容(Auto Scaling)作为一种关键技术,旨在根据实时负载变化动态调整计算资源,以确保系统性能稳定,同时优化资源利用效率。简单来说,自动扩缩容是指系统能够根据预设规则或…

uniapp+vue3+ts 使用canvas实现安卓端、ios端及微信小程序端二维码生成及下载

加粗样式uniapp多端生成带二维码海报并保存至相册的实现 在微信小程序开发中&#xff0c;我们常常会遇到生成带有二维码的海报并保存到手机相册的需求&#xff0c;比如分享活动海报、产品宣传海报等。今天就来和大家分享一下如何通过代码实现这一功能。 准备工作 在开始之前&am…

架构师面试(三十八):注册中心架构模式

题目 在微服务系统中&#xff0c;当服务达到一定数量时&#xff0c;通常需要引入【注册中心】组件&#xff0c;以方便服务发现。 大家有没有思考过&#xff0c;注册中心存在的最根本的原因是什么呢&#xff1f;注册中心在企业中的最佳实践是怎样的&#xff1f;注册中心的服务…

Day.js和Moment.js对比,日期时间库怎么选?

在JavaScript的日期处理库中&#xff0c;Moment.js 和 Day.js 是两个非常流行的选择。本文将基于从npmtrends的数据&#xff0c;对这两个库进行详细的对比分析。 Moment.js的重度使用者。凡是遇到时间和日期的操作&#xff0c;就把Moment.js引用上。 直到有天我发现加载的mome…

罗默如何用木星卫星“宇宙钟表”测量光速?

一、17世纪的“宇宙级实验” 1676年&#xff0c;丹麦天文学家奥勒罗默&#xff08;Ole Rmer&#xff09;在巴黎天文台做出惊人发现&#xff1a; 木星卫星的“迟到早退”现象&#xff0c;竟能揭示光速的秘密&#xff01; 通过观察木卫一&#xff08;Io&#xff09;的轨道周期变…

deepseek 技巧整理

1、导出word 和excel 功能&#xff0c;在使用以下提示词。 请帮我列出减肥期间可以吃的水果&#xff0c;并分析该水果含有的营养元素&#xff0c;以表格的形式星现。1.要以html的方式输出 2.要可以直接运行 3.页面要提供可以直接下载word和excel功能

思考软件框架

数据库是达梦数据库 假定里面有40张表&#xff0c;软件的业务逻辑比较复杂。 当然&#xff0c;依然是对数据库中数据的增&#xff0c;删&#xff0c;改&#xff0c;查&#xff0c;组合&#xff0c;显示。 但是也涉及到多种软件&#xff0c;多台设备之间的通信。 我们可以使用…

探索 Disruptor:高性能并发框架的奥秘

在当今的软件开发领域&#xff0c;处理高并发场景是一项极具挑战性的任务。传统的并发解决方案&#xff0c;如基于锁的队列&#xff0c;往往在高负载下表现出性能瓶颈。而 Disruptor 作为一个高性能的并发框架&#xff0c;凭借其独特的设计和先进的技术&#xff0c;在处理海量数…

前端面经-VUE3篇--vue3基础知识(一)插值表达式、ref、reactive

一、计算属性(computed) 计算属性&#xff08;Computed Properties&#xff09;是 Vue 中一种特殊的响应式数据&#xff0c;它能基于已有的响应式数据动态计算出新的数据。 计算属性有以下特性&#xff1a; 自动缓存&#xff1a;只有当它依赖的响应式数据发生变化时&#xff…

数据结构6 · BinaryTree二叉树模板

代码函数功能顺序如下&#xff1a; 1&#xff1a;destroy&#xff1a;递归删除树 2&#xff1a;copy&#xff1a;复制二叉树 3&#xff1a;preOrder&#xff1a;递归前序遍历 4&#xff1a;inOrder&#xff1a;递归中序遍历 5&#xff1a;postOrder&#xff1a;递归后续遍…

C++/SDL进阶游戏开发 —— 双人塔防游戏(代号:村庄保卫战 13)

&#x1f381;个人主页&#xff1a;工藤新一 &#x1f50d;系列专栏&#xff1a;C面向对象&#xff08;类和对象篇&#xff09; &#x1f31f;心中的天空之城&#xff0c;终会照亮我前方的路 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 文章目录 十…

强化学习之基于无模型的算法之时序差分法

2、时序差分法(TD) 核心思想 TD 方法通过 引导值估计来学习最优策略。它利用当前的估计值和下一个时间步的信息来更新价值函数&#xff0c; 这种方法被称为“引导”&#xff08;bootstrapping&#xff09;。而不需要像蒙特卡罗方法那样等待一个完整的 episode 结束才进行更新&…

AE/PR模板 100个现代文字标题动态排版效果动画 Motion Titles

Motion Titles是一个令人惊艳的AE/PR模板&#xff0c;提供了100个现代文字标题的动态排版效果动画。这些动画效果能够为你的项目增添视觉冲击力和专业感&#xff0c;为文字标题注入活力和动感。该模板适用于Adobe After Effects CC或更高版本以及Adobe Premiere Pro 2020或更高…

【AI提示词】二八法则专家

提示说明 精通二八法则&#xff08;帕累托法则&#xff09;的广泛应用&#xff0c;擅长将其应用于商业、管理、个人发展等领域&#xff0c;深入理解其在不同场景中的具体表现和实际意义。 提示词 # Role: 二八法则专家## Profile - language: 中文 - description: 精通二八法…

前端八股 CSS 1

盒子模型 进行布局时将所有元素表示为一个个盒子box padding margin border content content&#xff1a;盒子内容 待显示的文本和图像 padding&#xff1a;内边距&#xff0c;内容和border之间的空间&#xff0c;不能为负数&#xff0c;受bkc影响 border:边框&#xff0c…

组件通信-$attrs

概述&#xff1a;$attrs用于实现当前组件的父组件&#xff0c;向当前组件的子组件通信&#xff08;爷→孙&#xff09;。 具体说明&#xff1a;$attrs是一个对象&#xff0c;包含所有父组件传入的标签属性。 注意&#xff1a;$attrs会自动排除props中声明的属性(可以认为声明过…

jdk开启https详细步骤

要在 JDK 中启用 HTTPS&#xff0c;您可以按照以下详细步骤进行操作&#xff1a; 生成密钥库和证书&#xff1a; 首先&#xff0c;您需要生成一个密钥库&#xff08;keystore&#xff09;和证书&#xff0c;可以使用 keytool 工具来生成。以下是使用 keytool 生成密钥库和证书的…

文章四《深度学习核心概念与框架入门》

文章4&#xff1a;深度学习核心概念与框架入门——从大脑神经元到手写数字识别的奇幻之旅 引言&#xff1a;给大脑装个"GPU加速器"&#xff1f; 想象一下&#xff0c;你的大脑如果能像智能手机的GPU一样快速处理信息会怎样&#xff1f;这正是深度学习的终极目标&…

关于CSDN创作的常用模板内容

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 好文评论新文推送 &#x1f4c3;文章前言 &…