1. GPMC:嵌入式系统的“交通指挥官”
在嵌入式系统开发,尤其是基于TI OMAP这类应用处理器的项目中,我们常常需要连接多种外部存储设备,比如存放启动代码的NOR Flash、作为程序运行内存的PSRAM,或是存储大量数据的NAND Flash。这些设备脾气各异:有的地址和数据线是分开的,有的却复用同一组引脚;有的喜欢慢条斯理的异步通信,有的则要求精准同步的时钟节拍。如果让处理器内核直接去“伺候”这些设备,光是协调时序就能让软件工程师头大如斗。
这时,通用内存控制器(GPMC)就扮演了至关重要的“交通指挥官”角色。它位于处理器核心与外部存储世界之间,将处理器发出的标准化内存访问请求,翻译成各种外部设备能听懂的“方言”。这个翻译过程的核心,就是一套高度可编程的配置寄存器。通过设置芯片选择(Chip-Select)、时序参数和访问协议,GPMC能生成精确匹配特定NOR Flash、SRAM或NAND Flash芯片规格的控制信号波形。
我接触过不少项目,初期因为GPMC配置不当导致系统无法启动、数据读写错误甚至硬件损坏。究其根本,是对其工作原理和配置细节理解不够深入。GPMC绝非简单的“开关”,而是一个拥有地址解码、预取引擎、错误校正(ECC)等复杂模块的智能接口。理解它,尤其是掌握其复位默认行为、时序参数的计算与权衡,是稳定驱动外部设备、榨取系统性能的关键。接下来,我将结合手册内容和实际调试经验,为你拆解GPMC的核心机制与配置要点。
2. 核心模块解析:GPMC的“五脏六腑”
要驾驭GPMC,不能只把它当黑盒,得先看清其内部结构。根据手册中的功能框图,GPMC主要由六大模块协同工作,理解它们的分工是进行正确配置的前提。
2.1 L3互连端口接口:系统总线的“收费站”
这是GPMC与处理器内部高速总线(L3 Interconnect)的对接点。所有来自CPU、DMA控制器等系统主设备的内存访问请求,都通过这个接口进入GPMC。它支持多种访问类型,从单次的8/16/32位读写,到增量式或回绕式的32位突发传输(Burst),长度可以是2、4或8个字。
这里有个关键限制需要注意:GPMC只支持线性突发(Linear Burst),不支持交错突发(Interleaved Burst)。这意味着突发传输的地址必须是连续递增的。同时,突发传输的基地址必须与突发总大小对齐(例如,一个8字的突发,其起始地址必须是8字的整数倍)。这个限制源于GPMC内部访问引擎的设计,在规划内存布局和设计驱动时务必留意。
该接口还包含一个8×32位的写缓冲区(Write Buffer)。当处理器发起写操作时,数据可以暂存于此,GPMC在后台完成对外部设备的实际写入,从而释放总线,提升系统整体效率。这解释了为什么在禁用某个芯片选择(Chip-Select)前,软件必须监控写缓冲区的状态,等待所有已提交的写操作完成,否则会导致数据丢失。
2.2 地址解码与配置寄存器:内存空间的“地图绘制员”
这是GPMC的“大脑”。它包含一组全局配置寄存器和八组芯片选择(CS0-CS7)专用配置寄存器。当地址请求到来时,解码逻辑会根据GPMC_CONFIG7_i寄存器中设置的基地址(BASEADDRESS)和掩码(MASKADDRESS),判断这个地址属于哪个芯片选择区域。
芯片选择区域配置是硬件设计的基础。GPMC拥有1GB的连续地址空间,最多可划分为8个区域。每个区域的大小可以从16MB到128MB(必须是2的幂次方)。掩码(MASK)字段用于在地址比较时忽略某些地址线,从而定义区域大小。例如,若要配置一个64MB的区域,你需要将掩码设置为对应的值,使得高6位地址参与解码,低26位地址(2^26 = 64MB)在区域内变化。
注意:手册中特别警告,应避免使用如
1010或1001这类会产生地址空间“空洞”的掩码值。这会导致地址解码出现不连续区间,可能引发不可预料的访问错误。配置时,掩码值必须严格按照所需区域大小对应的固定值来设置。
一个至关重要的安全原则是:任何对芯片选择配置寄存器(如基地址、时序参数)的修改,都必须在该芯片选择被禁用(CSVALID位清零)的状态下进行。同时,在启用一个芯片选择后、首次访问它之前,最好插入几条NOP指令(约等效于64位操作的时间),以等待配置完全生效,并规避预取引擎可能带来的副作用。
2.3 访问引擎:信号波形的“生成器”
这是GPMC的“双手”,负责执行具体的访问操作。它根据地址解码模块选中的芯片选择所对应的那组配置寄存器,生成精确的时序波形,驱动外部的地址、数据和控制信号线(如nCS, nOE, nWE, nADV等)。
访问引擎的核心工作是将系统请求转换为一个或多个外部设备访问周期。例如,一个32位的读请求发往一个16位宽的设备时,访问引擎会自动将其拆分为两个连续的16位读周期。它同样处理突发请求,如果外部设备支持页模式或同步突发模式,引擎会尝试以最高效的突发长度进行访问;如果不支持,则分解为多个单次访问。
2.4 预取与写回引擎:数据流的“加速器”
这是一个专为流式数据访问(特别是NAND Flash操作)优化的子模块。它可以独立于系统请求,预先从外部设备读取数据到内部的64字节FIFO,或将要写入的数据暂存于此。当CPU或DMA需要连续访问一大块数据时,这个引擎能显著减少访问延迟,提升吞吐量。
它通过一个DMA请求线与系统同步,非常适合与DMA控制器配合进行大数据块搬运。其优先级默认低于来自L3接口的请求,但在以数据流为主的场景下,合理配置其触发阈值和策略能极大提升性能。
2.5 错误校正码(ECC)引擎:数据安全的“守护者”
在NAND Flash或对可靠性要求极高的应用中,ECC引擎不可或缺。GPMC集成了硬件ECC计算功能,支持两种算法:汉明码(Hamming Code)和BCH码(Bose-Chaudhuri-Hocquenghem)。
- 汉明码:基于行列奇偶校验,计算速度快,纠错能力相对较弱(通常只能纠正单比特错误,检测双比特错误)。
- BCH码:更强大的纠错算法,能纠正多比特错误,但计算更复杂,消耗更多资源和时间。
需要明确的是,GPMC的ECC引擎只负责在写入时生成校验位,在读取时计算校验结果(Syndrome)。实际的错误检测与纠正工作,需要软件(或协处理器)根据引擎提供的结果来完成。引擎一次只能服务于一个芯片选择,通过GPMC_ECC_CONFIG[3:1]的ECCCS位域来分配。
2.6 外部设备/内存端口接口:物理连接的“接线员”
这是GPMC与外部PCB走线直接相连的物理接口。它控制着所有的地址、数据、控制引脚的电平变化。其驱动能力、负载特性会直接影响信号完整性和最高工作频率。手册中特别提醒,虽然GPMC能驱动最多8个片选,但其标称的最高频率是针对特定负载的。如果板上连接了过多设备,导致总线负载过重,可能无法达到理论最高频率。解决方案通常是在PCB设计时加入缓冲器(Buffer)来隔离和驱动负载。
3. 芯片选择与访问协议配置详解
理解了架构,我们进入实战环节:如何为一个具体的外部设备配置GPMC。这主要分为两步:划定它的“地盘”(地址空间),并定义它的“交流方式”(访问协议)。
3.1 芯片选择基地址与区域大小配置
这是将外部设备映射到处理器内存空间的第一步。假设我们有一片32MB的NOR Flash,打算挂在CS1上,映射到地址0x0800_0000开始的空间。
- 确定基地址(BASEADDRESS):我们需要设置
GPMC_CONFIG7_1[5:0]。这个6位字段对应着地址线[A29:A24](具体映射关系见手册图11-6)。地址0x0800_0000换算成二进制,其高6位(A29-A24)决定了BASEADDRESS的值。关键点:基地址必须按区域大小对齐。对于32MB的区域,地址必须是32MB的整数倍,0x0800_0000符合要求。 - 确定掩码(MASKADDRESS):设置
GPMC_CONFIG7_1[11:8]。掩码定义了哪些高位地址线参与比较。对于32MB(2^25字节)区域,我们需要忽略低25位地址(A24-A0),因此参与比较的地址线是A29, A28, A27, A26, A25(共5位)。掩码值需要根据手册规定的对应关系来设置,以确保A24及更低位的地址在比较时被忽略(视为“无关”位)。 - 启用芯片选择:最后,将
GPMC_CONFIG7_1[6]的CSVALID位置1,使能该片选区域。
配置完成后,CPU访问0x0800_0000到0x09FF_FFFF之间的地址,GPMC便会自动激活CS1信号线,并采用CS1对应的时序参数进行访问。
3.2 访问协议的核心配置位
在GPMC_CONFIG1_i寄存器中,有几个位域共同定义了与设备的“通信协议”:
DEVICETYPE[11:10]:选择设备类型。0b00代表通用的异步/同步随机存取设备(如NOR Flash, SRAM);其他值用于配置NAND Flash。这是最根本的协议选择。DEVICESIZE[13:12]:设置设备数据总线宽度。0x1代表16位,0x0代表8位。GPMC会自动处理系统总线宽度(32位)与设备宽度的转换。特别注意:对于8位宽的随机存取设备(非NAND),由于OMAP不提供A0地址线,因此只支持字(16位)或字(32位)对齐的访问,无法随机访问单个字节。这是硬件限制。MUXADDDATA[9]:地址/数据复用选择。置1表示使用复用模式,此时ADV/ALE信号用作地址锁存使能。这在连接许多低引脚数的NOR Flash时很常见,可以节省PCB走线。READTYPE[29]与WRITETYPE[27]:分别定义读和写访问是异步模式还是同步模式。异步模式依赖固定的时序参数;同步模式则使用GPMC_CLK时钟来同步数据采样,通常能实现更高的速率。READMULTIPLE[30]与WRITEMULTIPLE[28]:定义是否启用页读(异步)或突发读/写(同步)。如果设备支持页模式或突发模式,开启此项能大幅提升连续访问性能。记住:异步写页模式是不支持的。
3.3 突发传输与页长度配置
为了发挥高性能内存设备的潜力,必须理解GPMC的突发处理机制。
ATTACHEDDEVICEPAGELENGTH[24:23]:这个字段定义了外部设备单次页读或突发操作能支持的最大数据量(以16位字为单位)。可设置为4、8或16个字。它必须与设备内部缓存(Page Buffer)的大小或它支持的最大突发长度一致。WRAPBURST[31]:回绕突发使能。如果内存设备原生支持“关键字优先”的回绕突发模式(例如,CPU请求字0,1,2,3,设备可能按2,3,0,1的顺序返回以降低延迟),则将此位置1,并将页长度设置为设备支持的突发长度(4,8,16)。如果设备不支持,GPMC访问引擎会通过拆分请求来模拟回绕行为。
一个常见误区:认为只要设备支持连续突发(Continuous Burst),就能获得最佳性能。实际上,GPMC访问引擎只产生固定长度的突发。因此,即使将设备配置为连续突发模式,GPMC也无法利用其特性,反而可能因设备内部的预取操作增加功耗。最佳实践是将支持突发的内存设备配置为固定长度突发模式(Fixed-Length Burst),并将ATTACHEDDEVICEPAGELENGTH设置为该长度。
4. 时序参数配置:与设备“对表”
时序配置是GPMC调试中最精细、最容易出错的部分。每个时间参数都以GPMC_FCLK的周期数为单位。GPMC_FCLK是GPMC模块的内部功能时钟,而GPMC_CLK是输出给同步设备的外部时钟,两者频率可以不同。
4.1 关键时序参数解析
手册中定义了大量的时间参数,它们共同绘制出控制信号的波形图。我们以最常见的异步单次读为例(对应图11-7),解析几个核心参数:
- 周期时间(
RDCYCLETIME/WRCYCLETIME):定义了读或写访问的总时间,即地址和字节使能信号有效的持续时间。它是其他许多参数的时间基准。一个访问周期结束时,即使某些控制信号的关闭时间(OFFTIME)还没到,GPMC也会强制将它们置为无效状态,除非有到同一或不同片选的流水线请求待处理。 - 片选信号时间(
CSONTIME,CSRDOFFTIME,CSWROFFTIME):CSONTIME:从访问开始到nCS信号变低(有效)的延迟。常用于满足地址相对于片选的建立时间(Setup Time)。CSRDOFFTIME/CSWROFFTIME:从访问开始到读/写操作中nCS信号变高(无效)的延迟。常用于满足地址相对于片选的保持时间(Hold Time)。CSEXTRADELAY:将此位置1,会给所有nCS信号的变化增加半个GPMC_FCLK周期的延迟。当GPMC_CLK与GPMC_FCLK同频时,这半个周期的粒度对于满足建立/保持时间非常有用。
- 输出使能信号时间(
OEONTIME,OEOFFTIME):仅用于读操作。OEONTIME:nOE信号有效的开始时间。必须确保在nOE有效前,地址已经稳定了足够的时间(满足t_{AA}或t_{OE})。OEOFFTIME:nOE信号无效的时间。它必须早于或等于RDCYCLETIME,并且要保证在nOE无效后,数据还能被稳定采样一段时间(满足保持时间)。
- 写使能信号时间(
WEONTIME,WEOFFTIME):仅用于写操作。其原理与nOE类似,但控制的是nWE信号,用于锁存数据到外部设备。 - 地址有效信号时间(
ADVONTIME,ADVRDOFFTIME,ADVWROFFTIME):在地址/数据复用模式下,nADV信号作为地址锁存使能(ALE)。这些参数控制ALE脉冲的宽度和位置,以确保地址在ALE的下降沿被外部设备正确锁存。
4.2 时序计算实战:配置一片异步NOR Flash
假设我们有一片16位宽的异步NOR Flash,其关键时序要求如下(假设GPMC_FCLK = 100MHz,周期T=10ns):
- 地址建立时间(t_{ASU}): 最小10ns
- 地址保持时间(t_{AH}): 最小5ns
- 片选有效到输出有效(t_{CEV}): 最大25ns
- 输出使能有效到数据有效(t_{OE}): 最大15ns
- 输出使能无效到数据高阻(t_{OHZ}): 最小3ns
- 读周期时间(t_{RC}): 最小45ns
我们的配置目标是满足所有最严苛的时序要求,并尽可能提高访问速度。
步骤1:确定RDCYCLETIME读周期时间必须大于等于Flash要求的t_{RC}(45ns)。考虑到时钟周期为10ns,我们至少需要5个周期(50ns)。为了留有余量,我们设置为6个周期(60ns)。即RDCYCLETIME = 5(注意:该字段值为周期数减1,若手册规定值为0表示1个周期,则6个周期应设置为5)。
步骤2:配置CSONTIME和CSRDOFFTIME
CSONTIME需要保证在nCS有效前,地址已稳定至少t_{ASU}(10ns)。如果我们希望地址在访问开始时即有效,那么CSONTIME可以设为0���但更常见的做法是让地址提前有效,例如设置CSONTIME = 1(即10ns后拉低nCS),这样地址就有10ns的建立时间。CSRDOFFTIME需要保证nCS无效后,地址还能保持t_{AH}(5ns)。由于RDCYCLETIME是60ns,我们可以设置CSRDOFFTIME = 5(即50ns时拉高nCS)。这样,从nCS变高到周期结束还有10ns,满足5ns的保持时间。
步骤3:配置OEONTIME和OEOFFTIME
OEONTIME必须保证在nOE有效前,地址已稳定t_{ASU},且nCS已有效t_{CEV}。取两者中较晚者。假设CSONTIME=1,则nCS在10ns时有效,t_{CEV}最大25ns,所以nOE最早应在35ns后有效。同时,地址在0ns已有效,t_{ASU}要求10ns,这个条件更早满足。因此,OEONTIME至少为3.5个周期,设为4(40ns)。OEOFFTIME必须保证nOE无效后,数据保持t_{OHZ}(3ns),且必须在RDCYCLETIME结束前。我们可以将其设置为比RDCYCLETIME稍早,例如OEOFFTIME = 5(50ns)。这样nOE在50ns时无效,到60ns周期结束还有10ns,远大于3ns。
步骤4:检查数据访问时间最关键的是数据有效窗口。从nOE有效(40ns)到数据有效,最坏情况需要t_{OE}(15ns),即55ns时数据才稳定。而nOE在50ns就无效了?这里有问题!我们的配置导致了数据有效窗口为负(50ns - 55ns = -5ns),这意味着在nOE无效时,数据可能还未有效读出,这是致命的。
调整:必须延长nOE的有效时间,确保覆盖t_{OE}。将OEOFFTIME调整为5.5个周期?但参数是整数周期。我们可以利用OEEXTRADELAY。设置OEOFFTIME = 5(50ns),并开启OEEXTRADELAY。这样nOE的实际关闭时间会延迟半个周期(5ns),即在55ns关闭。这样,从nOE有效(40ns)到无效(55ns)共15ns,刚好满足t_{OE}的最大值。数据在55ns时稳定,同时nOE关闭,满足t_{OHZ}。
通过这个例子可以看到,时序配置是一个反复权衡和验证的过程,必须根据设备手册的最坏值(Max/Min)和GPMC的时钟周期进行仔细计算,并善用*EXTRADELAY位来获得半个时钟周期的调节精度。
5. 复位默认配置与启动流程
系统复位后的初始状态至关重要,它决定了处理器能否从外部存储器(通常是CS0上的启动设备)成功读取第一段代码。
5.1 CS0的默认配置
手册指出,在芯片复位时,为了确保能从CS0正确启动,GPMC会采样一组特定的外部引脚状态,来配置CS0的初始寄存器值:
sys_boot[4:0]:定义启动接口和设备的序列。sys_boot[5]:选择启动序列组(0为内存启动,1为外设启动)。bootwaiten:此引脚配置GPMC_CONFIG1_0[22] WAITREADMONITORING位。如果使能,在复位释放后对CS0的读访问会监控WAIT引脚。这用于连接慢速启动设备。bootdevicesize:固定为1,将DEVICESIZE配置为16位宽。这意味着复位默认假设CS0上挂的是16位设备。cs0muxdevice:固定为1,将MUXADDDATA置位。这意味着复位默认假设CS0上的设备是地址/数据复用的。
这个默认配置指向了一个典型的场景:一块16位、地址数据复用的异步NOR Flash作为启动设备。复位时的时序参数也被设置为非常保守的值,以适应低频率(如19.2MHz)下的各种异步设备。
5.2 启动配置的陷阱与解决方案
默认配置带来了一个关键限制:如果你在CS0上连接的是NAND Flash,或者是一个非复用的、地址范围很小的设备,这个默认配置是不正确的。
手册中的“CAUTION”警告明确指出:必须通过内部引导代码(Boot ROM中的代码)在第一次访问CS0之前,修改其全部配置。例如,对于NAND设备,需要将DEVICETYPE改为NAND模式,并配置相应的命令、地址、数据周期时序。对于非复用的设备,则需要清除MUXADDDATA位。
在实际项目中,我曾遇到一个坑:硬件工程师为了节省成本,在CS0上使用了一片8位非复用的SPI NOR Flash(通过一个简单的逻辑转换器连接)。系统上电后无法启动。原因就是默认配置是16位复用,与实际硬件不匹配。解决方案是在Boot ROM阶段,最早可能的时机(通常在初始化PLL和时钟之前,在低速运行模式下)通过软件重写GPMC CS0的DEVICESIZE和MUXADDDATA等关键配置位,使其与硬件匹配。
6. 高级功能与调试技巧
6.1 等待引脚(WAIT Pin)监控
对于慢速或响应时间不固定的设备,GPMC提供了等待引脚监控功能。在异步读访问中,如果使能了WAITREADMONITORING,GPMC会在RDACCESSTIME参数定义的周期结束后,采样WAIT引脚的状态。如果WAIT为低,GPMC会插入等待周期,直到WAIT变高,才采样数据并结束访问。
这在连接一些旧款SRAM或带忙状态指示的CPLD时非常有用。配置时,需要正确设置RDACCESSTIME(初始访问时间),确保在采样WAIT引脚前,已给了设备足够的时间去置位/复位其忙信号。
6.2 预取引擎的使用与优化
预取引擎对于提升NAND Flash的读取性能至关重要。其基本工作流程是:
- 软件通过特定寄存器(如
GPMC_PREFETCH_CONFIG)启动预取操作,指定目标芯片选择和命令(读/写)。 - 引擎开始从外部设备读取数据,填充其64字节的FIFO。
- 当FIFO中的数据达到设定的阈值时,引擎可以触发中断或DMA请求。
- CPU或DMA控制器从FIFO中快速取走数据。
优化点:合理设置预取触发阈值和FIFO水位线。如果设置得过低,会频繁产生中断,增加CPU开销;设置得过高,则可能导致DMA传输断流。需要根据系统总线和设备速度进行权衡测试。
6.3 ECC引擎的集成
使用ECC引擎时,需要注意其上下文是独占的。一个典型的NAND页编程和读取的ECC流程如下:
写操作(编程):
- 将
GPMC_ECC_CONFIG[3:1]设置为当前操作的芯片选择。 - 选择ECC算法(汉明码或BCH)。
- 启动写操作。GPMC在数据写入NAND的同时,会计算ECC校验值。
- 写操作完成后,从
GPMC_ECC_RESULT寄存器中读取计算出的ECC字节,并将其写入NAND Flash的备用区(Spare Area)。
- 将
读操作:
- 同样,先配置
ECCCS指向正确的芯片选择。 - 启动读操作。GPMC在读取数据的同时,会根据读取的数据实时计算ECC值。
- 读操作完成后,从
GPMC_ECC_RESULT寄存器读取计算出的ECC值,并与从NAND备用区读出的原始ECC值进行比较。 - 软件根据比较结果(汉明码有专用的状态位,BCH码需要软件算法解码)判断是否发生错误,并进行纠正(如果算法支持且错误在纠错能力范围内)。
- 同样,先配置
一个常见错误是忘记在读写操作前切换ECCCS设置。如果多个芯片选择都连接了NAND设备,必须在为每个设备进行数据操作前,将其对应的ECCCS选中,否则ECC计算会基于错误的数据上下文,导致校验完全失效。
6.4 调试方法与常见问题排查
信号测量与逻辑分析仪:调试GPMC时序,一台逻辑分析仪是必不可少的。重点测量以下信号组:
- 地址/数据总线:观察复用模式下,地址相位和数据相位是否清晰,有无毛刺。
- 控制信号(nCS, nOE, nWE, nADV):测量其相对于GPMC_CLK(同步模式)或相对于访问开始(异步模式)的建立/保持时间,与配置值是否吻合。
- WAIT引脚:在使能监控时,检查其电平变化是否被GPMC正确识别。
寄存器配置检查:在软件初始化GPMC后,将配置好的寄存器值读回,与预期值对比,排除软件配置错误或寄存器位域理解有误的问题。
常见问题速查表:
| 现象 | 可能原因 | 排查步骤 |
|---|---|---|
| 系统无法从CS0启动 | 1. CS0设备类型/宽度/复用模式与复位默认值不匹配。 2. 时序参数过于激进,不满足设备最慢要求。 3. 硬件连接错误(如地址线、数据线接反)。 | 1. 检查Boot ROM代码是否在首次访问前重配置了CS0。 2. 用保守时序(增大周期数)测试。 3. 测量复位后CS0上是否有正确的读波形。 |
| 读写数据错误(非全0/全F) | 1. 时序参数中建立/保持时间不足。 2. 数据总线负载过重,信号完整性差。 3. 电源噪声大。 | 1. 用逻辑分析仪测量数据有效窗口是否稳定。 2. 检查PCB走线,是否过长、有无串扰。 3. 测量电源纹波,尤其在GPMC操作时。 |
| 突发传输性能远低于预期 | 1.ATTACHEDDEVICEPAGELENGTH设置小于设备实际能力。2. WRAPBURST设置错误。3. 设备未配置为固定长度突发模式。 | 1. 核对设备手册,确认其缓存大小和突发长度。 2. 根据设备是否支持原生回绕突发,正确设置 WRAPBURST。3. 配置设备寄存器,将其设为固定长度突发模式。 |
| 使能ECC后数据校验总失败 | 1.ECCCS位域未指向当前操作的芯片选择。2. 读写操作时ECC算法设置不一致。 3. 存储ECC校验值的NAND备用区位置读写错误。 | 1. 在每次NAND操作前确认ECCCS配置正确。2. 确保读写使用相同的ECC算法和参数。 3. 调试备用区的读写操作,确保ECC值被正确存储和读取。 |
| 访问不同CS时系统挂起 | 1. 不同CS的地址区域重叠。 2. 时序参数配置不当,导致控制信号在CS切换时发生冲突。 | 1. 检查所有GPMC_CONFIG7_i中的基地址和掩码,确保无重叠。2. 检查 RDCYCLETIME/WRCYCLETIME是否大于所有控制信号的关闭时间(包括可能的*EXTRADELAY),确保在一个访问周期完全结束后才开始下一个。 |
配置GPMC是一个需要硬件、软件和调试工具紧密配合的过程。从理解复位默认状态开始,根据实际硬件确定设备类型、总线宽度和复用模式,然后像解数学题一样,根据设备手册的时序参数和GPMC的时钟周期,计算出各个时间寄存器的值,最后通过逻辑分析仪验证波形。这个过程虽然繁琐,但一旦调通,系统与外部存储的通信就拥有了坚实可靠的基础。