1. GPMC:嵌入式系统与外部存储器的桥梁
在嵌入式系统开发中,处理器与外部存储器的连接是决定系统性能、稳定性和成本的关键一环。无论是运行代码的NOR Flash,存储数据的NAND Flash,还是作为高速缓存的SRAM,它们都需要一个高效、可靠的“翻译官”来与CPU进行通信。这个翻译官就是通用存储器控制器,通常被称为GPMC。它不是一个简单的信号转发器,而是一个高度可编程、协议丰富的智能接口模块,其核心任务是将CPU发出的标准内存访问请求,翻译成外部存储芯片能够理解的各种“方言”,并精确控制每一次通信的“节奏”。
GPMC的工程价值在于其“通用性”和“灵活性”。想象一下,一个硬件平台需要同时连接一片用于启动的8位并行NOR Flash、一片存储操作系统的16位NAND Flash,以及一片高速的异步SRAM。如果没有GPMC,你可能需要为每种存储器设计独立的接口逻辑,电路复杂,软件驱动也各不相同。而GPMC通过一套统一的硬件框架和可配置的寄存器集,允许工程师为每个芯片选择区域(Chip-Select)独立配置访问协议、数据宽度、时序参数,从而用一套硬件接口“通吃”多种存储设备。这不仅简化了硬件设计,更让软件驱动可以基于同一套API进行开发,大大提升了开发效率和系统的可维护性。
本文将从一线工程师的视角,深入拆解GPMC的工作原理,特别是其最核心也最容易出错的时序配置逻辑。我们会抛开手册式的罗列,聚焦于“为什么”要这样配置,以及在实际调试中如何根据存储芯片的数据手册,一步步计算出那些关键的时序参数,并处理棘手的等待引脚(WAIT)同步问题。无论你是正在调试一块新板卡的硬件工程师,还是需要为特定存储器编写底层驱动的软件工程师,理解这些细节都将让你在解决“存储器访问不稳定”、“数据读写错误”这类问题时,拥有清晰的排查思路和扎实的理论依据。
2. GPMC核心架构与工作模式解析
2.1 整体框架与信号定义
GPMC可以看作是一个高度可配置的“协议转换器”和“时序发生器”。它位于处理器内部总线(如L3互联)和外部存储器引脚之间。其外部接口信号主要分为几大类:地址/数据总线、控制总线和状态信号。
从你提供的框图可以看到,GPMC的信号线非常丰富:
- 地址/数据总线 (
gpmc_ad[15:0]): 这是一组复用引脚。在非复用模式下,它们仅作为16位数据总线D[15:0]使用,地址由独立的gpmc_a[27:1]提供。在地址/数据复用模式下,这组引脚先在地址周期输出地址A[16:1],然后在数据周期传输数据D[15:0],这能有效减少芯片封装所需的引脚数量。 - 芯片选择 (
gpmc_csn[6:0]): 最多7个独立的片选信号,每个可以映射到一段独立的物理地址空间,连接一个独立的存储设备。这是实现“通用性”的基础。 - 读写控制 (
gpmc_oen,gpmc_wen): 输出使能和写使能信号,控制读/写操作的方向。 - 地址锁存 (
gpmc_advn_ale): 在复用模式下,此信号的下拉沿告诉外部设备,当前总线上的信息是地址,请将其锁存。对于NAND设备,此信号常作为ALE(地址锁存使能)。 - 字节使能 (
gpmc_be0n_cle,gpmc_be1n): 对于16位设备,用于选择高字节或低字节。对于NAND设备,gpmc_be0n_cle可作为CLE(命令锁存使能)。 - 等待引脚 (
gpmc_wait[1:0]): 这是实现与低速设备同步的关键。设备可以通过拉低此信号来通知GPMC:“数据还没准备好,请等待”。 - 时钟 (
gpmc_clk): 为同步存储设备提供时钟参考。
注意:
gpmc_a[27:1]的位宽意味着GPMC最大可寻址128MB(2^27 * 字节)的空间吗?这里有个细节:地址线是A[27:1],缺少了A0。这是因为对于16位宽的设备,地址是以“半字”(2字节)为单位的,A0信号通常由字节使能信号BE0n和BE1n内部管理。因此,当CPU访问一个字节时,GPMC会通过字节使能信号来选通高/低字节,而不是使用A0。这在配置地址映射时需要特别注意。
2.2 三种典型连接模式详解
GPMC支持多种设备连接模式,手册中重点图示了三种,这基本覆盖了绝大多数应用场景。
1. 16位地址/数据复用模式(AAD Multiplexed)这是最常用的一种连接NOR Flash或异步SRAM的方式。如图所示,gpmc_ad[15:0]引脚在ADVn/ALE信号有效期间输出地址A[16:1],之后在同一组引脚上传输数据D[15:0]。独立的gpmc_a[27:17]引脚提供高位地址。这种模式节省了引脚,但需要一个额外的锁存器(通常由ADVn信号控制)在外部芯片上锁存地址。其优势在于,用较少的引脚实现了较大的地址空间访问,非常适合引脚资源紧张的嵌入式处理器。配置要点:需要将GPMC_CONFIG1_i[9-8] MUXADDDATA设置为01b。
2. 16位非复用模式(Non-multiplexed)在这种模式下,地址和数据总线是分开的。gpmc_a[27:1]专门输出地址,gpmc_ad[15:0]专门传输数据。如图所示,ADVn信号通常不再需要用作地址锁存,可以保持无效或另作他用。这种模式的优势是时序简单,访问速度快,因为无需在总线上切换地址和数据相位。常用于连接对速度要求较高的SRAM或PSRAM。配置要点:MUXADDDATA位需设置为00b。
3. 8位NAND Flash模式连接NAND Flash是GPMC的另一大主要用途。如图所示,此时gpmc_ad[7:0]用于传输命令、地址和数据(分时复用),gpmc_a[27:1]未使用。关键的控制信号是gpmc_advn_ale(作为ALE)和gpmc_be0n_cle(作为CLE),用于区分总线上的内容是地址还是命令。NAND接口是异步的,且协议复杂,GPMC为其提供了专门的命令序列发生器,可以自动发送读、写、擦除等命令序列,极大简化了软件操作。配置要点:需要将GPMC_CONFIG1_i[11-10] DEVICETYPE设置为10b以选择NAND模式。
实操心得:选择哪种模式,首要依据是存储芯片的数据手册。不要想当然。例如,一块常见的NOR Flash(如S29GL064N)就支持两种接口模式:异步页模式(非复用)和地址数据复用模式。你需要根据芯片的型号和硬件连接方式,在GPMC配置中选择对应的
DEVICETYPE和MUXADDDATA。连接错误会导致根本无法访问。
2.3 时钟树与分频配置
GPMC的时序基准是其内部功能时钟GPMC_FCLK。这个时钟通常来源于系统主时钟,并经过PRCM(电源、复位、时钟管理)模块分配。所有时序参数的计算单位都是GPMC_FCLK的周期。
对于需要时钟的同步存储设备,GPMC可以通过GPMC_CLK引脚输出一个时钟。这个输出时钟是由GPMC_FCLK分频得来的,分频系数由GPMC_CONFIG1_i[1-0] GPMCFCLKDIVIDER字段控制,可选1、2、3、4分频。
为什么需要分频?
- 匹配设备速度:外部同步存储芯片有其最大操作频率。例如,一个同步SRAM最大时钟为100MHz,而
GPMC_FCLK为200MHz,那么就需要配置2分频,使GPMC_CLK为100MHz。 - 满足建立/保持时间:在更高的
GPMC_FCLK下,通过分频产生更宽的GPMC_CLK周期,可以为数据/地址信号相对于时钟边沿的建立和保持时间提供更充裕的窗口。 - 降低功耗和噪声:较低的时钟频率意味着更低的动态功耗和更小的信号完整性风险。
配置计算示例: 假设系统要求GPMC_CLK输出为66.7MHz,而GPMC_FCLK源为200MHz。
- 计算分频比:200 / 66.7 ≈ 3。
- 因此,应将
GPMCFCLKDIVIDER设置为10b(对应除3)。 - 实际输出的
GPMC_CLK频率为 200MHz / 3 = 66.67MHz。
注意事项:
GPMC_CLK的分频配置会影响所有基于GPMC_CLK周期的时序参数,例如同步访问的RDACCESSTIME、WRACCESSTIME等。在计算这些参数时,必须以GPMC_CLK的周期时间为单位,而不是GPMC_FCLK。这是一个常见的混淆点。
3. 芯片选择与地址空间映射实战
3.1 地址解码与CS区域配置
GPMC将整个512MB的连续地址空间划分为最多7个独立的“片区”,每个片区由一个芯片选择信号CSn管理。这就像一个大仓库被分成了7个独立的库房,每个库房有自己的一把钥匙(CSn)。CPU访问某个地址时,GPMC的地址解码器会根据地址值判断属于哪个库房,然后拉起对应的CSn钥匙。
配置一个CS区域的核心是设置两个寄存器:基地址(BASEADDRESS)和掩码(MASKADDRESS)。
- 基地址 (
GPMC_CONFIG7_i[5-0] BASEADDRESS):定义了该CS区域起始地址的高6位(对应地址线A[31:26])。基地址必须按区域大小对齐。例如,一个64MB的区域,其基地址必须是64MB的整数倍(即A[25:0]全为0)。 - 掩码 (
GPMC_CONFIG7_i[11-8] MASKADDRESS):决定了哪些高位地址线参与解码。掩码位为0表示该地址线在解码时是“无关位”(don‘t care)。掩码值直接决定了区域大小。
区域大小计算逻辑: 掩码的4位值(MASKADDRESS)并非直接表示大小,而是通过“排除”高位地址线来定义区域。区域大小 = 2 ^ (32 - (基地址有效位 + 掩码确定的起始位) )。手册中给出了更直观的规则:掩码值必须根据所需大小,设置为特定的几个值。
| 期望的CS区域大小 | 对应的掩码字段值 (MASKADDRESS) | 说明 |
|---|---|---|
| 16 MB | 0xF (0b1111) | 所有高4位地址线都参与比较,区域最小。 |
| 32 MB | 0xE (0b1110) | A[26]为无关位,地址空间扩大一倍。 |
| 64 MB | 0xC (0b1100) | A[27:26]为无关位。 |
| 128 MB | 0x8 (0b1000) | A[28:26]为无关位。 |
| 256 MB | 0x0 (0b0000) | A[29:26]为无关位,区域最大。 |
配置实例:我们希望将CS0映射到物理地址0x0800_0000开始的一个64MB空间,用于连接一个NOR Flash。
- 确定基地址:64MB区域,起始地址必须64MB对齐。
0x0800_0000是128MB(0x0800_0000)的边界吗?64MB是0x400_0000。0x0800_0000/0x400_0000= 2,是对齐的。基地址的高6位(A[31:26])是0b000010(即0x2)。 - 确定掩码:对于64MB,查表得掩码值为
0xC。 - 寄存器设置:
GPMC_CONFIG7_0寄存器中,BASEADDRESS字段写0x2,MASKADDRESS字段写0xC。 - 使能CS:最后,将
GPMC_CONFIG7_i[6] CSVALID位设置为1,使能该芯片选择。
踩坑记录:手册特别警告,掩码值
0010(0x2)和1001(0x9)是必须避免的。这两个值会导致地址空间中出现“空洞”,即一段地址无法被任何CS响应,另一段地址可能被两个CS同时响应,造成访问错误或数据冲突。务必使用手册推荐的那几个掩码值。
3.2 访问协议与设备宽度配置
每个芯片选择都可以独立配置其访问协议和设备数据宽度,这是GPMC灵活性的精髓。
1. 设备类型 (DEVICETYPE)
00b: 随机存取存储器(如NOR Flash, SRAM)。可进一步配置为异步或同步,复用或非复用模式。10b: NAND Flash设备。启用NAND专用协议控制器。
2. 数据宽度 (DEVICESIZE)
01b: 8位设备。数据仅使用GPMC_AD[7:0]。任何大于8位的系统访问(如16位或32位读/写)都会被GPMC拆分成连续的8位访问。例如,一个32位读取会被拆成4次8位读取,然后由GPMC在内部组装成一个32位字返回给CPU。10b: 16位设备。使用GPMC_AD[15:0]。32位访问会被拆分成2次16位访问。
3. 地址/数据复用 (MUXADDDATA)
00b: 非复用模式。地址和数据总线独立。01b: 地址/地址/数据复用模式(AAD)。先送高位地址,再送低位地址和数据,进一步节省地址线。10b: 地址/数据复用模式(AD)。先送地址,后送数据。
配置组合示例:连接一个16位、异步、地址数据复用的NOR Flash。
DEVICETYPE = 00bDEVICESIZE = 10bMUXADDDATA = 10bREADTYPE/WRITETYPE = 0b(表示异步访问)
重要提示:对于8位设备,
READMULTIPLE和WRITEMULTIPLE(突发读/写使能)位是“无关位”,GPMC只会执行单次访问。因为8位设备通常不支持突发模式。
4. 时序参数精讲与等待引脚机制
这是GPMC配置中最复杂、最核心的部分,直接关系到访问的稳定性和性能。时序参数都是以GPMC_FCLK周期数为单位进行配置的。
4.1 关键时序参数解析
我们需要配置一系列时间参数,来定义每个控制信号在访问周期中的“动作时序图”。主要参数包括:
| 参数名 | 对应寄存器字段 | 描述 |
|---|---|---|
CSONTIME | GPMC_CONFIG2_i[3:0] | 从访问开始到片选信号(CSn)有效的延迟周期数。 |
CSRDOFFTIME/CSWROFFTIME | GPMC_CONFIG2_i[11:8]/... | 读/写访问中,从最后一个数据周期结束到CSn无效的延迟。 |
ADVONTIME | GPMC_CONFIG3_i[3:0] | 从访问开始到地址有效信号(ADVn)有效的延迟。 |
ADVRDOFFTIME/ADVWROFFTIME | GPMC_CONFIG3_i[11:8]/... | 读/写访问中,ADVn信号无效的时间点。 |
OEONTIME | GPMC_CONFIG4_i[3:0] | 读访问中,从访问开始到输出使能(OEn)有效的延迟。 |
OEOFFTIME | GPMC_CONFIG4_i[11:8] | 读访问中,OEn信号无效的时间点。 |
WEONTIME | GPMC_CONFIG4_i[19:16] | 写访问中,从访问开始到写使能(WEn)有效的延迟。 |
WEOFFTIME | GPMC_CONFIG4_i[27:24] | 写访问中,WEn信号无效的时间点。 |
RDACCESSTIME/WRACCESSTIME | GPMC_CONFIG5_i[4:0]/... | 读/写访问时间。定义从OEn/WEn有效到数据被采样/写入的持续时间。这是最关键的参数。 |
RDCYCLETIME/WRCYCLETIME | GPMC_CONFIG5_i[12:8]/... | 读/写周期时间。定义一次完整的读/写操作的最小周期长度。必须大于等于ACCESSTIME加上其他控制信号的前后时间。 |
如何从芯片数据手册计算这些参数?我们以一个异步NOR Flash的读时序为例,假设其关键参数如下:
t_CE(Chip Enable Access Time): 最大70nst_OE(Output Enable Access Time): 最大25nst_DF(Chip Disable to Output Hi-Z): 最大30nst_OH(Output Hold Time): 10ns- 系统
GPMC_FCLK= 100MHz (周期T=10ns)
计算步骤:
- 确定
RDACCESSTIME:这是保证数据稳定的核心时间。它必须覆盖从OEn有效到数据有效的时间(t_OE),以及从CSn有效到数据有效的时间(t_CE), 取两者中最长的路径。这里t_CE(70ns) >t_OE(25ns)。所以RDACCESSTIME≥ 70ns。换算成周期数:70ns / 10ns = 7个周期。通常再加1-2个周期余量,设为8或9。 - 确定
OEOFFTIME:OEn必须在数据被GPMC采样之后,再保持一段时间以满足芯片的t_OH。同时,OEn的无效不能早于CSn无效减去t_DF(防止总线冲突)。需要综合计算。一个保守的做法是让OEn和CSn同时或稍晚于CSn无效。 - 确定
RDCYCLETIME:总周期时��必须 ≥CSONTIME+RDACCESSTIME+CSRDOFFTIME。你需要先设定CSONTIME和CSRDOFFTIME(例如各设为1个周期),那么RDCYCLETIME至少为 1 + 8 + 1 = 10个周期。
这个过程需要反复对照GPMC时序图和芯片时序图,确保每一个建立时间、保持时间都得���满足。
4.2 等待引脚(WAIT)监控的深入剖析
等待引脚是GPMC与速度不确定或可变延迟设备协同工作的“握手”机制。当设备需要更多时间准备数据时,可拉低WAIT信号,GPMC检测到后会自动延长访问周期。
1. 基本配置
WAITPINSELECT: 选择使用WAIT0还是WAIT1引脚。WAITxPINPOLARITY: 定义等待信号有效电平(通常是低有效)。WAITREADMONITORING/WAITWRITEMONITORING: 分别使能读/写访问的等待监控。
2. 异步访问下的等待监控(难点)对于异步访问,WAIT信号是异步采样的。手册强调了一个关键点:为了确保GPMC内部能正确采样到WAIT信号的状态,该信号必须在RDACCESSTIME或WRACCESSTIME结束前至少2个GPMC_FCLK周期就达到稳定有效电平。这意味着,你设置的ACCESSTIME值,实际上定义了一个“等待无效窗口”。在这个窗口结束前2个周期,WAIT信号必须已经稳定(无论是有效还是无效)。如果设备在窗口结束前很晚才释放WAIT,GPMC可能无法在当个周期捕获到变化,导致采样错误数据。
举例说明: 假设RDACCESSTIME配置为8个周期(80ns)。你的Flash芯片t_CE最大70ns,但某些情况下可能需要100ns。
- 如果不使用
WAIT,GPMC会在第8个周期末采样数据,此时若数据未就绪,则读取出错。 - 如果使用
WAIT,Flash在CSn有效后,如果100ns时数据才就绪,它应在第8-2=6个周期结束前(即60ns前)就拉低WAIT信号。GPMC在第6周期采样到WAIT有效,就会冻结周期计数器,直到检测到WAIT无效(数据就绪)后,再经过WAITMONITORINGTIME定义的额外延迟,才采样数据。 WAITMONITORINGTIME:这个参数用于在WAIT无效后,再插入几个GPMC_CLK周期的延迟才采样数据。用于满足一些芯片在WAIT无效后数据还需要一段准备时间的要求。
3. 同步访问下的等待监控对于同步访问,WAIT信号在GPMC_CLK的上升沿被同步采样。WAITMONITORINGTIME在这里的含义不同,它表示WAIT信号提前于目标时钟周期被采样的“流水线深度”。
- 如果
WAITMONITORINGTIME=0,WAIT在数据有效的同一个GPMC_CLK周期被采样。 - 如果
WAITMONITORINGTIME=1,WAIT在数据有效的前一个GPMC_CLK周期被采样。 这允许WAIT信号有更长的布线延迟,提高了系统设计的灵活性。
调试技巧:
WAIT引脚功能不正常是导致存储器访问失败的常见原因。首先用示波器同时测量CSn、OEn、WAIT和数据线。观察WAIT是否被设备正确拉低,以及拉低/释放的时机是否满足GPMC的建立时间要求(异步访问前2周期稳定)。其次,检查WAITPINPOLARITY配置是否正确(低有效还是高有效)。最后,确认WAITREADMONITORING和WAITWRITEMONITORING位是否已使能。
5. 高级功能与系统集成考量
5.1 总线周转与访问间隔控制
当总线上挂载了多个设备,尤其是不同速度的设备时,为了防止总线冲突和保证信号完整性,需要控制访问之间的间隔。
1. 总线周转时间 (BUSTURNAROUND)这个参数用于防止读操作之后立即进行写操作或切换到另一个芯片选择时发生数据总线冲突。在读操作结束时,GPMC的数据总线方向是从外部设备输入(IN)。如果立即开始一个写操作,GPMC会驱动总线输出(OUT),而外部设备可能还未将其输出驱动器置为高阻态,就会发生两个源同时驱动总线的冲突。BUSTURNAROUND定义了一个延迟时间,在读操作的CSn或OEn无效(以先发生者为准)后开始计时。在此延迟期间,GPMC将数据总线置于高阻态,等待外部设备完全释放总线。延迟结束后,才开始下一次访问。
何时需要设置BUSTURNAROUND?
- 读操作后,切换到另一个芯片选择进行读/写。
- 读操作后,对同一芯片选择进行写操作。
- 读操作后,对任何配置为地址/数据复用模式的设备进行访问(因为总线方向需要切换)。
2. 同芯片选择访问间隔 (CYCLE2CYCLESAMECSEN)有些存储器芯片要求两次访问之间,其片选信号CSn必须有一个最小的高电平时间(t_CSH)。这个参数就是用来满足这个要求的。使能后,GPMC会在一次访问的CSOFFTIME结束后,插入CYCLE2CYCLEDELAY个周期的空闲时间,才启动对同一芯片选择的下一次访问。
3. 不同芯片选择访问间隔 (CYCLE2CYCLEDIFFCSEN)当快速切换不同芯片选择时,前一个芯片选择的控制信号(如WEn)可能还未完全失效,后一个芯片选择的信号就有效了,造成信号重叠。此功能强制在两个不同CS的访问之间插入CYCLE2CYCLEDELAY个周期的间隔,确保信号有干净的切换时间。
配置策略: 通常,BUSTURNAROUND是必须根据总线负载和器件速度设置的(典型值2-3个周期)。CYCLE2CYCLESAMECSEN和CYCLE2CYCLEDIFFCSEN则根据具体存储芯片的时序要求决定。如果不确定,可以保守地使能并设置1-2个周期的延迟,以确保稳定性,代价是损失一点带宽。
5.2 错误处理与调试寄存器
GPMC提供了基本的错误处理机制,这对于驱动开发和系统调试至关重要。
GPMC_ERR_TYPE寄存器:记录发生的错误类型。例如,访问了一个未使能(CSVALID=0)的芯片选择区域,或者访问的地址落在了两个使能的芯片选择的重叠区域,都会触发错误并将错误类型记录在此。GPMC_ERR_ADDR寄存器:当错误发生时,触发该错误的访问地址会被捕获到这里。
调试流程:
- 如果系统在访问外部存储器时发生数据中止或预取中止,首先检查这两个寄存器。
- 如果
GPMC_ERR_TYPE[0] ERRORVALID位为1,表示有错误记录。 - 查看错误类型位段,确定是地址解码错误还是其他错误。
- 读取
GPMC_ERR_ADDR,得到出错的访问地址。 - 根据地址,检查你的芯片选择基地址和掩码配置是否正确,是否存在地址空间重叠。
- 清除错误标志(通过写
ERRORVALID位)后,才能记录新的错误。
一个常见的坑:在修改芯片选择配置(如基地址、掩码、时序)时,必须先禁用该芯片选择(设置
CSVALID=0),修改完成后,再重新使能。手册明确指出,配置必须在CS无效时进行。同时,在禁用CS前,要确保没有正在进行的对该CS的访问(例如DMA传输或预取操作),否则可能导致总线挂起。
5.3 功耗管理与复位
GPMC集成在SoC的CORE电源域,其功耗管理遵循系统的统一策略。
- 时钟自动门控 (
AUTOIDLE):当GPMC内部没有活动时,自动关闭GPMC_FCLK时钟,以节省动态功耗。在大多数应用中,建议使能此功能。 - 从机空闲模式 (
SIDLEMODE):当系统请求GPMC进入空闲状态时,可以配置为强制空闲、无空闲或智能空闲模式。智能空闲模式(Smart-idle)通常是最佳选择,它允许GPMC在内部FIFO为空且无访问请求时自动进入低功耗状态。
GPMC模块本身可以通过GPMC_SYSCONFIG[1] SOFTRESET位进行软件复位。这将把所有GPMC寄存器重置为默认值,并复位内部状态机。在进行任何关键的配置修改前,执行一次软件复位是一个好习惯,可以确保从一个已知的干净状态开始配置。复位完成后,需要查询GPMC_SYSSTS[0] RESETDONE位变为1。
6. 配置流程与实战检查清单
基于以上分析,一个完整的GPMC初始化配置流程如下:
- 确定硬件连接:确认存储器的类型(NOR/NAND/SRAM)、数据宽度(8/16位)、是否复用、
WAIT引脚是否连接。 - 计算时钟分频:根据
GPMC_FCLK频率和存储器最大操作频率,��定GPMCFCLKDIVIDER。 - 配置芯片选择区域:
- 根据存储器容量和系统内存映射,确定基地址(
BASEADDRESS)和掩码(MASKADDRESS)。 - 务必先禁用CS(
CSVALID=0)。 - 写入基地址和掩码。
- 根据存储器容量和系统内存映射,确定基地址(
- 配置设备类型与接口:
- 设置
DEVICETYPE(NOR/SRAM为00b, NAND为10b)。 - 设置
DEVICESIZE(8位为01b,16位为10b)。 - 设置
MUXADDDATA(非复用00b, AD复用10b, AAD复用01b)。
- 设置
- 配置时序参数(最繁琐的一步):
- 查阅存储器数据手册,获取所有关键时序参数(
t_CE,t_OE,t_WE,t_DF等)。 - 根据
GPMC_FCLK周期,将时间参数转换为周期数,并增加适当余量(通常增加10%-20%)。 - 依次配置
CONFIG2到CONFIG5中的各个时间参数寄存器。特别注意RDACCESSTIME/WRACCESSTIME和RDCYCLETIME/WRCYCLETIME的匹配关系。
- 查阅存储器数据手册,获取所有关键时序参数(
- 配置高级选项:
- 如果需要,配置
WAITPINSELECT,WAITxPINPOLARITY,WAITREAD/WRITEMONITORING和WAITMONITORINGTIME。 - 配置
BUSTURNAROUND(通常需要)、CYCLE2CYCLEDELAY及相关使能位。 - 配置
TIMEPARAGRANULARITY,如果所有时序参数需要加倍(用于极低速设备)。
- 如果需要,配置
- 最终使能与测试:
- 将
CSVALID位设为1,使能芯片选择。 - 进行简单的读写测试:向配置的地址写入一个已知模式(如0xAA55),然后读回比较。
- 如果使用
WAIT,在测试中故意插入延迟,观察访问时间是否被正确延长。 - 如果失败,使用示波器或逻辑分析仪抓取
CSn、OEn/WEn、ADVn、WAIT、地址和数据线的波形,与存储芯片数据手册的时序图和GPMC配置的预期时序进行逐项对比调试。
- 将
GPMC的配置就像为处理器和存储器之间精心编排一场舞蹈,每一个时序参数都是一个舞步的节拍。理解每个参数背后的物理意义,并严谨地根据数据手册计算,是确保这场舞蹈流畅无误的关键。虽然初始配置略显复杂,但一旦掌握,它将成为你驾驭各种外部存储设备的强大工具。