
1. 项目概述从SPI到OSPI的演进与核心价值在嵌入式系统开发中与外部存储器的通信速度和效率往往是决定系统启动时间和整体性能的关键瓶颈。传统的SPISerial Peripheral Interface接口以其简单的四线制SCLK, MOSI, MISO, CS和主从架构成为了连接Flash、EEPROM、传感器等外设的基石。然而随着应用对数据吞吐量需求的爆炸式增长标准SPI的串行单线或双线数据传输模式逐渐显得力不从心。为了解决这个问题行业催生了Quad SPIQSPI和更进一步的Octal SPIOSPI。OSPI顾名思义将数据线从标准的1条MOSI/MISO或4条QSPI扩展到了8条DQ0-DQ7。这不仅仅是数据通道数量的简单叠加更是一种通信范式的升级。在相同的时钟频率下OSPI的理论数据传输带宽是标准SPI的8倍是QSPI的2倍。这对于需要快速启动Fast Boot的物联网设备、需要实时加载大量固件或数据的汽车信息娱乐系统、以及高分辨率图形显示等应用场景而言是至关重要的性能提升。但OSPI带来的不仅仅是速度。为了管理这8条数据线、复杂的指令集如DDR双倍数据速率模式、以及诸如XIPeXecute In Place就地执行等高级功能硬件上需要一个高度集成的OSPI控制器。这个控制器内部包含了一系列可编程寄存器它们就像控制面板上的旋钮和开关让软件工程师能够精细地配置通信协议、时序参数、中断行为以及数据传输模式。理解并熟练配置这些寄存器是从“能用”到“用好”OSPI接口的必经之路。本文将以一个典型的嵌入式微控制器如TI CC35xx系列中的OSPI控制器为例深入剖析其寄存器架构、配置逻辑和实战技巧帮助你在项目中充分发挥OSPI的潜力。2. OSPI控制器寄存器全景与功能模块解析面对一份长达数十页的寄存器手册直接逐条阅读很容易迷失在细节中。我的经验是先建立宏观的模块化视图。一个完整的OSPI控制器寄存器集通常可以划分为几个核心功能模块每个模块负责一个相对独立的任务。理解这个架构后续的配置才能有的放矢。2.1 核心配置与模式控制模块这是OSPI控制器的“大脑”负责最基础的使能、模式选择和全局参数设置。其核心寄存器是位于偏移地址0x0的CONFIG寄存器。这个32位的寄存器几乎定义了OSPI的“人格”。我们拆开来看几个关键位域ENB_SPI (Bit 0): OSPI总使能开关。这是你配置任何功能前必须首先置1的位。在系统复位或低功耗模式唤醒后务必检查此位。ENB_DIR_ACC_CTLR (Bit 7) 和 ENB_LEGACY_IP_MODE (Bit 8): 这两个位决定了控制器的访问模式。直接访问模式 (Direct Access):ENB_DIR_ACC_CTLR1。在此模式下CPU或DMA可以通过AHB总线像访问内存一样直接读写Flash地址空间控制器自动将访问转换为OSPI时序。这是实现XIP代码就地执行的基础性能最高但对Flash的读写操作是阻塞的。间接访问模式 (Indirect Access):ENB_DIR_ACC_CTLR0并通过专门的间接传输控制寄存器发起操作。此模式适用于大数据块的非实时传输CPU可以启动传输后去处理其他任务通过中断或轮询等待完成。传统SPI模式 (Legacy Mode):ENB_LEGACY_IP_MODE1。此模式将OSPI控制器模拟成一个简单的、字节流的SPI设备通常用于兼容旧有软件或进行非常底层的调试会丧失OSPI的高带宽优势。MSTR_BAUD_DIV (Bits 22:19): 波特率分频器。这是计算通信时钟频率的关键。公式为SCLK频率 控制器参考时钟频率 / (2 * (Divisor 1))。例如参考时钟为100MHz设置MSTR_BAUD_DIV1则SCLK 100MHz / (2*2) 25MHz。设置MSTR_BAUD_DIV0则SCLK 100MHz / (2*1) 50MHz。注意这个分频值同时影响控制器模式和Flash设备端的时钟需确保不超过Flash支持的最大SCLK频率。ENTER_XIP_MODE (Bit 17) 和 ENTER_XIP_MODE_IMM (Bit 18): XIP模式入口控制。XIP模式允许CPU直接从Flash取指运行无需拷贝到RAM。通常流程是先通过间接访问模式发送特定命令序列如0xEB或0xED取决于Flash型号将Flash配置为XIP模式然后设置ENTER_XIP_MODE1。当下一次读指令到来时控制器将自动进入XIP模式后续的读操作将省略指令码直接发送地址读取数据。ENTER_XIP_MODE_IMM则用于Flash已通过非易失性配置位设置为上电即进入XIP模式的情况。PHY_MODE_ENABLE (Bit 3): PHY模块使能。对于高速OSPI通信尤其是DDR模式信号完整性至关重要。PHY物理层模块包含延迟锁定环DLL用于校准数据和时钟之间的时序关系补偿PCB走线延迟。在时钟频率较高例如50MHz或使用DDR模式时必须启用PHY并正确配置。实操心得配置CONFIG寄存器时切忌一次性写入所有值。建议的流程是先写入基础配置如使能、波特率确保通信链路基本建立例如能读取Flash ID。然后再逐步使能高级功能如XIP、PHY。这有助于问题定位。2.2 设备指令与通信协议配置模块OSPI控制器需要知道如何与具体的Flash芯片“对话”。不同的Flash厂商如Winbond, Macronix, Micron甚至同一厂商的不同型号其指令集、 dummy cycle空周期数量、数据采样边沿都可能不同。这个模块的寄存器就是用来适配这些差异的。DEV_INSTR_RD_CONFIG (偏移 0x4) / DEV_INSTR_WR_CONFIG (偏移 0x8): 读/写指令配置寄存器。这是最重要的适配寄存器之一。RD_OPCODE_NON_XIP/WR_OPCODE: 设置非XIP模式下的读/写操作码。例如标准SPI读通常是0x03而OSPI快速读可能是0xEB带8个dummy cycle的Octal DDR读。INSTR_TYPE: 定义指令本身的传输模式SIO, DIO, QIO, Octal-IO。对于OSPI Flash通常设置为3Octal-IO。ADDR_XFER_TYPE_STD_MODE和DATA_XFER_TYPE_EXT_MODE: 分别定义地址阶段和数据阶段的传输模式。这里有一个关键点许多OSPI Flash支持“混合”模式。例如指令和地址可能以Octal IO模式发送8根线但数据以DDR模式传回。这就需要仔细搭配DDR_EN位和这些模式位。DUMMY_RD_CLK_CYCLES: 读指令后的空时钟周期数。这是Flash内部数据准备所需的时间必须严格按照Flash数据手册设置否则读回的数据会是错误的。0xEB指令通常对应8个dummy cycle。MODE_BIT_ENABLE和DDR_EN: 模式位使能和DDR使能。在发送读指令如0xEB后、地址之前有时需要发送一个8位的“模式字节”通常用于配置DDR或保持IO线状态。MODE_BIT_ENABLE置1后模式字节的值来自MODE_BIT_CONFIG寄存器。DDR_EN则告知控制器后续的数据传输是双倍数据速率。DEV_DELAY (偏移 0xC): 设备延时控制寄存器。它定义了片选信号(n_ss_out)与数据时钟之间的时序关系对于连接多个Flash设备或满足特定Flash的建立/保持时间要求至关重要。D_INIT: 从拉低片选到发送第一个数据位之间的延迟。D_AFTER: 最后一个数据位发送完毕到拉高片选之间的延迟。D_BTWN: 切换不同片选设备时两个片选信号之间的空闲时间。D_NSS: 片选信号无效高电平的最小保持时间。 这些延时参数的单位是控制器参考时钟周期。在高速通信下即使几个周期的偏差也可能导致通信失败。调试技巧当通信不稳定时可以尝试微调D_INIT和D_AFTER这相当于调整了信号的有效窗口。2.3 内存映射、保护与间接传输控制模块这个模块负责管理CPU视角的“内存地址”如何映射到Flash的物理地址以及如何发起高效的块数据传输。DEV_SIZE_CONFIG (偏移 0x14): 设备大小配置寄存器。告诉控制器每个片选CS0-CS3上连接的Flash容量512Mb, 1Gb, 2Gb, 4Gb。控制器据此计算地址线宽度。NUM_ADDR_BYTES字段定义了地址字节数3或4必须与Flash实际容量匹配。REMAP_ADDR (偏移 0x24): 地址重映射寄存器。当CONFIG.ENB_AHB_ADDR_REMAP1时所有来自AHB总线的访问地址都会加上这个寄存器中的值再发送给Flash。这在需要将Flash映射到特定内存区域如0x6000_0000时非常有用。LOWER_WR_PROT / UPPER_WR_PROT / WR_PROT_CTRL (偏移 0x50, 0x54, 0x58): 写保护控制寄存器组。它们定义了一个受保护的地址范围以块为单位块大小由DEV_SIZE_CONFIG.BYTES_PER_SUBSECTOR定义。当写保护使能后对该区域的写操作会被控制器拒绝并产生中断。这是防止关键数据如引导程序被意外擦写的重要硬件机制。间接传输寄存器组 (偏移 0x60 - 0x7C): 这是实现高效DMA传输的核心。INDIRECT_READ_XFER_START/INDIRECT_WRITE_XFER_START: 设置传输的起始Flash地址。INDIRECT_READ_XFER_NUM_BYTES/INDIRECT_WRITE_XFER_NUM_BYTES: 设置要传输的总字节数。注意这个值可以大于内部SRAM缓冲区的大小控制器会自动管理分块传输。INDIRECT_READ_XFER_CTRL.START/INDIRECT_WRITE_XFER_CTRL.START: 写入1启动传输。INDIRECT_READ_XFER_WATERMARK/INDIRECT_WRITE_XFER_WATERMARK: 水位线寄存器。对于读操作当SRAM中积累的数据量超过此水位线可以触发DMA请求将数据搬走对于写操作当SRAM空闲空间低于此水位线可以触发DMA请求填充新数据。合理设置水位线可以平衡吞吐量和延迟。INDIRECT_TRIGGER_ADDR_RANGE: 定义了当AHB总线访问某个特定地址范围时自动触发间接读操作并将数据返回的机制可用于实现某种“影子”或缓存功能。2.4 中断、状态与PHY高级配置模块IRQ_STATUS (偏移 0x40) 和 IRQ_MASK (偏移 0x44): 中断状态和掩码寄存器。OSPI控制器提供了丰富的中断源如传输完成(INDIRECT_OP_DONE)、FIFO空/满、写保护违规(PROT_WR_ATTEMPT)、DMA水位线触发等。在启用中断驱动编程时必须正确配置掩码寄存器并在中断服务程序(ISR)中读取状态寄存器并清除相应标志写1清除。PHY_CONFIGURATION (偏移 0xB4) 和 PHY_MASTER_CONTROL (偏移 0xB8): PHY配置寄存器。这是高速OSPI调试中最复杂但也最关键的部分。PHY模块通过DLL动态调整数据采样点以补偿时钟-数据偏移skew。PHY_CONFIG_TX_DLL_DELAY/PHY_CONFIG_RX_DLL_DELAY: 手动设置TX和RX路径的固定延迟值。在调试初期或DLL无法锁定时可以尝试手动配置。PHY_MASTER_CONTROL: 控制DLL的工作模式锁定全周期/半周期、旁路模式等。DLL_OBSERVABLE_LOWER/DLL_OBSERVABLE_UPPER: 只读寄存器用于观察DLL的锁定状态(DLL_LOCK)、锁定值(LOCK_VALUE)等是判断PHY是否正常工作的“仪表盘”。FLASH_COMMAND_CTRL (偏移 0x90) 及相关寄存器: 这是一个通用的“命令发射器”。你可以通过它向Flash发送任何自定义指令如擦除扇区0x20、读状态寄存器0x05、写使能0x06等并指定地址、数据、dummy周期。这在初始化、擦除、编程Flash特定区域时非常有用无需切换控制器模式。3. OSPI控制器初始化与典型工作流程实战理解了寄存器模块后我们来看一个完整的、从零开始的OSPI控制器初始化及数据读写流程。假设我们要连接一颗支持Octal DDR模式的1Gb OSPI Flash并希望实现XIP启动。3.1 初始化配置流程详解初始化必须遵循严格的顺序否则可能导致控制器或Flash进入不可预测的状态。步骤一基础时钟与引脚复用配置在操作OSPI控制器寄存器之前首先要确保系统时钟已配置且提供给OSPI控制器的参考时钟ref_clk已启用并稳定。对应的OSPI引脚SCLK, DQ[7:0], CS#, 可能还有DQS已通过芯片的IO复用功能正确映射到OSPI外设而非GPIO或其他功能。这一步通常在芯片的PinMux配置模块中完成。步骤二软件复位与控制器使能虽然硬件复位后控制器处于默认状态但进行软件复位是一个好习惯。向CONFIG寄存器的RESET_CFG和RESET_PIN位写入特定序列具体参考芯片手册可能涉及拉低再拉高Flash的复位引脚。确保CONFIG.ENB_SPI 0先关闭控制器。配置CONFIG寄存器的基础位SEL_CLK_POL和SEL_CLK_PHASE根据Flash数据手册设置时钟极性和相位。对于大多数SPI Flash模式0CPOL0 CPHA0或模式3CPOL1 CPHA1是常见的。MSTR_BAUD_DIV设置为一个较低的值例如对应25MHz SCLK确保初始低速通信稳定。PHY_MODE_ENABLE 0初期先禁用PHY使用低速模式调试。ENB_DIR_ACC_CTLR 0ENB_LEGACY_IP_MODE 0先使用间接模式。设置CONFIG.ENB_SPI 1使能控制器。步骤三配置Flash设备参数这是让控制器“认识”Flash的关键一步。配置DEV_SIZE_CONFIGMEM_SIZE_ON_CSx根据实际连接的Flash容量设置。例如CS0接1Gb Flash则设置为01。NUM_ADDR_BYTES1Gb Flash通常需要24位地址3字节但有些也支持32位地址4字节。需查阅Flash手册。这里假设为3字节则写入2因为0表示1字节。BYTES_PER_DEVICE_PAGEFlash的页编程大小通常是256字节。写入0x100。BYTES_PER_SUBSECTORFlash的扇区擦除大小通常是4KB4096字节。写入0x1000对应的编码值需计算2的幂次。配置DEV_INSTR_RD_CONFIG和DEV_INSTR_WR_CONFIG假设Flash的Octal DDR读指令是0xEB写指令是0x12需查证。设置RD_OPCODE_NON_XIP 0xEBWR_OPCODE 0x12。设置INSTR_TYPE 3Octal-IO。设置ADDR_XFER_TYPE_STD_MODE 3DATA_XFER_TYPE_EXT_MODE 3地址和数据都使用8线。设置DUMMY_RD_CLK_CYCLES 8对于0xEB指令。设置DDR_EN 1MODE_BIT_ENABLE 1如果0xEB指令需要模式字节。步骤四验证通信与读取Flash ID在进入高速或复杂模式前先用最保守的方式验证控制器与Flash的通信是否正常。使用FLASH_CMD_CTRL寄存器发送“读ID”命令通常是0x9F或0xAF。设置CMD_OPCODE 0x9F。设置NUM_RD_DATA_BYTES 2读取2字节ID例如制造商ID和设备ID。设置ENB_READ_DATA 1。其他位地址使能、写数据使能等保持为0。向CMD_EXEC位写1触发命令。轮询CMD_EXEC_STATUS位直到它变为0表示命令执行完毕。从FLASH_RD_DATA_LOWER寄存器读取返回的数据。比对读取的ID与Flash数据手册中的预期值。如果匹配说明最基本的指令通信链路已通。步骤五配置PHY模块如果使用高速/DDR模式如果计划使用高SCLK频率50MHz或DDR模式必须配置并校PHY。设置CONFIG.PHY_MODE_ENABLE 1。配置PHY_CONFIGURATION和PHY_MASTER_CONTROL寄存器。对于初始调试一个常见的方法是设置PHY_MASTER_CONTROL.PHY_MASTER_BYPASS_MODE 0使能DLL。设置PHY_CONFIG_RESET 1然后清零对DLL进行复位。设置PHY_CONFIG_RESYNC 1触发DLL重新同步延迟线。等待或轮询DLL_OBSERVABLE_LOWER.DLL_OBSERVABLE_LOWER_DLL_LOCK位变为1表示DLL已锁定。如果无法锁定可能需要调整PHY_MASTER_INITIAL_DELAY或检查时钟质量。可以读取DLL_OBSERVABLE_LOWER.LOCK_VALUE等观察值确认锁定状态正常。步骤六配置并进入XIP模式可选如果目标是从Flash直接执行代码需要配置XIP。确保Flash已配置为支持XIP模式。这可能需要通过FLASH_CMD_CTRL发送一系列写寄存器命令如写状态寄存器0x01写配置寄存器0x71等将Flash的非易失性配置位设置为上电后进入XIP模式或设置为支持所需的Octal/DDR协议。这一步高度依赖具体Flash型号必须严格参照其数据手册的“XIP Entry Sequence”章节。配置CONFIG.ENTER_XIP_MODE 1。进行一次AHB总线对Flash地址空间的读访问例如通过指针读取Flash的某个地址。这次访问会触发控制器发送XIP进入序列如果Flash未配置为上电即XIP并使控制器后续进入XIP模式。验证尝试从Flash地址直接执行一条简单的指令比如一个空函数看CPU是否能正常取指运行。3.2 间接传输模式操作示例DMA读取1MB数据假设我们需要通过DMA将Flash中1MB的数据搬运到内部RAM。配置DMA首先设置DMA通道的源地址为OSPI控制器的数据FIFO或AHB触发地址取决于设计目的地址为RAM传输宽度为32位等。这不是本文重点但需先完成。配置OSPI DMA接口设置CONFIG.ENB_DMA_IF 1。配置DMA_PERIPH_CONFIG寄存器定义每次DMA请求传输的字节数burst size。配置间接读传输写入INDIRECT_READ_XFER_START 0x1000假设从Flash地址0x1000开始读。写入INDIRECT_READ_XFER_NUM_BYTES 0x1000001MB。写入INDIRECT_READ_XFER_WATERMARK 0x80假设当SRAM中积累128字节数据时触发DMA请求。在IRQ_MASK寄存器中使能INDRD_SRAM_FULL和INDIRECT_OP_DONE中断。启动传输向INDIRECT_READ_XFER_CTRL.START位写1。等待完成控制器开始从Flash读取数据到内部SRAM。当SRAM中数据达到水位线会向DMA发出请求DMA将数据搬走。当所有1MB数据读完控制器会设置INDIRECT_OP_DONE状态位并产生中断如果已使能。清理在中断服务程序中检查IRQ_STATUS确认是传输完成中断然后清除标志位。4. 高级功能、调试技巧与常见问题排查4.1 XIP模式下的性能优化与注意事项XIP模式极大地提升了代码执行速度但也有一些坑需要注意Cache与预取即使OSPI本身很快其延迟也远高于内部RAM。因此必须使能并正确配置CPU的指令Cache和预取器Prefetcher。否则每取一条指令都可能产生一次OSPI访问性能会急剧下降。内存映射对齐确保Flash在CPU内存映射中的地址是Cache行对齐的并且MMU如果有的配置允许在该区域进行缓存。中断延迟在XIP模式下执行中断服务程序(ISR)时如果ISR本身也位于XIP Flash中中断响应时间会因Flash访问延迟而增加。对于实时性要求高的ISR应考虑将其拷贝到RAM中运行。退出与再进入某些低功耗模式可能需要Flash进入深度睡眠从而退出XIP模式。唤醒后需要软件重新发起进入XIP的序列。CONFIG.ENTER_XIP_MODE_IMM位在这种情况下可能有用。4.2 PHY时序校准实战与信号完整性高速OSPI尤其是DDR模式对PCB设计和信号完整性要求极高。寄存器配置只能解决一部分问题。眼图扫描如果硬件支持使用示波器进行眼图测试是最佳实践。通过脚本或手动调整PHY_CONFIG_RX_DLL_DELAY值观察数据采样窗口中间是否有一个清晰、开阔的“眼图”。找到误码率最低的延迟值。DLL锁定失败如果DLL_LOCK位始终为0检查以下几点参考时钟确保ref_clk稳定、无抖动频率在DLL的有效工作范围内。DQS信号在DDR模式下DQS数据选通信号至关重要。确保RD_DATA_CAPTURE.DQS_ENABLE设置正确并且DQS引脚已正确连接和上拉/下拉。延迟范围PHY_MASTER_INITIAL_DELAY可能超出了DLL的锁定范围。尝试一个中间值如0x40。旁路模式调试先将PHY_MASTER_BYPASS_MODE设为1PHY_CONFIG_RX_DLL_BYPASS设为1使用固定的延迟值进行低速通信确保链路基本正常再尝试启用DLL。阻抗匹配与端接DQ和DQS线应作为差分对或单端线进行阻抗控制通常50欧姆并在驱动端或接收端考虑是否需要串联电阻或端接电阻以减少反射。4.3 常见问题排查速查表以下表格总结了OSPI开发中常见的“症状”、可能的原因及排查步骤症状可能原因排查步骤读取Flash ID失败1. 电源/时钟未就绪。2. 引脚复用错误。3. 片选(CS)信号问题。4. 基本时序极性和相位错误。5. 指令码错误。1. 测量Flash电源和VIO电压。2. 用逻辑分析仪或示波器抓取SCLK, CS#, DQ0波形确认有信号活动。3. 检查CONFIG.PERIPH_CS_LINES是否正确选择了目标CS。4. 核对CONFIG.SEL_CLK_POL/PHASE与Flash手册是否一致。5. 确认DEV_INSTR_RD_CONFIG中读指令码是否正确尝试标准SPI指令0x9F。能读ID但读数据全为0xFF或错误1. 读指令配置错误如dummy cycles不足。2. 地址模式错误3字节 vs 4字节。3. 数据传输模式SIO/DIO/QIO/Octal不匹配。4. Flash未解除写保护或处于忙状态。1. 确认DUMMY_RD_CLK_CYCLES与Flash手册要求一致。2. 检查DEV_SIZE_CONFIG.NUM_ADDR_BYTES。3. 检查ADDR_XFER_TYPE_STD_MODE和DATA_XFER_TYPE_EXT_MODE。4. 发送读状态寄存器命令(0x05)检查WEL写使能锁存和BUSY位。间接传输启动后立即完成但无数据1. 间接传输控制寄存器配置后未正确启动。2. DMA或中断未正确配置数据未被取走导致SRAM满。3. 传输字节数设置为0。1. 检查INDIRECT_READ_XFER_CTRL.START位写1后RD_STATUS是否变为1。2. 检查IRQ_STATUS是否有INDRD_SRAM_FULL中断产生。3. 确认INDIRECT_READ_XFER_NUM_BYTES为非零值。XIP模式下程序跑飞或取指错误1. Flash未正确初始化为XIP模式。2. 模式字节(MODE_BIT_CONFIG)配置错误。3. Cache或MMU配置错误。4. 地址重映射导致错位。1. 用间接模式读取Flash的配置寄存器确认XIP相关位已设置。2. 核对MODE_BIT_CONFIG.MODE值对于0xEB指令常为0xA0或0x00。3. 禁用Cache和MMU测试若正常则问题在存储子系统配置。4. 检查REMAP_ADDR和CONFIG.ENB_AHB_ADDR_REMAP。高速模式下数据不稳定偶发错误1. PHY未校准或DLL未锁定。2. 信号完整性差过冲、振铃。3. 电源噪声大。4. 时序参数(DEV_DELAY)不满足。1. 检查DLL_OBSERVABLE_LOWER.DLL_LOCK位。2. 用示波器测量DQ和DQS信号质量检查阻抗匹配和端接。3. 测量电源轨上的噪声必要时增加去耦电容。4. 在Flash数据手册的AC时序图指导下微调DEV_DELAY寄存器。写操作编程/擦除失败1. 未发送写使能(WEL)指令。2. Flash处于写保护状态软件或硬件。3. 地址未按页或扇区对齐。4. 操作完成后未等待BUSY位清除。1. 每次写/擦除前必须通过FLASH_CMD_CTRL发送0x06(WREN)指令。2. 检查CONFIG.WR_PROT_FLASH引脚控制以及写保护寄存器组WR_PROT_CTRL是否使能。3. 编程地址必须页对齐擦除地址必须扇区/块对齐。4. 写操作后轮询状态寄存器(0x05)的BUSY位或使用控制器的自动轮询功能(WRITE_COMPLETION_CTRL)。4.4 性能调优建议最大化带宽在满足信号完整性的前提下尽可能提高MSTR_BAUD_DIV设置的SCLK频率。启用DDR模式如果Flash支持可将有效数据速率翻倍。优化间接传输合理设置INDIRECT_READ_XFER_WATERMARK。水位线设置过高会增加DMA请求的延迟设置过低则可能因DMA响应不及时导致SRAM满而暂停传输。需要通过实测找到吞吐量最大的平衡点。使用命令加速对于擦除扇区擦除0x20块擦除0xD8等耗时操作使用FLASH_CMD_CTRL触发后让控制器自动轮询完成配置WRITE_COMPLETION_CTRL从而释放CPU。中断与轮询的选择对于实时性要求高的短传输可以使用轮询INDIRECT_OP_DONE状态位。对于大数据量传输使用中断DM