QSPI、OSPI与FSMC的区别与内存映射分析

基本概念与区别

1. FSMC (灵活静态存储控制器)

  • 接口类型:并行接口,通常8/16位数据总线
  • 总线标准:传统并行总线协议
  • 速度:相对较低,通常最高约100MHz
  • 应用场景:SRAM、NOR Flash、PSRAM、LCD等并行接口外设

2. QSPI (四线串行外设接口)

  • 接口类型:串行接口,1/2/4线数据传输
  • 总线标准:SPI协议的扩展
  • 速度:中等,通常最高约108MHz,有效带宽达到50MBytes/s (4线x108MHz/8位)
  • 应用场景:Serial NOR Flash、EEPROM等

3. OSPI (八线串行外设接口)

  • 接口类型:串行接口,1/2/4/8线数据传输
  • 总线标准:QSPI的扩展,兼容QSPI
  • 速度:较高,通常最高约200MHz,有效带宽可达到200MBytes/s (8线x200MHz/8位)
  • 应用场景:高速Serial NOR Flash、Hyperflash、Hyper RAM

内存映射功能对比

FSMC内存映射

  • 直接映射:FSMC直接将外部存储设备映射到CPU的地址空间
  • 访问方式:CPU直接通过地址访问,无需专用命令
  • 优势:实现简单,无需特殊初始化序列
  • 延迟:相对较低,通常1-2个时钟周期
  • 地址范围:STM32上通常映射到0x6000 0000 - 0x6FFF FFFF

QSPI内存映射

  • 间接映射:通过QSPI控制器将闪存内容映射到系统地址空间
  • 访问流程
    1. 控制器发送特定命令(通常是0x0B/0xEB)
    2. 发送地址
    3. 插入可选的虚拟周期
    4. 连续读取数据
  • 映射机制:QSPI控制器自动处理命令序列
  • 地址范围:典型映射到0x9000 0000 - 0x9FFF FFFF

OSPI内存映射

  • 增强型映射:支持QSPI的所有功能,并增加了8线模式支持
  • 访问流程:与QSPI相似,但可以使用8线传输
  • 高级特性
    1. 支持更复杂的命令序列
    2. 双闪存同时访问(STM32H7系列)
    3. 内存映射期间支持XIP缓存
  • 地址范围:类似QSPI,但可能有所扩展

XIP (执行时位置)实现方式

FSMC-XIP实现

// FSMC配置NOR Flash映射
void FSMC_NOR_Init(void) {FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure;FSMC_NORSRAMTimingInitTypeDef p;// 配置基本时序p.FSMC_AddressSetupTime = 0x06;p.FSMC_AddressHoldTime = 0x00;p.FSMC_DataSetupTime = 0x0B;// ...其他时序配置// 配置NOR控制器FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1;FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_NOR;FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;// ...其他控制器配置FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE);// 映射后可直接访问和执行,无需额外步骤
}// 代码执行示例
typedef void (*pFunction)(void);
pFunction Jump_To_Application;
void ExecuteFromNOR(void) {// 直接跳转到NOR Flash中的代码Jump_To_Application = (pFunction)(0x60000000 + 0x1000); // 示例地址Jump_To_Application();
}

QSPI-XIP实现

// QSPI内存映射模式配置
void QSPI_MemoryMapped_Init(void) {QSPI_CommandTypeDef s_command;QSPI_MemoryMappedTypeDef s_mem_mapped_cfg;// 配置读取命令s_command.InstructionMode = QSPI_INSTRUCTION_1_LINE;s_command.Instruction = QUAD_INOUT_FAST_READ_CMD; // 通常是0xEBs_command.AddressMode = QSPI_ADDRESS_4_LINES;s_command.AddressSize = QSPI_ADDRESS_24_BITS;s_command.DataMode = QSPI_DATA_4_LINES;// ...其他命令配置// 配置内存映射参数s_mem_mapped_cfg.TimeOutActivation = QSPI_TIMEOUT_COUNTER_DISABLE;// 启用内存映射模式HAL_QSPI_MemoryMapped(&hqspi, &s_command, &s_mem_mapped_cfg);// 此时Flash已映射到地址空间,可以执行代码
}// 代码执行示例
typedef void (*pFunction)(void);
pFunction Jump_To_Application;
void ExecuteFromQSPI(void) {// 使能Cache以提高XIP性能SCB_EnableICache();SCB_EnableDCache();// 跳转到QSPI映射区域的代码Jump_To_Application = (pFunction)(0x90000000 + 0x1000); // 示例地址Jump_To_Application();
}

OSPI-XIP实现

// OSPI内存映射模式配置 (STM32H7系列示例)
void OSPI_MemoryMapped_Init(void) {OSPI_RegularCmdTypeDef sCommand;OSPI_MemoryMappedTypeDef sMemMappedCfg;// 配置读取命令 (8线模式)sCommand.OperationType = HAL_OSPI_OPTYPE_READ_CFG;sCommand.FlashId = HAL_OSPI_FLASH_ID_1;sCommand.Instruction = OCTO_READ_CMD; // 例如0x8B/0xECsCommand.InstructionMode = HAL_OSPI_INSTRUCTION_8_LINES;sCommand.InstructionSize = HAL_OSPI_INSTRUCTION_8_BITS;sCommand.AddressMode = HAL_OSPI_ADDRESS_8_LINES;sCommand.AddressSize = HAL_OSPI_ADDRESS_32_BITS;sCommand.DataMode = HAL_OSPI_DATA_8_LINES;// ...其他命令配置// 配置内存映射参数sMemMappedCfg.TimeOutActivation = HAL_OSPI_TIMEOUT_COUNTER_DISABLE;// 启用OSPI内存映射模式HAL_OSPI_MemoryMapped(&hospi, &sCommand, &sMemMappedCfg);// 此时可以直接执行映射区域的代码
}// 代码执行示例
typedef void (*pFunction)(void);
pFunction Jump_To_Application;
void ExecuteFromOSPI(void) {// 使能Cache以提高XIP性能SCB_EnableICache();SCB_EnableDCache();// 跳转到OSPI映射区域的代码Jump_To_Application = (pFunction)(0x90000000 + 0x1000); // 示例地址Jump_To_Application();
}

性能与应用对比

XIP性能对比

  1. 访问延迟

    • FSMC: 低延迟,但总体带宽受限
    • QSPI: 首次访问延迟高,但连续读取性能好
    • OSPI: 首次访问延迟较高,但连续读取性能最佳
  2. 缓存影响

    • 三种接口都受益于CPU缓存
    • 对于QSPI/OSPI,缓存几乎是必需的
    • STM32H7还为QSPI/OSPI提供了专用的ART加速器
  3. 代码执行速度

    • FSMC: ~15-30MB/s
    • QSPI: ~30-50MB/s
    • OSPI: ~80-200MB/s

适用场景

  • FSMC:

    • 需要兼容旧设备
    • 需要简单直接的访问方式
    • 接口引脚数量不受限
  • QSPI:

    • 需要节省PCB空间(较少引脚)
    • 中等执行性能要求
    • 大多数现代系统选择
  • OSPI:

    • 高性能应用
    • 运行复杂应用程序
    • 需要支持大容量闪存

总结

FSMC、QSPI和OSPI代表了嵌入式系统外部存储接口的发展历程:从并行到串行,从单线到多线。在内存映射和XIP方面,三种接口都支持,但实现复杂度和性能各不相同。对于现代STM32应用,QSPI和OSPI因其更好的性能/空间比和灵活性而成为更流行的选择,特别是对于需要执行复杂代码的应用程序。

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

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

相关文章

系统思考与心智模式探索

成长的真正障碍,不是能力的不足,而是看待问题的局限。 在复杂多变的商业环境中,我们往往习惯于解决“眼前”的问题,却忽视了深藏背后的系统性障碍。我们看到的只是表面的“症状”,而真正的根源,却往往隐藏…

物联网技术的关键技术与区块链发展趋势的深度融合分析

一、物联网技术的核心架构与关键技术 物联网技术体系由感知层、网络层、平台层、应用层和安全层构成,各层技术协同工作,实现物理世界与数字世界的深度融合。 感知层:物联网的“感官” 传感器技术:包括环境传感器(温度…

针对Exhcnage Server的攻击防范措施

一、背景介绍最近,安全研究人员揭露了一个名为 NightEagle(又名 APT-Q-95) 的高级持续性威胁(APT)组织。这个组织被观察到利用 Microsoft Exchange 服务器中的零日漏洞链 进行攻击,其主要目标是中国政府、国…

编程基础:继承

能帮到你的话,就给个赞吧 😘 文章目录继承:使用基类成员:前提——派生类必须同样支持基类成员(组件和功能)示例:动物Animal 有 鳃 和 会飞。则 鸟Bird 不是 Animal,因为Bird虽会飞,却没有鳃。鱼…

TMC4361A 使用(未验证)

prompt 我用STM32F103C8T6 来控制 TMC4361A 运动控制芯片 ,我配置 STM32F103C8T6 的 SPI1 与 TMC4361A 进行通信,配置 PA4 作为片选线,配置 PA8 作为 RCC_MCO 输入时钟输入到 TMC4361A, 并将其连接到TMC4361A的CLK_EXT引脚。我想控制 TMC4361…

深度剖析:如何解决Node.js中mysqld_stmt_execute参数错误

在Node.js后端开发中,使用mysql2等数据库驱动与MySQL/MariaDB交互时,Incorrect arguments to mysqld_stmt_execute 是一个令人头疼的错误。它通常意味着你传递给SQL预处理语句的参数数量与SQL字符串中问号(?)占位符的数量不匹配。…

Vue3 学习教程,从入门到精通,Vue 3 安装指南及语法知识点详解(2)

Vue 3 安装指南及语法知识点详解 本文将详细介绍 Vue 3 的所有安装方式,并深入讲解 Vue 3 的语法知识点。此外,还将提供一些综合性案例,展示如何综合运用 Vue 3 的各项功能。一、安装 Vue 3 的所有方式 Vue 3 提供了多种安装方式,…

C++基础复习笔记

一、数组定义 在C中,数组初始化有多种方式,以下是常见的几种方法: 默认初始化 数组元素未显式初始化时,内置类型(如int、float)的元素值未定义(垃圾值),类类型调用默认构…

手机和PC远控安全深度测评:TeamViewer/ToDesk/向日葵安全防线对比

声明:本测试报告系作者基于个人兴趣及使用场景开展的非专业测评,测试过程中所涉及的方法、数据及结论均为个人观点,不代表任何官方立场或行业标准。 一、引言 当下远程控制技术已深度融入大众的工作与生活,无论是上班族在家操…

Windows 11的开始菜单调整为左下角布局

1.桌面右键个性化 2.个性化中任务栏 3.任务栏选择任务栏行为 4.任务栏行为中 任务栏对齐方式选择靠左即可

Go语言项目工程化 — 常见开发工具与 CI/CD 支持

在Go语言的项目工程化实践中,常见开发工具与 CI/CD 支持是保障团队协作、高效交付与项目质量的关键。以下是第 68 章的详细内容。一、开发辅助工具Go语言生态为开发者提供了丰富的工具,以提高代码质量与开发效率。1. 格式化与静态检查工具说明gofmt标准格…

OpenCV人脸分析------绘制面部关键点函数drawFacemarks()

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 该函数用于在图像上绘制面部关键点(facial landmarks),例如使用 FacemarkLBF, FacemarkKazemi 等算法检测到的…

Linux内核ext4 extent:解决大文件存储难题的关键

在Linux 操作系统的庞大生态中,文件系统犹如一座城市的基础设施,支撑着数据的有序存储与高效访问。而 ext4 文件系统,作为 Linux 文件系统家族中的重要一员,自诞生起便凭借诸多先进特性备受瞩目。其中,extent 机制堪称…

reactnative页面适配UI设计尺寸px转dp的完美解决方案px2dp精要篇

你的 px2dp 函数基本思路是正确的,但可以进一步优化以确保更精确的适配。以下是改进后的完美精确方案: 完美精确的适配方案 import { Dimensions, PixelRatio, Platform, ScaledSize } from react-native;// 获取屏幕尺寸(考虑横竖屏&#…

【世纪龙科技】汽车钣金虚拟仿真教学实训软件

在汽车后市场人才紧缺的当下,职业院校汽车钣金教学却长期面临“三难困境”:实训设备昂贵且损耗快、学生实操机会稀缺、教学评价依赖主观经验。江苏世纪龙科技公司以十余年汽车教育数字化积淀为基石,推出《汽车钣金教学软件》,通过…

Fiddler中文版抓包工具在后端API调试与Mock中的巧用

在现代开发中,前后端往往分属不同小组甚至不同公司,接口联调变得至关重要。尤其是在多团队合作、后端接口尚未完成或频繁变动的项目中,前端开发进度容易被阻碍。此时,通过灵活运用 Fiddler抓包工具,前端可以在后端接口…

基于 Flask框架开发的轻量级招聘网站

简单的招聘网站示例 这是一个基于 Flask 框架开发的轻量级招聘网站示例,采用 Jinja2 模板引擎和 Bootstrap 前端框架,模仿 拉勾网 风格,实现了招聘平台的核心功能。系统支持 个人用户 和 企业用户 两种角色,个人用户可以浏览职位、…

2025 年使用大模型进行软件工程:现实检验

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

如何使用单例模式保证全局唯一实例(复杂版本)

/// <summary> /// 登录管理类&#xff08;单例模式&#xff09;&#xff0c;负责用户登录、注销及用户信息管理 /// </summary> public class LoginMananger {// 用于线程同步的锁对象static object _lockObj new object();// 单例实例&#xff08;延迟初始化&am…

瑞斯拜考研词汇课笔记

学习视频链接&#xff1a;瑞斯拜考研词汇系统课-外刊50篇- 第一讲_哔哩哔哩_bilibili Text 1 1.气候危机让普通人经历了额外六周的高温天气。 The climate crisis caused the average person to experience six extra weeks of hot days. 2.碳排放是全球变暖的重要原因之一。 C…