ARM Cortex-M3内存映射与外设配置详解

news2026/5/15 15:31:08
1. ARM Cortex-M3 SMM系统架构解析在嵌入式系统开发中系统内存映射(System Memory Map, SMM)是连接处理器内核与各类外设的关键桥梁。ARM Cortex-M3处理器通过精心设计的SMM架构为开发者提供了灵活而高效的硬件资源配置方案。V2M-MPS2开发板作为ARM官方推出的原型验证平台其SMM设计充分体现了现代嵌入式系统的典型特征。1.1 Cortex-M3内存空间基础架构Cortex-M3处理器采用统一的4GB地址空间这4GB空间被划分为多个预定义区域每个区域具有特定的访问特性代码区域(0x00000000-0x1FFFFFFF)通常用于存放程序代码支持非对齐访问和缓存优化。在V2M-MPS2上这部分映射了ZBT SRAM和Block RAM。SRAM区域(0x20000000-0x3FFFFFFF)用于数据存储支持位带操作。开发板在此区域配置了额外的ZBT SRAM和PSRAM。外设区域(0x40000000-0x5FFFFFFF)包含APB和AHB总线上的各类外设支持位带操作。外部RAM区域(0x60000000-0x9FFFFFFF)可用于扩展大容量存储器。外部设备区域(0xA0000000-0xDFFFFFFF)用于连接外部并行设备。系统区域(0xE0000000-0xFFFFFFFF)包含内核外设如NVIC、SysTick等。1.2 V2M-MPS2开发板硬件组成V2M-MPS2开发板是基于Cortex-M3的典型验证平台其核心硬件资源包括处理器子系统Cortex-M3内核搭配CMSDK(Cortex-M System Design Kit)提供的总线矩阵存储系统4MB ZBT同步SRAM(SSRAM164位总线)4MB ZBT同步SRAM(SSRAM2/332位总线)16MB PSRAM16KB FPGA内部Block RAM(用于启动)外设资源5个PL022 SPI控制器5个UART接口4组AHB GPIO以太网控制器(SMSC LAN9220)音频I2S接口VGA显示控制器触摸屏接口1.3 CMSDK系统设计套件CMSDK为Cortex-M系列处理器提供了标准化的系统组件包括AHB总线矩阵连接多个主设备(如CPU、DMA)和从设备APB桥接器将高速AHB总线转换为低速APB总线标准外设IP如定时器、UART、GPIO等系统控制模块提供复位控制、时钟管理等功能在V2M-MPS2上CMSDK组件占据了0x40000000-0x4001FFFF地址空间而板载扩展外设则安排在相邻区域保持了软件兼容性。2. 内存映射详解与配置实践2.1 系统内存映射表解析V2M-MPS2的完整内存映射如下表所示起始地址结束地址描述总线类型备注0x000000000x00003FFFBlock RAM或ZBT SRAM1AHB由zbt_boot_ctrl信号选择0x000040000x003FFFFFZBT SRAM1(64位)AHB4MB可用空间0x004000000x007FFFFFZBT SRAM1(镜像)AHB未使用0x200000000x207FFFFFZBT SRAM23(32位)AHB4MB可用地址交错0x210000000x21FFFFFFPSRAM(16MB)AHB16位总线0x400000000x4000FFFFCMSDK APB子系统APB定时器、UART等标准外设0x400100000x40013FFFAHB GPIOAHB4组GPIO控制器0x4001F0000x4001FFFFCMSDK系统控制寄存器APB复位控制、电源管理等0x400200000x40027FFFSPI控制器APB5个PL022模块0x400280000x40028FFFFPGA系统控制APBLED、按钮等板级控制0x402000000x402FFFFF以太网控制器AHBSMSC LAN92200x410000000x4100FFFFVGA控制台AHB文本显示缓冲区0x411000000x4113FFFFVGA图像区域AHB512x128像素4bpp2.2 启动存储器配置开发板提供了灵活的启动配置选项Block RAM启动模式默认映射到0x00000000-0x00003FFF包含初始引导代码可通过CMSDK系统控制器的REMAP寄存器修改映射ZBT SRAM启动模式通过MCC(Motherboard Configuration Controller)的zbt_boot_ctrl信号选择将ZBT SRAM1映射到0x00000000适合运行大型应用程序配置示例代码// 切换到ZBT SRAM启动模式 #define SYSCON_BASE 0x4001F000 typedef struct { volatile uint32_t REMAP; volatile uint32_t PMUCTRL; volatile uint32_t RESETOP; volatile uint32_t reserved; volatile uint32_t RSTINFO; } CMSDK_SYSCON_TypeDef; CMSDK_SYSCON_TypeDef *syscon (CMSDK_SYSCON_TypeDef *)SYSCON_BASE; syscon-REMAP 0; // 禁用Block RAM重映射2.3 ZBT同步SRAM配置ZBT(Zero Bus Turnaround) SRAM是一种高性能同步静态存储器具有无等待状态总线的特点。V2M-MPS2上有三种ZBT SRAM配置SSRAM1(64位总线)实际容量4MB(2片2MB×32的SRAM并联)地址范围0x00004000-0x003FFFFF支持启动时重映射到0x00000000SSRAM2 SSRAM3(32位总线)采用地址交错访问方式奇数字地址访问SSRAM3偶数字地址访问SSRAM2示例访问代码// 32位数据写入交错SRAM #define SSRAM23_BASE 0x20000000 volatile uint32_t *ssram23 (volatile uint32_t *)SSRAM23_BASE; // 写入SSRAM2(偶数地址) ssram23[0] 0x12345678; // 写入SSRAM3(奇数地址) ssram23[1] 0x9ABCDEF0;2.4 PSRAM扩展存储PSRAM(Pseudo SRAM)结合了DRAM的高密度和SRAM的易用性16MB容量16位数据总线地址范围0x21000000-0x21FFFFFF适合运行uClinux等大型系统访问速度较ZBT SRAM慢需注意时序配置工程经验在同时使用多种存储器的系统中应将性能敏感的代码和数据放在ZBT SRAM中而将大容量数据存放在PSRAM。可以使用编译器的section特性指定变量和函数的存放位置。3. 外设子系统详解3.1 CMSDK APB外设标准APB外设位于0x40000000-0x4000FFFF包括地址范围外设描述0x40000000-0x40000FFFTimer032位通用定时器0x40001000-0x40001FFFTimer1第二个32位定时器0x40002000-0x40002FFFDual Timer双通道定时器0x40004000-0x40004FFFUART0第一个串口0x40005000-0x40005FFFUART1第二个串口0x40006000-0x40006FFFUART2第三个串口0x40007000-0x40007FFFUART3第四个串口0x40008000-0x40008FFFWatchdog看门狗定时器UART初始化示例#define UART0_BASE 0x40004000 typedef struct { volatile uint32_t DATA; volatile uint32_t STATE; volatile uint32_t CTRL; volatile uint32_t INTSTATUS; volatile uint32_t BAUDDIV; } CMSDK_UART_TypeDef; void uart_init(CMSDK_UART_TypeDef *uart, uint32_t baudrate) { uart-CTRL 0; // 先禁用UART uart-BAUDDIV (25000000 / baudrate) - 1; uart-CTRL (1 0) | // 使能UART (1 2); // 使能发送 }3.2 AHB GPIO控制器V2M-MPS2扩展了4组AHB GPIO每组提供32位I/O地址分配GPIO0: 0x40010000-0x40010FFFGPIO1: 0x40011000-0x40011FFFGPIO2: 0x40012000-0x40012FFFGPIO3: 0x40013000-0x40013FFF关键寄存器DATAOUT: 数据输出寄存器DATAIN: 数据输入寄存器DIRECTION: 方向控制(1输出,0输入)INTR_MASK: 中断掩码ALTFUNCSET: 复用功能选择GPIO配置示例#define GPIO0_BASE 0x40010000 typedef struct { volatile uint32_t DATAOUT; volatile uint32_t DATAIN; volatile uint32_t DIRECTION; volatile uint32_t INTR_MASK; volatile uint32_t ALTFUNCSET; } CMSDK_GPIO_TypeDef; void gpio_init(void) { CMSDK_GPIO_TypeDef *gpio0 (CMSDK_GPIO_TypeDef *)GPIO0_BASE; // 设置GPIO0[3:0]为输出其余为输入 gpio0-DIRECTION 0x0000000F; // 开启GPIO0[7:4]的中断 gpio0-INTR_MASK 0x000000F0; // 设置GPIO0[5]为SPI3_SCK复用功能 gpio0-ALTFUNCSET (1 5); }3.3 SPI控制器配置开发板包含5个PL022 SPI控制器SPI0通用SPI接口(连接J21)SPI1LCD模块控制SPI2外部ADC接口SPI3Shield0接口SPI4Shield1接口关键配置参数时钟极性和相位(CPOL/CPHA)主从模式选择数据帧大小(4-16位)时钟分频系数SPI初始化代码#define SPI0_BASE 0x40020000 typedef struct { volatile uint32_t CR0; volatile uint32_t CR1; volatile uint32_t DR; volatile uint32_t SR; volatile uint32_t CPSR; volatile uint32_t IMSC; volatile uint32_t RIS; volatile uint32_t MIS; volatile uint32_t ICR; volatile uint32_t DMACR; } PL022_SPI_TypeDef; void spi_init(PL022_SPI_TypeDef *spi) { // 禁用SPI spi-CR1 0; // 配置控制寄存器 spi-CR0 (0x7 0) | // 8位数据帧 (0x0 6) | // CPOL0 (0x0 7) | // CPHA0 (0x1 8); // 主模式 // 设置预分频器(250MHz / 4 62.5MHz) spi-CPSR 4; // 使能SPI spi-CR1 (1 1); // 主模式使能 }3.4 以太网控制器SMSC LAN9220通过AHB-to-External Memory接口连接地址范围0x40200000-0x402FFFFF关键寄存器0x40200000-0x402000FE控制状态寄存器(CSR)0x40200100-0x402001FE数据FIFO以太网初始化流程复位PHY配置MAC地址设置接收/发送描述符启用中断启动传输调试技巧在以太网调试时建议先使用回环模式验证基本功能。通过设置控制寄存器的LOOPBACK位可以无需外部连接即可测试数据收发。4. 时钟与中断系统4.1 系统时钟树V2M-MPS2的时钟系统由多个源时钟和派生时钟组成时钟名称频率源时钟分频系数SYSCLK25MHzOSCCLK[0]2AUDMCLK12.29MHzOSCCLK[1]2AUDSCLK3.07MHzOSCCLK[1]8DBGCLK25MHzOSCCLK[0]2SPICLCD25MHzOSCCLK[0]2时钟配置注意事项所有时钟在出厂时已优化不建议修改频率音频相关外设应使用AUDMCLK/AUDSCLK高速外设(如以太网)使用SYSCLK4.2 中断分配与配置Cortex-M3的NVIC支持多达240个中断V2M-MPS2的中断分配如下中断号外设描述0UART0 RX串口0接收中断6GPIO0GPIO0组合中断11SPI0/1SPI控制器中断13Ethernet以太网中断14Audio I2S音频接口中断16GPIO2GPIO2组合中断23SPI3/4Shield SPI中断中断优先级配置示例#include core_cm3.h void nvic_init(void) { // 设置UART0接收中断优先级为2 NVIC_SetPriority(UART0_IRQn, 2); // 设置以太网中断优先级为1 NVIC_SetPriority(ETH_IRQn, 1); // 使能UART0和以太网中断 NVIC_EnableIRQ(UART0_IRQn); NVIC_EnableIRQ(ETH_IRQn); } void UART0_IRQHandler(void) { // 处理UART0中断 // ... }4.3 电源管理单元CMSDK系统控制器提供基本的电源管理功能PMUCTRL寄存器(0x4001F004)Bit 01启用PMU0禁用PMURESETOP寄存器(0x4001F008)Bit 01系统锁定时产生复位RSTINFO寄存器(0x4001F010)Bit 01由SYSRESETREQ引起的复位Bit 11看门狗复位Bit 21处理器锁定复位低功耗模式进入流程配置外设进入低功耗状态设置PMUCTRL使能电源管理执行WFI(Wait For Interrupt)指令中断唤醒后恢复外设状态5. 高级功能与扩展接口5.1 VGA显示控制V2M-MPS2提供两种VGA显示接口文本控制台地址0x41000000-0x4100FFFF每个字符占用2字节(ASCII属性)支持标准ANSI控制码图形缓冲区地址0x41100000-0x4113FFFF512x128分辨率4位每像素(0x00000RGB格式)像素位置计算uint32_t *vga_buffer (uint32_t *)0x41100000; int x 100, y 50; // 像素坐标 vga_buffer[y * 0x400 x] 0x00000F00; // 红色像素5.2 音频I2S接口音频子系统关键特性支持I2S输入/输出32位FIFO缓冲区可编程中断水位采样率通过LRCLK分频器配置音频初始化代码#define I2S_BASE 0x40024000 typedef struct { volatile uint32_t CONTROL; volatile uint32_t STATUS; volatile uint32_t ERROR; volatile uint32_t DIVIDE; volatile uint32_t TXBUF; volatile uint32_t RXBUF; } I2S_TypeDef; void i2s_init(I2S_TypeDef *i2s) { // 禁用I2S接口 i2s-CONTROL 0; // 设置采样率(12.288MHz / (128 * 2) 48kHz) i2s-DIVIDE 128; // 配置FIFO中断水位 i2s-CONTROL (2 8) | // TX水位 (2 12) | // RX水位 (1 0); // 使能TX }5.3 Shield扩展接口V2M-MPS2通过V2C-SHIELD扩展板支持两种外设shieldShield0SPI3SCK(EXP11)、SS(EXP12)、MOSI(EXP13)、MISO(EXP14)UART3RXD(EXP0)、TXD(EXP4)I2C2SCL(EXP5)、SDA(EXP15)Shield1SPI4SCK(EXP44)、SS(EXP38)、MOSI(EXP39)、MISO(EXP40)UART4RXD(EXP26)、TXD(EXP30)I2C3SCL(EXP31)、SDA(EXP41)硬件设计提示在使用shield接口时需要注意GPIO的复用功能配置。通过ALTFUNCSET寄存器选择正确的功能模式并确保相关时钟已使能。5.4 SCC系统配置控制器SCC(Serial Communication Controller)提供与板载MCC的通信接口关键寄存器CFG_REG0控制Block RAM重映射CFG_REG1控制MCC LED状态CFG_REG3读取MCC开关状态SYS_CFGCTRL启动配置操作SCC访问示例#define SCC_BASE 0x4002F000 typedef struct { volatile uint32_t CFG_REG0; volatile uint32_t CFG_REG1; // ...其他寄存器 volatile uint32_t SYS_CFGCTRL; volatile uint32_t SYS_CFGSTAT; } SCC_TypeDef; void scc_init(void) { SCC_TypeDef *scc (SCC_TypeDef *)SCC_BASE; // 读取MCC开关状态 uint8_t switches scc-CFG_REG3 0xFF; // 设置MCC LED scc-CFG_REG1 (switches 0); // LED镜像开关状态 }6. 开发实践与调试技巧6.1 开发环境搭建推荐使用以下工具链进行开发编译器ARM Compiler 6 (armclang)GCC for ARM Embedded调试器ULINKproJ-LinkIDEKeil MDKIAR Embedded WorkbenchVSCode Cortex-Debug工程配置要点正确设置分散加载文件(Scatter File)匹配硬件内存映射优化编译选项特别是针对Cortex-M3的Thumb-2指令集启用适当的调试信息级别6.2 常见问题排查启动失败检查zbt_boot_ctrl信号状态验证REMAP寄存器配置确认Block RAM或ZBT SRAM中的启动代码有效外设不响应确认外设时钟已使能检查地址映射是否正确验证总线矩阵的访问权限中断不触发检查NVIC中的中断使能位确认外设本身的中断生成已启用验证中断优先级设置以太网通信异常检查PHY初始化序列验证MAC地址配置确认时钟和复位信号稳定6.3 性能优化建议存储器优化将频繁访问的数据放在ZBT SRAM中使用DMA减少CPU开销启用缓存(如果可用)中断优化合理设置中断优先级缩短中断服务程序执行时间使用中断嵌套谨慎电源管理合理使用WFI/WFE指令动态关闭未使用外设的时钟利用PMU进行电压调节经验分享在调试复杂系统时建议先验证各个子系统的基本功能再逐步集成。使用FPGA系统控制器的计数器(0x40028018)可以方便地进行性能测量和时序分析。

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

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

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…