嵌入式系统EMIFA接口配置:从时序参数到寄存器实战

📅 2026/7/22 17:20:14
嵌入式系统EMIFA接口配置:从时序参数到寄存器实战
1. 项目概述与核心挑战在嵌入式系统开发中处理器与外部存储器的通信是决定系统性能与稳定性的基石。无论是运行复杂算法的工业控制器还是需要快速启动的通信设备都离不开SDRAM、异步SRAMASRAM或NAND Flash这类外部存储器。然而处理器内部的时钟频率动辄数百兆赫兹而外部存储器的数据手册给出的却是以纳秒为单位的时序参数这两者之间存在着天然的“语言鸿沟”。外部存储器接口EMIFA模块正是为解决这一鸿沟而生的“翻译官”和“协调员”。它的核心任务是将处理器高速、规整的时钟节拍翻译成外部存储器能够“听懂”的、带有特定延时和宽度的控制信号如片选CS、写使能WE、输出使能OE。这个翻译过程绝非简单的等比例缩放而是需要开发者根据存储器的物理特性精确计算出EMIFA内部各个时序控制寄存器如SDCR、CEnCFG的配置值。这就像为一场精密的多方会谈制定议程表每个发言者的起止时间、发言时长、间隔休息都必须严丝合缝否则就会导致数据错乱、系统崩溃。我经历过不少项目初期因为EMIFA配置不当系统时而能启动时而“罢工”排查起来令人头疼。问题的根源往往在于只看了数据手册的“推荐值”却忽略了PCB走线延迟、信号完整性等“现场因素”。本文将以德州仪器TI的EMIFA模块为例结合K4S641632H-TC(L)70 SDRAM、TC55V16100FT-12 ASRAM和HY27UA081G1M NAND Flash这三类典型存储器深入拆解从时序参数理解、寄存器计算到实战配置的全过程。我会分享如何从数据手册的一堆参数中提炼出关键信息如何将纳秒转换为时钟周期以及如何将PCB延迟这个“隐藏变量”纳入计算最终实现稳定可靠的存储器访问。2. EMIFA接口原理与寄存器框架解析2.1 EMIFA的角色与工作模式EMIFA本质上是一个高度可配置的并行接口控制器。它位于处理器内核与外部存储器总线之间负责接收处理器的内存访问请求并按照预先配置好的“剧本”在正确的时刻驱动地址线、数据线和一系列控制信号。其核心设计思想是通过软件配置的灵活性来适配硬件电路的固定时序要求。EMIFA主要支持三种工作模式对应三种主流的存储器类型同步动态随机存取存储器SDRAM模式用于连接高速、大容量的SDRAM。SDRAM与控制器共享同一个时钟所有操作都与时钟边沿同步。配置重点在于SDRAM配置寄存器SDCR和SDRAM时序寄存器SDTIMR用于设置CAS延迟、行列地址选通延迟、刷新周期等。异步SRAMASRAM模式用于连接无需时钟同步的静态RAM。访问时序完全由EMIFA发出的控制信号如EMA_OEEMA_WE的宽度和相对位置决定。配置核心是异步配置寄存器CEnCFG需要精细计算Setup、Strobe、Hold三个时间段的时钟周期数。NAND Flash模式用于连接大容量、低成本的非易失性NAND Flash。其访问流程复杂包含命令、地址、数据多个阶段且需要EMIFA支持特定的Flash控制逻辑通过NAND Flash控制寄存器NANDFCR使能和错误校验ECC。注意一个常见的误区是认为配置EMIFA就是简单填几个寄存器值。实际上这是一个系统性的时序匹配工程。你需要同时扮演“时序翻译官”和“信号完整性工程师”两个角色既要读懂存储器的“需求说明书”数据手册也要预判信号在电路板上的“旅行时间”PCB延迟。2.2 关键寄存器功能详解EMIFA的寄存器是其可编程性的体现。理解每个寄存器的位域含义是进行正确配置的前提。以下是几个最核心的寄存器SDRAM配置寄存器SDCR - 0x08h此寄存器定义了SDRAM芯片的基本工作模式。SR位31自刷新使能。通常配置为0由软件控制刷新避免EMIFA在非活动期意外进入自刷新。NM位14数据总线宽度。0代表8位1代表16位。必须与硬件连接完全一致否则会导致数据错位。CL位11-9CAS延迟。这是SDRAM最重要的时序参数之一例如011b代表CL3。该值必须等于或大于SDRAM芯片数据手册中规定的最小值。IBANK位6-4内部Bank数量。根据芯片规格选择如010b代表4个Bank。PAGESIZE位2页大小。0代表256字Word1代表512字。需与SDRAM芯片的列地址位数对应。异步配置寄存器CEnCFG - 0x10h, 0x14h...每个片选空间CE2-CE5都有一个独立的CEnCFG寄存器用于配置连接到该片选的异步存储器ASRAM或NOR Flash的时序。其核心是三个参数组W_SETUP / R_SETUP位27-24 位11-8建立时间。在有效操作读或写开始前地址和片选信号需要提前保持稳定的时钟周期数。W_STROBE / R_STROBE位23-16 位7-0选通时间。写使能EMA_WE或读使能EMA_OE信号保持有效的时钟周期数。这直接决定了读写脉冲的宽度。W_HOLD / R_HOLD位31-28 位15-12保持时间。在有效操作结束后地址和片选信号需要继续保持稳定的时钟周期数。TA位19-16周转时间。在一次读操作之后、一次写操作开始之前需要插入的空闲时钟周期数用于防止数据总线冲突。NAND Flash控制寄存器NANDFCR - 0x60h用于将特定的片选空间配置为NAND Flash模式。例如将CS2NAND位位2设置为1则CE2空间将被识别为NAND FlashEMIFA会生成符合NAND Flash协议的控制信号序列命令锁存使能CLE、地址锁存使能ALE。一个关键的编程细节除了SDCR寄存器支持字节写入EMIFA的其他所有寄存器都必须使用32位字Word访问。进行8位或16位写入会导致未定义行为。在C代码中务必使用volatile uint32_t*指针进行寄存器操作。3. SDRAM接口配置实战以K4S641632H为例SDRAM的配置相对规整因为其操作是同步的。我们的目标是将一个具体的SDRAM芯片如三星的K4S641632H-TC(L)70与EMIFA正确对接。3.1 芯片参数解读与SDCR计算首先查阅K4S641632H的数据手册我们需要关注以下关键参数组织架构64Mbit容量组织为4Mbit x 16位 x 4 Banks。这决定了NM116位总线IBANK010b4个内部Bank。CAS延迟CL该芯片在100MHz及以上时钟频率下典型的CL值为3个时钟周期。因此CL011b。突发类型与长度通常由SDTIMR寄存器配置本例中未涉及但一般设为顺序突发、长度为4或8。其他PAGESIZE根据列地址数决定对于此芯片列地址为9位对应页大小为512位但EMIFA的PAGESIZE位定义可能不同需根据手册选择。在TI的示例中他们选择了PAGESIZE0256字。根据TI官方手册给出的示例配置Table 18-30汇总如下SDCR字段值说明SR0禁用自刷新NM116位数据总线CL011bCAS延迟 3BIT11_9LOCK1允许CL字段被写入IBANK010b4个内部BankPAGESIZE0页大小 256字将这些二进制值组合起来并填充未使用位为0即可得到SDCR寄存器的值。如图18-22所示最终计算出的值为0x4720。这个值需要被写入到EMIFA的SDCR寄存器偏移地址0x08h中。3.2 SDRAM初始化序列与SDTIMR配置配置SDCR只是第一步。SDRAM在上电后必须经过一个严格的初始化序列才能进入正常工作状态。这个序列通常包括上电并保持稳定时钟通常200μs。发送预充电所有Bank命令。发送多个通常为2个自动刷新命令。配置模式寄存器通过SDCR的写入操作触发EMIFA内部完成。EMIFA的SDRAM时序寄存器SDTIMR则用于配置与性能相关的时序参数如TRC行周期时间Row Cycle Time。TRAS行有效到预充电时间Active to Precharge Delay。TWR写恢复时间Write Recovery Time。TRCD行到列延迟RAS to CAS Delay。TRRD行激活到行激活延迟Row Active to Row Active Delay。这些参数的值需要从SDRAM数据手册的“AC电气特性”表中查找最小值然后转换为EMIFA时钟周期数向上取整。例如如果TRC_min 60nsEMIFA时钟周期tcyc 10ns则TRC字段应配置为ceil(60/10) 6个周期。实操心得SDRAM初始化失败是常见问题。除了检查SDCR/SDTIMR值务必确保供电稳定上电延时足够且初始化序列的每一步都由软件正确触发有时需要向特定地址写入特定数据来模拟命令。使用逻辑分析仪抓取EMA_SDCKE、EMA_SDRAS、EMA_SDCAS、EMA_WE和EMA_BA[1:0]这些SDRAM专用控制信号是验证初始化序列是否被正确执行的最直接方法。4. 异步SRAMASRAM时序分析与配置精解ASRAM的配置是EMIFA应用中最体现“时序匹配”精髓的部分。它没有时钟完全依靠EMIFA生成的异步信号时序。4.1 理想情况下的时序计算模型我们以连接TC55V16100FT-12芯片为例。核心任务是计算CEnCFG寄存器中的R_SETUPR_STROBER_HOLDW_SETUPW_STROBEW_HOLD和TA这七个字段的值。第一步收集双方数据手册参数。EMIFA端以100MHz为例tcyc 10nstSU: 数据建立时间Data Setup Time即EMIFA要求数据在EMA_OE变高前多久必须稳定。假设为5ns取典型值。tH: 数据保持时间Data Hold Time即EMA_OE变高后数据还需保持稳定的时间。通常为0ns。ASRAM端TC55V16100FT-12tACC: 地址访问时间最大12ns。tOH: 输出保持时间最小3ns。tRC: 读周期时间最小12ns。tWP: 写脉冲宽度最小8ns。tAW: 地址有效到写结束时间最小9ns。tDS: 数据建立时间最小7ns。tWR,tDH,tWC等。第二步理解波形与公式。EMIFA手册中的图18-23和18-24以及推导出的公式是计算的唯一依据。公式的本质是用EMIFA的时钟周期tcyc作为尺子去度量ASRAM要求的纳秒级时间窗并确保EMIFA产生的信号波形能完全覆盖这个时间窗。以读周期为例关键公式如下公式中的(m)表示存储器参数的最大或最小值总周期约束R_SETUP R_STROBE R_HOLD ceil(tRC(m) / tcyc) - 3为什么减3因为EMIFA内部逻辑需要一些固定开销周期。这确保了整个读操作的时间跨度不小于ASRAM要求的最小读周期tRC。数据有效窗口约束R_SETUP R_STROBE ceil( (tACC(m) - tSU) / tcyc ) - 2这是最关键的公式。它保证了从EMIFA发出地址到ASRAM输出数据稳定再到EMIFA在EMA_OE变高前采样数据这个完整链路的时间是足够的。tACC是ASRAM的响应时间tSU是EMIFA的采样要求两者之差就是留给数据传输路径的净时间。输出保持约束R_HOLD ceil( (tH tOH(m)) / tcyc ) - 1保证EMA_OE无效后数据总线上的数据还能保持稳定一段时间tOH以满足ASRAM的要求并为总线切换提供缓冲。第三步代入计算。将tcyc10nstSU5nstACC12nstOH3nstRC12ns代入公式公式1:R_SETUP R_STROBE R_HOLD ceil(12/10) - 3 2 - 3 -1 显然结果必须0所以此约束在理想情况下很宽松。公式2:R_SETUP R_STROBE ceil((12-5)/10) - 2 ceil(0.7) - 2 1 - 2 -1 同样结果需0。公式3:R_HOLD ceil((03)/10) - 1 ceil(0.3) - 1 1 - 1 0。计算TA周转时间TA ceil( (tCOD(m)) / tcyc ) - 1其中tCOD是芯片禁用时间。代入tCOD7ns得TA ceil(7/10)-1 1-10。因此在理想无延迟情况下所有参数计算值均为0或负数最终我们可以将所有字段配置为0。这意味着在100MHz下EMIFA的默认单周期访问就能满足这颗ASRAM的时序要求。4.2 引入PCB延迟后的现实世界计算上面的“理想情况”在实验室的完美条件下可能成立但在真实的电路板上信号在走线上传输会产生延迟。这就是图18-25和18-26以及其对应公式要解决的问题。PCB延迟tEM_AtEM_DtEM_OE等是信号从EMIFA引脚发出到达存储器引脚的时间或反向。这些延迟通常通过仿真如IBIS模型或根据经验规则如每英寸走线约180ps延迟估算。考虑延迟后公式变得复杂但更精确。例如考虑PCB延迟后的读周期数据窗口公式变为R_SETUP R_STROBE ceil( (tEM_A tACC(m) - tSU - tEM_D) / tcyc ) - 2解读tEM_A是地址线的正向延迟它让地址晚一些到达ASRAM相当于“吃掉”了一部分有效时间。-tEM_D是数据线的反向延迟它让数据晚一些回到EMIFA又“吃掉”了一部分时间。因此PCB延迟恶化了时序裕量。假设我们测得或估算tEM_A 0.27ns地址线延迟tEM_D 0.45ns数据线延迟tEM_OE 0.36ns控制线延迟重新代入考虑延迟的公式计算R_SETUP R_STROBE ceil((0.27 12 - 5 - 0.45)/10) - 2 ceil(6.82/10) - 2 1 - 2 -1虽然本例中即使加入延迟计算结果仍为0但这个过程清晰地展示了方法论。当系统时钟频率更高tcyc更小或PCB走线更长、更复杂时这些延迟值会显著影响计算结果必须手动增加Setup或Strobe周期数来补偿。避坑指南对于高速设计如EMIFA时钟100MHz千万不要忽略PCB延迟。一个稳妥的做法是在理论计算值的基础上为每个关键参数尤其是Setup和Strobe增加1个时钟周期的设计裕量Margin。例如如果计算出的R_STROBE为2实际配置为3。这能为温度变化、电压波动和工艺偏差提供缓冲大幅提升系统的可靠性。5. NAND Flash接口配置的特殊性与实践NAND Flash的接口配置思路与ASRAM类似但更复杂因为它将一个完整的访问如读页分解为命令、地址、数据三个独立的异步周期。5.1 NAND Flash访问协议与EMIFA的映射EMIFA不会自动生成NAND Flash协议所需的连续命令-地址-数据序列。它需要CPU通过多次写/读异步周期来模拟。例如读取一个页的数据需要写命令周期0x00到命令锁存端口。写多个地址周期列地址、行地址等写到地址锁存端口。读数据周期从数据端口连续读取。因此EMIFA的CEnCFG寄存器需要配置出一套同时能满足命令/地址写周期和数据读周期的时序参数。这通常意味着需要兼顾读写双方最苛刻的要求。5.2 时序计算实例HY27UA081G1M以配置HY27UA081G1M70nm工艺为例EMIFA时钟仍为100MHz。读周期计算重点R_STROBE必须同时满足tRP读脉冲宽度和tREA读使能访问时间的要求。公式为R_STROBE max( ceil((tREAtSU)/tcyc) ceil(tRP/tcyc) ) - 1。代入tREA60nstSU5nstRP60nstcyc10ns。ceil((605)/10)7ceil(60/10)6取最大值7减1得R_STROBE 6。R_SETUP由tCLR命令锁存到读使能低电平时间决定。R_SETUP ceil(tCLR/tcyc) - 1 ceil(10/10)-10。R_HOLD由tH和tCHZ片选高到输出高阻决定。R_HOLD ceil((tHtCHZ)/tcyc) - 1 ceil((020)/10)-11。总周期与数据窗口需校验R_SETUPR_STROBER_HOLD和R_SETUPR_STROBE是否满足tRC和tCEA的要求。计算过程略经校验上述值满足。TA周转时间在NAND Flash中尤为重要因为读操作后总线需要时间变为高阻态才能进行下一次写命令。TA max( ceil(tCHZ/tcyc) ceil((tRHZ - (R_HOLD1)*tcyc)/tcyc) ) - 1。计算后通常需要配置一个非零值例如本例中TA 1。写周期计算重点 写周期命令、地址、数据写入的配置通常由tWP写脉冲宽度、tDS数据建立时间等参数决定计算方法与ASRAM类似。对于HY27UA081G1M计算后可能得到W_STROBE 5W_SETUP 0W_HOLD 0。最终配置与NAND模式使能 综合读写要求并加入10ns的设计裕量如TI手册推荐后我们得到一组配置值。写入CE2CFG寄存器假设Flash接在CS2。最关键的一步必须将NANDFCR寄存器中的CS2NAND位对应片选2设置为1以启用NAND Flash控制逻辑。否则EMIFA只会将其当作普通异步存储器无法正确产生CLE和ALE信号。实操心得NAND Flash配置中最容易出错的地方是TA周转时间配置过小。如果读后立即写而总线还未释放会导致数据冲突表现为写入的命令或地址错误。如果遇到NAND Flash识别或读写不稳定首先用逻辑分析仪检查CLE、ALE、WE、RE这些控制信号的时序特别是连续读、写操作之间的间隔是否满足TA的要求。另一个常见问题是忘记使能NANDFCR中的对应位导致整个NAND接口无法工作。6. 寄存器配置实操与代码示例理解了原理和计算后最终的步骤是将计算出的数值转化为具体的寄存器写入操作。以下以TI的TMS320C6748 DSP为例展示如何用C代码进行配置。6.1 寄存器地址定义与宏首先需要定义EMIFA寄存器的基地址和结构体或宏。这通常在芯片的头文件中完成。// 假设 EMIFA 模块基地址 #define EMIFA_BASE 0x70000000 // 关键寄存器偏移量定义 (来自手册 Table 18-48) #define EMIFA_SDCR (*(volatile unsigned int *)(EMIFA_BASE 0x08)) #define EMIFA_CE2CFG (*(volatile unsigned int *)(EMIFA_BASE 0x10)) #define EMIFA_CE3CFG (*(volatile unsigned int *)(EMIFA_BASE 0x14)) #define EMIFA_NANDFCR (*(volatile unsigned int *)(EMIFA_BASE 0x60)) // 寄存器位域宏定义示例需根据具体手册调整 #define SDCR_NM_16BIT (1 14) #define SDCR_CL_3 (3 9) #define SDCR_IBANK_4 (2 4) // ... 其他位域定义6.2 配置函数实现然后编写配置函数将计算好的值写入寄存器。SDRAM配置示例K4S641632Hvoid configure_sdram_k4s641632h(void) { // 1. 配置SDCR寄存器为0x4720 // 根据位域组合SR0, NM1, CL3, BIT11_9LOCK1, IBANK4, PAGESIZE0 unsigned int sdcr_value 0; sdcr_value ~(1 31); // SR 0 sdcr_value | (1 14); // NM 1 (16-bit) sdcr_value | (3 9); // CL 3 (011b) sdcr_value | (1 8); // BIT11_9LOCK 1 (允许CL写入) sdcr_value | (2 4); // IBANK 2 (010b, 4 banks) sdcr_value ~(1 2); // PAGESIZE 0 (256 words) // 注意需要根据手册补齐其他保留位最终值应为0x4720 EMIFA_SDCR 0x4720; // 直接写入计算好的值 // 2. 配置SDTIMR时序寄存器此处需根据具体SDRAM芯片计算 // unsigned int sdtimr_value calculate_sdtimr_value(); // EMIFA_SDTIMR sdtimr_value; // 3. 执行SDRAM初始化序列通常通过向特定地址写入特定数据实现 // 此部分代码严重依赖具体处理器和SDRAM需参考芯片启动代码 // init_sdram_sequence(); }ASRAM配置示例TC55V16100FT-12 接在CS3void configure_asram_tc55v16100(void) { // 根据18.3.2.2.3节计算所有参数为0理想情况且时钟100MHz unsigned int ce3cfg_value 0; // 设置总线宽度为16位 (ASIZE 1) ce3cfg_value | (1 4); // ASIZE位在CEnCFG中的位置需查手册确认此处为示例 // 其他位W_SETUP/R_SETUP, W_STROBE/R_STROBE, W_HOLD/R_HOLD, TA 均为0 // SS0 (Normal Mode), EW0 (Extended Wait disabled) EMIFA_CE3CFG ce3cfg_value; }NAND Flash配置示例HY27UA081G1M 接在CS2void configure_nand_hy27ua081g1m(void) { // 1. 首先配置CE2CFG异步时序参数 // 根据18.3.2.3.3节计算并取整后的值已加margin: // R_SETUP2, R_STROBE7, R_HOLD0, TA2 // W_SETUP0, W_STROBE6, W_HOLD1, ASIZE0 (8-bit) unsigned int ce2cfg_value 0; ce2cfg_value | (2 8); // R_SETUP 2 ce2cfg_value | (7 0); // R_STROBE 7 // R_HOLD 0 (默认) ce2cfg_value | (2 16); // TA 2 // W_SETUP 0 (默认) ce2cfg_value | (6 16); // W_STROBE 6? 注意位域冲突需要按手册位域组合 ce2cfg_value | (1 12); // W_HOLD 1? 注意位域冲突 // ASIZE 0 (8-bit) 对应位清0 // 重要以上位域设置是示意实际必须根据寄存器位图精确移位和组合。 // 例如W_STROBE和R_STROBE、TA可能共用位域不能简单或运算。 // 正确做法是定义一个完整的位域或直接使用计算出的十六进制值。 // 假设最终计算出的CE2CFG值为 0x1C20072此值为假设需实际计算 EMIFA_CE2CFG 0x1C20072; // 2. 使能CS2的NAND Flash模式 EMIFA_NANDFCR | (1 2); // 设置CS2NAND位为1 }关键警告上面的NAND配置代码中关于ce2cfg_value的构建是高度简化和示意性的。在实际开发中绝对不能这样逐位或运算因为W_STROBE和R_STROBE等字段可能共享相同的位范围通过不同的位选择直接或运算会导致值错误。正确的做法是根据数据手册中CE2CFG寄存器的位图计算出最终的32位十六进制数值然后直接赋值。例如根据手册Table 18-46最终应写入CE2CFG的值是一个确定的数而不是分别设置位域。6.3 配置后的验证与调试配置完成后必须进行验证软件验证编写简单的读写测试程序。对SDRAM/ASRAM进行模式字如0xAA55AA55 0x55AA55AA的交替写入和读出比对。对NAND Flash先发送复位命令0xFF然后读取ID命令0x90来验证通信是否正常。硬件验证使用逻辑分析仪或示波器抓取关键信号线地址、数据、控制线。对照数据手册的时序图测量tACCtWPtRP等关键参数是否满足要求。这是排查疑难杂症的终极手段。压力测试进行长时间、全地址范围的连续读写测试以及高低温环境测试确保时序裕量充足。7. 常见问题排查与实战经验总结即使按照手册一步步计算和配置在实际项目中仍会遇到各种问题。以下是我总结的一些典型故障场景和排查思路问题1系统偶尔启动失败或运行一段时间后数据出错可能原因时序裕量不足处于临界状态。温度升高或电压波动导致时序违例。排查步骤检查计算过程确认是否使用了最坏情况Min/Max参数。务必加入设计裕量。将计算出的R_STROBE、W_STROBE等参数增加1-2个时钟周期。用示波器测量电源纹波确保存储器供电稳定。检查PCB布局确保时钟线和关键控制线如SDRAM的CLK CKE走线短且粗远离噪声源。问题2NAND Flash无法识别或读写错误。可能原因NAND Flash模式未使能NANDFCR寄存器配置错误。周转时间TA配置过小导致总线冲突。上电或复位后未给Flash足够长的初始化时间通常需要几毫秒。坏块管理或ECC未正确处理。排查步骤确认NANDFCR寄存器中对应片选的NAND位已置1。用逻辑分析仪抓取CLE、ALE、WE、RE信号检查命令0x90、地址、数据周期的时序是否符合Flash手册要求特别是连续操作间的间隔。在初始化代码中发送复位命令0xFF后添加至少1ms的延时。先实现简单的读ID和读页功能确认基础通信正常再实现复杂的擦写和ECC。问题3使用不同批次或品牌的同型号存储器系统表现不一致。可能原因不同厂商、甚至同厂商不同批次的芯片其AC时序参数可能存在差异尽管在标称范围内。解决方案在产品设计初期选择存储器芯片时应选择时序参数更宽松即数值更大的型号为未来供应链变化留出余量。在配置计算时使用数据手册中最大值Max或最小值Min中最苛刻的那个值进行计算。问题4高频率下如150MHz以上无法稳定工作。可能原因PCB信号完整性问题成为主导。包括反射、串扰、地弹等。解决思路终端匹配在SDRAM的数据线和地址线末端考虑添加串联匹配电阻例如22欧姆到33欧姆位置靠近处理器端以消除反射。等长布线对SDRAM的数据线组DQ、数据选通线DQS与时钟CLK进行等长布线误差控制在几十mil以内。电源完整性为存储器电源引脚提供充足、低阻抗的去耦电容每个电源引脚附近至少放置一个0.1uF的陶瓷电容。降低频率如果硬件设计已无法更改最后的办法是在软件中降低EMIFA的时钟频率牺牲性能换取稳定性。最后一点个人体会配置EMIFA这类存储器接口是嵌入式硬件工程师和底层软件工程师的交叉领域。它要求开发者既要有软件编程的精确性又要有硬件时序的全局观。最好的学习方式不是死记硬背公式而是亲手画一次时序图。在纸上画出EMIFA时钟、地址、数据、控制信号的波形标出每个时间参数再对照公式理解每个加减法的物理意义。做过一次这样的练习你对时序的理解会深刻得多。当系统最终稳定跑起来时你会觉得这一切繁琐的计算和调试都是值得的。