TI DRA7xx GPMC异步时序配置实战:从手册到驱动的NOR/NAND Flash连接指南

发布时间:2026/7/15 13:20:15

TI DRA7xx GPMC异步时序配置实战:从手册到驱动的NOR/NAND Flash连接指南 1. 项目概述与核心价值在嵌入式系统开发中尤其是基于TI DRA7xx系列这类高性能处理器的设计中外部存储器的扩展能力往往是决定系统功能上限的关键。无论是用于存储启动代码的NOR Flash还是存放大量应用数据的NAND Flash它们与主处理器之间的通信桥梁——通用存储器控制器GPMC其配置的精细程度直接决定了系统的启动速度、数据吞吐率和整体稳定性。然而翻阅动辄数千页的技术参考手册TRM面对密密麻麻的时序参数表和波形图很多工程师都会感到无从下手这些参数究竟是什么意思它们之间如何相互影响又该如何根据我手头的Flash芯片型号将这些抽象的时序数字转化为具体的寄存器配置值这正是本文要解决的核心问题。我们不打算泛泛而谈GPMC的架构而是聚焦于最常用也最考验功底的异步时序模式特别是与NOR Flash和NAND Flash的连接。我将结合自己多年在工业控制和汽车电子领域的实战经验带你穿透手册中复杂的公式和缩写直击时序配置的本质。你会看到那些看似枯燥的tacc(DAT)、tw(nCSV)参数实际上是如何在硬件信号线上演变成精确的脉冲与延时从而确保每一个数据位都能被准确无误地读写。更重要的是我将分享从原理图设计、时序计算到Linux内核驱动配置的一整套“避坑”指南这些都是在实际项目中用时间和调试成本换来的宝贵经验。无论你是正在评估处理器选型、进行硬件原理图设计还是深陷驱动调试泥潭的嵌入式软件工程师这篇文章都将为你提供一份可直接参考的“地图”。2. GPMC异步接口核心原理与设计思路2.1 为什么需要异步时序在深入参数之前我们必须理解GPMC提供异步模式的根本原因。同步接口如同步突发读写依赖一个公共的时钟信号来同步所有操作速度高但时序关系简单。而异步接口则没有这个共享时钟它完全依靠一组预先定义好的、基于因果关系的时序规则来工作比如“片选信号有效后至少需要等待T1时间地址信号才会稳定再等待T2时间才能发出读使能信号”。这种模式的优势在于极强的兼容性。市面上成千上万种不同工艺、不同速度等级的NOR/NAND Flash芯片其数据手册中定义的读写周期、建立保持时间等参数都是以异步时序的形式给出的。GPMC的异步模式本质上就是通过一套高度可配置的时序引擎去主动“适配”这些外部存储器的原生时序要求。处理器内部有一个功能时钟GPMC_FCLK所有时序参数的计算都以其周期为基准单位通过配置一系列的时间参数如CSOnTime,OEOffTime等GPMC硬件会自动生成满足Flash芯片要求的、精确到纳秒级的控制信号波形。2.2 关键信号线角色解析要读懂时序图必须先认识舞台上的“演员”——各个信号线。根据你提供的资料我们以16位非复用模式为例地址与数据总线gpmc_a[27:1] 地址总线。为什么从1开始通常A0地址线被省略通过字节使能信号gpmc_ben[1:0]来实现半字16位访问的地址对齐。gpmc_ad[15:0] 双向数据总线。在非复用模式下它只传输数据。在复用模式下它会先传输地址再传输数据以节省引脚。控制信号线核心gpmc_cs[7:0] 片选信号。每个片选可以连接一个独立的存储设备或区域你提供的时序图中i的取值范围是0到7。gpmc_oen_ren 输出使能/读使能信号。低电平有效通知Flash芯片将数据放到数据总线上。gpmc_wen 写使能信号。低电平有效通知Flash芯片锁存数据总线上的数据。gpmc_advn_ale 地址有效/地址锁存使能信号。这是一个多功能引脚。在NOR Flash的非复用模式下它作为地址有效ADVn信号指示地址总线上的地址何时有效。在NOR/NAND Flash的复用模式或NAND Flash接口下它作为地址锁存使能ALE信号用于在地址/数据复用的总线上锁存地址。gpmc_ben[1:0] 字节使能信号。在16位模式下BEN0对应数据低字节AD[7:0]BEN1对应数据高字节AD[15:8]。在8位模式下通常固定有效。gpmc_wait[1:0] 等待信号。由Flash设备拉低通知GPMC当前操作未完成需要插入等待周期。这是实现与低速存储器无缝对接的关键。内部信号GPMC_FCLK 功能时钟。这是所有时序计算的“心跳”但它是一个内部时钟不会输出到芯片引脚。DIR 数据方向控制信号。同样是一个内部信号用于控制数据总线的方向输入/输出在时序图中帮助我们理解数据流的方向。2.3 时序参数分类要求与特性你提供的资料中的表7-29和表7-30是理解异步NOR接口的钥匙。它们被分为两大类Timing Requirements时序要求 这是GPMC作为“接收方”对外部Flash芯片提出的要求。主要是针对读操作时Flash芯片输出的数据(gpmc_ad[15:0])相对于GPMC控制信号如gpmc_oen_ren的时序关系。例如tsu(DV-OEH) 读数据有效建立时间。在gpmc_oen_ren变为高电平读使能结束之前数据总线上的数据必须已经稳定至少1.9纳秒。th(OEH-DV) 读数据有效保持时间。在gpmc_oen_ren变为高电平之后数据总线上的数据还必须继续保持稳定至少1纳秒。tacc(DAT)最重要的参数之一数据最大访问时间。它定义了从读周期开始通常以片选有效或地址有效为起点到GPMC内部采样到有效数据所需要的GPMC_FCLK周期数。这个值H直接决定了我们需要配置的AccessTime寄存器字段。Switching Characteristics开关特性 这是GPMC作为“发送方”输出的信号所具备的时序特性。它定义了GPMC输出的控制信号如gpmc_cs,gpmc_wen和地址/数据信号之间的相对时间关系。例如tw(nCSV) 片选信号有效低电平的脉冲宽度。这个时间A必须大于等于Flash芯片数据手册要求的tCE片选到输出有效时间。td(nCSV-nWEV) 从片选有效到写使能有效的延迟时间。这个时间E需要满足Flash芯片对tCS片选建立到写使能时间的要求。td(nWEV-DV) 从写使能有效到数据总线有效的延迟时间。这个时间必须足够小以确保在写使能结束前数据已经稳定在总线上满足Flash芯片的tDS数据建立时间要求。设计思路的核心就在于用GPMC的Switching Characteristics去满足外部Flash芯片的Timing Requirements同时确保GPMC对Flash芯片的Timing Requirements主要是tacc被正确配置到GPMC的AccessTime等参数中。这是一个双向匹配的过程。3. 核心时序参数深度解析与配置计算3.1 从公式到寄存器参数映射关系手册中的公式是连接理论时序和实际配置的桥梁。我们以NOR Flash异步读单字图7-13为例拆解几个最关键参数的计算。1. 数据访问时间tacc(DAT)(参数 FA5)公式H AccessTime * (TimeParaGranularity 1)AccessTime 这是我们需要配置到GPMC_CONFIGx寄存器中ACCESS_TIME字段的值。它表示以TimeParaGranularity单位的访问时间。TimeParaGranularity 时间参数粒度。这是一个全局配置位于GPMC_CONFIG1_N寄存器的GPMCTIMEPARAGRANULARITY位。它可以是0表示粒度是1个GPMC_FCLK周期或1表示粒度是2个GPMC_FCLK周期。选择粒度1可以配置更长的等待周期适用于速度很慢的存储器。H 最终计算出的、以GPMC_FCLK周期数表示的访问时间。计算实例假设我们使用的一款NOR Flash芯片其读周期时间tACC从地址有效到数据输出最大为70ns。GPMC_FCLK频率为100MHz周期10ns。首先H ceil(70ns / 10ns) 7个时钟周期。如果我们设置TimeParaGranularity 0则AccessTime H 7。如果我们设置TimeParaGranularity 1粒度变为20ns则H AccessTime * 2所以AccessTime ceil(7 / 2) 4。此时实际的硬件等待时间是4 * 20ns 80ns满足要求。2. 片选有效时间tw(nCSV)(参数 FA1)公式以单读为例A (CSRdOffTime - CSOnTime) * (TimeParaGranularity 1) * GPMC_FCLKCSOnTime 片选有效时间偏移起始点。配置在GPMC_CONFIGx寄存器。CSRdOffTime 读操作时片选无效时间偏移结束点。配置在GPMC_CONFIGx寄存器。片选有效脉冲宽度 (CSRdOffTime - CSOnTime)个时间粒度。配置要点CSOnTime通常设为0表示片选在周期开始时有效。CSRdOffTime则需要根据总读周期长度来设置。读周期总时间至少是tacc(DAT)加上一些控制信号的前后沿时间。通常CSRdOffTime会设置为大于AccessTime的值以确保在整个数据读取期间片选都保持有效。3. 输出使能有效时间td(nCSV-nOEV)(参数 FA13)公式L ((OEOnTime - CSOnTime) * (TimeParaGranularity 1) 0.5 * (OEExtraDelay - CSExtraDelay)) * GPMC_FCLKOEOnTime 输出使能有效时间偏移。OEExtraDelay,CSExtraDelay 这是**虚拟时序Virtual IO Timings或手动时序Manual IO Timings**配置相关的额外延迟调整。你提供的资料末尾的表7-33和注释部分特别强调了这一点。对于某些高速或高精度要求的模式必须通过配置Pad Control Register中的DELAYMODE字段来启用虚拟延迟模式以补偿IO引脚上的延迟确保时序满足要求。重要提示手册中多处警告“The IO Timings provided in this section are only valid for some GPMC usage modes when the corresponding Virtual IO Timings or Manual IO Timings are configured”。这意味着如果你直接使用手册公式计算出的参数配置后时序不满足很可能是因为没有正确配置这些IO延迟模式。对于DRA7xx系列通常需要根据建议将相关引脚如数据、地址线的DELAYMODE设置为非零值如1,2,3,5,6等。3.2 页模式Page Mode访问的优化图7-15展示了NOR Flash页模式读的时序这是一种重要的性能优化手段。当连续访问同一“页”通常是某个地址范围内内的存储单元时Flash内部可以快速提供后续数据。tacc1-pgmode(DAT)(FA21) 页模式下第一个数据的最大访问时间。其计算方式与普通的tacc(DAT)相同H AccessTime * (TimeParaGranularity 1)使用同一个AccessTime寄存器值。tacc2-pgmode(DAT)(FA20) 页模式下后续连续数据的最大访问时间。公式为P PageBurstAccessTime * (TimeParaGranularity 1)。这个时间P通常远小于H。tw(AV)(FA20) 后续访问的地址有效脉冲宽度其值等于P。配置实践如果你的Flash支持页模式查看Flash数据手册的Page Mode Read或Burst Read部分在驱动中正确配置PageBurstAccessTime寄存器可以大幅提升连续读数据的吞吐量。例如首次访问需要100ns后续每次访问仅需20ns。3.3 NAND Flash接口时序的特殊性NAND Flash的接口时序图7-19至图7-22与NOR Flash有显著不同因为它需要通过命令、地址、数据周期来操作并且接口通常是复用的。命令锁存周期Command Latch 写使能(gpmc_wen)的下降沿锁存命令字通过gpmc_ad[7:0]此时gpmc_advn_ale作为ALE为低gpmc_ben[0]作为CLE为高。地址锁存周期Address Latch 写使能(gpmc_wen)的下降沿锁存地址通过gpmc_ad[7:0]此时gpmc_advn_ale作为ALE为高gpmc_ben[0]作为CLE为低。数据周期 读或写数据。其时序参数如GNF12对应tacc(DAT)的计算逻辑与NOR类似但需要配置在NAND专用的时序寄存器中如GPMC_CONFIG1_N和GPMC_CONFIG2_N其中N对应不同的片选和操作类型CS0,CS1,CS2,CS3,Command,Address,Data。关键区别NAND的时序配置通常分为好几组分别对应命令、地址、数据的读写。你需要根据Flash数据手册分别计算并设置CSOnTime、CSRdOffTime、WEOffTime等参数。Linux内核的omap2-nand.c驱动或后续的ti-qspi.c对于QSPI NAND等驱动中包含了针对不同型号NAND的典型时序配置结构体是极好的参考。4. 实战配置从数据手册到寄存器值理论最终要服务于实践。下面我们以一个具体的例子展示如何将Flash数据手册的参数转化为GPMC的寄存器配置。假设我们使用一款Spansion的16位NOR FlashS29GL064N并工作在异步读模式下。步骤1查阅Flash数据手册关键参数从S29GL064N的数据手册中我们提取出最关键的几个异步时序参数假设电压为3.3V在-40~85°C条件下tACC(地址有效到数据输出延迟) 最大90nstCE(片选有效到数据输出延迟) 最大90nstOE(输出使能有效到数据输出延迟) 最大35nstDF(输出使能无效到数据高阻态) 最小25nstOH(地址无效后数据保持时间) 最小0nstWP/tWH(写使能脉冲宽度/高电平时间) 最小35ns/最小30ns步骤2确定GPMC_FCLK频率假设我们的系统设计将GPMC_FCLK配置为100MHz周期T10ns。这是计算一切时间参数的基础。步骤3匹配时序并计算寄存器值我们需要确保GPMC产生的信号满足Flash的要求同时GPMC的采样时机也要匹配Flash的数据输出。计算AccessTime(对应tACC)Flash要求tACC 90nsGPMC采样时机tacc(DAT) H * T AccessTime * (Granularity1) * T为了留有余量我们按100ns设计。H ceil(100ns / 10ns) 10个周期。设置TimeParaGranularity 0则AccessTime 10。我们将这个值写入GPMC_CONFIGx_n寄存器x代表片选号的ACCESS_TIME字段。配置片选和输出使能时序Flash要求tOE 35ns。这意味着gpmc_oen_ren有效后最多35ns数据就有效了。但我们的AccessTime配置是100ns所以GPMC会在读周期开始100ns后才采样数据。因此gpmc_oen_ren的有效时间必须覆盖从它有效最快35ns后数据有效到GPMC采样点100ns这段时间。我们设定CSOnTime 0OEOnTime 1即片选有效后1个时钟周期输出使能有效。那么从读周期开始到OE有效的时间是1 * 10ns 10ns。从OE有效到GPMC采样点的时间是100ns - 10ns 90ns远大于Flash的tOE(35ns)满足要求。我们需要确保OE信号在采样点之后仍然保持有效一段时间吗通常不需要只要采样时刻数据稳定即可。但根据手册图7-13gpmc_oen_ren的无效时间(OEOffTime)可以晚于采样点。为了简单我们可以设置OEOffTime等于或略大于AccessTime。配置写时序Flash要求tWP 35ns,tWH 30ns。我们需要配置WEOnTime和WEOffTime。假设WEOnTime 2WEOffTime 6。则写使能脉冲宽度tw(nWEV) (WEOffTime - WEOnTime) * T (6-2)*10ns 40ns满足tWP35ns。还需要配置WrCycleTime写周期时间它必须大于tWP tWH 65ns我们可以设置为7个周期70ns。步骤4Linux内核设备树Device Tree配置示例上述计算出的参数最终需要写入处理器的寄存器。在Linux内核中通常通过设备树来配置。以下是一个简化的示例展示了如何将上述计算转化为设备树节点gpmc { status okay; pinctrl-names default; pinctrl-0 gpmc_pins; /* 需要正确配置引脚复用 */ /* 设置GPMC功能时钟父时钟通常为L3或L4时钟 */ gpmc,fclk-divider 1; /* GPMC_FCLK 父时钟 / (divider 1) */ gpmc,fclk-mhz 100; /* 指定期望的FCLK频率驱动可能会调整分频器 */ nor_flash0 { compatible cfi-flash; reg 0 0x01000000; /* CS0, 偏移0 大小16MB */ bank-width 2; /* 16位总线 */ /* 关键时序参数配置单位GPMC_FCLK周期 */ gpmc,access-ns 100; /* 对应 tACC驱动内部会转换为时钟周期 */ gpmc,oe-on-ns 10; /* OE有效时间偏移 */ gpmc,oe-off-ns 100; /* OE无效时间偏移 */ gpmc,we-on-ns 20; /* WE有效时间偏移 */ gpmc,we-off-ns 60; /* WE无效时间偏移 */ gpmc,rd-cycle-ns 120; /* 读周期总时间 */ gpmc,wr-cycle-ns 120; /* 写周期总时间 */ gpmc,cs-on-ns 0; /* CS有效时间偏移 */ gpmc,cs-rd-off-ns 120; /* 读操作CS无效时间偏移 */ gpmc,cs-wr-off-ns 120; /* 写操作CS无效时间偏移 */ /* 启用页模式如果Flash支持 */ gpmc,page-burst-access-ns 20; /* 页模式后续访问时间 */ gpmc,bus-turnaround-ns 0; /* 总线转向时间 */ gpmc,cycle2cycle-delay-ns 0; /* 周期到周期延迟 */ #address-cells 1; #size-cells 1; /* 分区示例 */ partition0 { label bootloader; reg 0x00000000 0x00100000; /* 1MB */ }; partition100000 { label kernel; reg 0x00100000 0x00500000; /* 5MB */ }; }; };设备树中的时间参数单位是纳秒(ns)内核驱动会根据自己的GPMC_FCLK频率将其转换为内部的时钟周期数进行配置。因此确保gpmc,fclk-mhz或gpmc,fclk-divider配置正确至关重要。5. 调试技巧与常见问题排查实录即便按照手册精心计算在实际硬件调试中GPMC接口问题依然常见。下面分享几个我踩过的“坑”和解决方法。5.1 问题一系统启动时无法从NOR Flash加载引导程序现象 上电后系统无反应调试器连接发现处理器卡在非常早期的启动阶段或者直接跳转到其他启动介质如MMC。排查思路检查硬件连接 这是第一步也是最容易出错的一步。使用示波器或逻辑分析仪测量gpmc_cs0、gpmc_oen_ren、gpmc_a[1]第一个地址线和gpmc_ad[0]第一条数据线在上电初期是否有波形。如果完全没有波形可能是引脚复用Pin Mux配置错误。确认启动阶段ROM Code读取的器件类型通过SYSBOOT引脚配置是否正确以及ROM Code是否正确地初始化了GPMC引脚。对于DRA7xx需要检查CONTROL_MODULE中相关引脚PADCONFIG寄存器的MUXMODE是否设置为GPMC功能。电源或时钟问题。确认Flash芯片和处理器I/O Bank的供电电压如3.3V, 1.8V是否正确且稳定。确认GPMC_FCLK的源时钟如L3_ICLK或L4_ROOT_CLK是否使能并运行在预期频率。检查时序匹配 如果有波形但数据不对重点用逻辑分析仪抓取一个完整的读周期。对照Flash数据手册和本文第4部分的计算检查以下关键点tACC是否满足测量从地址稳定或gpmc_advn_ale变低到GPMC采样数据gpmc_oen_ren上升沿后的时间间隔。这个时间必须大于Flash的tACC最大值留有裕量。tOE是否满足测量gpmc_oen_ren有效到数据线上出现有效数据的时间。GPMC配置的OE有效时间必须足够早以保证在它采样之前Flash的数据已经稳定。片选宽度是否足够gpmc_cs0的低电平脉冲宽度必须覆盖整个读周期包括地址建立、数据访问和采样时间。检查“虚拟时序”配置 这是DRA7xx等新一代处理器最容易忽略的一点。如手册警告如果不配置虚拟IO时序Virtual IO Timings某些高速模式的时序可能无法保证。你需要检查相关数据/地址/控制引脚的Pad Control寄存器例如CONTROL_PADCONFIG_GPMC_AD0等将DELAYMODE字段设置为手册表7-33推荐的非零值如1,2,3,5,6并确保MODESELECT位已使能虚拟模式。这一步通常需要直接操作寄存器设备树可能没有直接暴露这些配置可能需要修改内核板级文件或U-Boot。5.2 问题二Linux内核启动后期NOR Flash驱动加载失败或文件系统挂载出错现象 U-Boot可以正常读写Flash但Linux内核启动时提示“CFI Flash probe failed”或挂载JFFS2/YAFFS2文件系统时出现ECC错误、超时。排查思路对比U-Boot与内核配置 U-Boot和Linux内核可能使用不同的GPMC时钟源或分频配置。用devmem2或调试器读取GPMC_CONFIG1_N等寄存器的值对比U-Boot初始化后的状态和Linux驱动探测时的状态看关键参数ACCESS_TIME,CSRdOffTime,OEOnTime等是否一致。不一致的话检查设备树配置。检查驱动兼容性 确认内核中启用了正确的Flash驱动如CONFIG_MTD_CFI系列并且设备树中compatible属性与驱动匹配。对于某些较新或特殊的Flash可能需要使用jedec-probe或传递特定的cfi参数。关注时钟频率变化 Linux内核启动过程中时钟框架可能会动态调整各时钟频率以实现功耗管理。确认GPMC的父时钟如l3_iclk,l4_root_clk是否被标记为keep-rate或在驱动中明确设置了频率。可以在驱动probe函数中添加打印输出计算出的实际GPMC_FCLK频率。排查并发访问干扰 如果系统中还有其他主设备如DMA、另一个处理器核可能访问GPMC或同一Flash需要考虑总线仲裁和互斥锁mutex的问题。检查驱动中是否对资源进行了正确的锁定。5.3 问题三NAND Flash读写不稳定出现大量ECC错误现象 NAND Flash可以识别ID但读写数据时ECC纠错码频繁报告错误甚至在擦除块时失败。排查思路区分硬件与软件问题 首先在U-Boot下使用nand命令进行简单的擦除、写入、读取比对测试。如果U-Boot下同样出错基本可以确定是硬件或最底层时序问题。精调NAND时序 NAND对时序尤其是tREA读使能到数据输出、tWP写脉冲宽度等参数非常敏感。使用逻辑分析仪重点抓取读数据周期图7-21和写数据周期图7-22。读周期 测量gpmc_oen_ren有效到数据总线出现有效数据的延迟。确保GPMC配置的AccessTime对应GNF12大于这个延迟加上Flash的tREA。写周期 测量gpmc_wen的脉冲宽度确保大于Flash的tWP最小值。测量gpmc_wen无效后数据总线保持稳定的时间确保大于Flash的tDH数据保持时间。检查上拉电阻 NAND Flash的数据总线是开漏输出需要外部上拉电阻通常4.7kΩ - 10kΩ。如果上拉电阻过大或缺失会导致上升沿缓慢在高频下容易采样错误。用示波器测量数据线的上升时间。检查坏块管理 如果是软件ECC错误多确认内核驱动使用的ECC算法如软件Hamming码、硬件BCH是否与Flash页的ECC布局匹配。有些Flash在出厂时OOB区域有特定格式。使用mtdinfo命令查看分区信息确认OOB大小和ECC强度配置是否正确。5.4 高级调试工具逻辑分析仪的使用心得工欲善其事必先利其器。调试GPMC时序一个支持状态解码的逻辑分析仪是必不可少的。连接与触发 将分析仪通道连接到gpmc_csn、gpmc_oen_ren、gpmc_wen、gpmc_advn_ale、gpmc_ben0以及关键的地址线如A1和数据线如AD0, AD1。设置触发条件为gpmc_csn下降沿读周期开始或gpmc_wen下降沿写周期开始。解码与测量 大多数逻辑分析仪软件支持导入自定义协议解码器。你可以根据GPMC的信号定义创建一个简单的解码器将并行的地址和数据总线显示为十六进制值。然后利用软件的测量工具直接测量gpmc_csn低电平宽度、gpmc_oen_ren有效到数据稳定的延迟等关键参数并与Flash数据手册和你的配置值进行直观对比。对比“理论”与“实际” 将你根据公式计算出的理想波形时间点例如OEOnTime1OEOffTime10对应10ns和100ns在逻辑分析仪的时间轴上做上标记。然后捕获实际波形看关键边沿是否落在预期的时间窗口内。如果发现信号边沿模糊、抖动大或者位置偏移严重就要怀疑信号完整性问题如阻抗不匹配、串扰或IO延迟配置问题了。6. 性能优化与进阶考量当基本功能调通后我们可以进一步考虑优化和可靠性设计。6.1 利用等待信号WAIT实现与低速设备的无缝对接gpmc_wait信号是GPMC一个非常强大的功能。当连接速度远慢于GPMC时钟的旧式存储器或外设时即使将AccessTime配置到最大可能值也可能不够。此时可以让外设在需要更多时间时拉低gpmc_wait信号GPMC检测到后会自动插入等待周期直到gpmc_wait变高。配置方法 在设备树中需要设置gpmc,wait-on-read和gpmc,wait-on-write属性为1。同时需要正确配置gpmc,wait-pin来指定使用哪个等待引脚。在硬件上需要将Flash的RY/BY#就绪/忙引脚连接到处理器的gpmc_wait引脚。注意事项 等待信号是异步的需要处理器IO口支持异步输入检测。同时要仔细计算外设拉低gpmc_wait的最大时间避免处理器因等待超时而产生错误。6.2 复用模式Multiplexed Mode与引脚节约你提供的图7-17和7-18展示了地址/数据复用模式。在这种模式下gpmc_ad[15:0]总线先传输地址此时gpmc_advn_ale作为ALE信号有效再传输数据。这可以节省大量地址引脚对于引脚资源紧张的设计非常有用。配置关键在设备树中设置gpmc,mux-add-data。时序配置需要额外关注地址锁存阶段。ADVOnTime和ADVWrOffTime/ADVRdOffTime现在控制的是ALE信号用于锁存地址。其配置需要满足Flash对tALS地址锁存建立时间和tALH地址锁存保持时间的要求。总的访问周期需要包含地址输出、锁存和数据传输三个阶段因此RdCycleTime和WrCycleTime需要设置得更大。6.3 时序裕量Timing Margin与可靠性设计在高速或严苛环境如汽车电子、工业温度范围下必须考虑时序裕量。计算最坏情况Worst-Case 不要只使用Flash数据手册的典型值。要结合处理器IO的延迟偏差见数据手册的tr、tf、tio参数、PCB走线延迟约150ps/inch、温度电压漂移等因素进行最坏情况分析。增加裕量 在计算出的寄存器值基础上适当增加AccessTime、RdCycleTime等参数。例如计算需要8个周期可以配置为9或10个周期。使用更保守的IO设置 在Pad Control寄存器中可以适当增加驱动强度DRIVE_STRENGTH以改善信号边沿但要注意会增加功耗和EMI。也可以调整上下拉、压摆率控制等以优化信号完整性。6.4 多芯片选择Chip Select与分区管理GPMC支持最多8个片选。你可以将不同类型的存储器如NOR, NAND, SRAM或同一存储器的不同分区连接到不同的片选上。每个片选GPMC_CONFIGx_N x0-7都有独立的一套时序寄存器可以分别配置。设备树配置示例 在gpmc节点下定义多个子节点每个子节点的reg属性第一个cell指定片选号。这样就可以在一个设备树中定义启动NORCS0、大容量NANDCS2、外部FPGA配置SRAMCS3等并分别赋予最优的时序参数实现灵活的存储扩展。

相关新闻