嵌入式DMA与VIM寄存器级配置:从内存保护到中断管理的实战解析 1. 项目概述与核心价值在嵌入式系统尤其是对实时性和性能有严苛要求的汽车电子、工业控制领域直接内存访问控制器和向量中断管理器是驱动工程师必须啃下的硬骨头。很多人对DMA的理解还停留在“能帮CPU搬数据”的层面对VIM的认识也仅限于“管理中断优先级”但当你真正深入到寄存器配置和硬件调度逻辑时才会发现这里面藏着系统稳定性和效率的关键。我经历过不止一次因为DMA区域配置错误导致的内存覆盖也调试过因VIM通道映射混乱而引发的、难以复现的随机中断丢失问题。这些经验让我深刻认识到仅仅会调用库函数是远远不够的你必须清楚每一个控制位在硬件层面是如何运作的。DMA控制器的核心价值在于将CPU从繁重、重复的数据搬运工作中解放出来。想象一下一个高速ADC模块以1MHz的速率采样每个样本2字节如果让CPU通过Load/Store指令来搬运这每秒2MB的数据流其负载将不堪重负根本无法处理其他关键任务。而DMA控制器作为硬件“搬运工”可以独立完成从外设如ADC结果寄存器到内存如一个数组的传输仅在传输开始和结束时通过中断通知CPU实现了计算与I/O的完美并行。其性能提升是数量级的。向量中断管理器则是系统实时性的守护者。在一个拥有数十甚至上百个中断源的复杂SoC中如何确保最紧急的事件如刹车信号、过温报警能被CPU第一时间响应VIM通过硬件化的优先级仲裁和向量跳转机制将中断响应延迟降至最低。它不仅仅是简单的中断控制器更是一个可编程的、带错误校验的中断路由与调度中心。理解它的通道映射、优先级编码以及硬件向量模式是构建高可靠、强实时嵌入式系统的基石。本文将结合TI平台的具体实现拆解DMA控制器和VIM的寄存器级配置逻辑。我不会只罗列寄存器字段而是会结合我实际调试中遇到的“坑”告诉你每个配置项背后的设计意图、配置时的注意事项以及如何通过组合配置实现高效、可靠的数据传输与中断管理。无论你是正在学习底层驱动的学生还是需要优化现有系统性能的工程师这些从手册和实践中提炼出的细节都能让你少走弯路。2. DMA控制器架构、区域与通道深度解析2.1 内存保护区域DMAMPRxS/E寄存器的精妙设计输入材料中反复出现的DMAMPR0S、DMAMPR0E等寄存器定义了DMA控制器可以访问的内存区域。这绝不是一个简单的地址范围限制而是嵌入式系统内存安全的第一道防线。DMA作为一个拥有直接内存访问能力的硬件主设备如果配置不当其破坏力是巨大的——它可以悄无声息地覆盖掉你的栈、堆甚至代码区。2.1.1 区域配置的核心逻辑与“回绕”陷阱每个区域由一对寄存器定义DMAMPRxS起始地址和DMAMPRxE结束地址。手册中有一句非常关键但容易被忽略的描述“The endaddress usually is bigger than the startaddress for this region. Otherwise the region will wrap around at the end of the address space.”这句话揭示了硬件的一个关键行为它不检查起始地址是否小于结束地址。如果ENDADDRESS小于STARTADDRESS区域不会报错而是会发生“地址回绕”。这意味着DMA控制器会将整个32位地址空间0x0000 0000 到 0xFFFF FFFF视为一个环形缓冲区。例如如果你错误地将区域0配置为STARTADDRESS 0x8000 0000,ENDADDRESS 0x7000 0000那么DMA的有效访问范围将是[0x8000 0000, 0xFFFF FFFF]和[0x0000 0000, 0x7000 0000]的并集。这极有可能导致DMA访问到完全意想不到的、受保护的系统内存区域引发灾难性后果。实操心得区域配置的黄金法则明确隔离为DMA专门划出一块连续的物理内存区域例如在链接脚本中定义.dma_buffer段并用DMAMPRxS/E严格限定在此区域内。切勿让DMA区域与代码、栈、堆或关键数据区重叠。启用前校验在启动任何DMA通道前通过软件断言或运行时检查确保ENDADDRESS STARTADDRESS且区域大小满足传输需求。保守原则如果不确定就将区域设置得尽可能小仅够当前传输任务使用。需要更大缓冲区时再动态调整或使用多个区域。2.1.2 多区域管理的策略TI的DMA控制器通常提供多个可编程区域如Region 0-3。这提供了灵活的内存管理策略策略一功能隔离。为不同的外设或任务分配独立区域。例如Region 0分配给ADC采样缓冲区Region 1分配给UART发送缓冲区Region 2分配给SPI接收缓冲区。这样可以实现访问权限的硬件隔离。策略二乒乓缓冲区。对于需要连续不断流式传输的场景如音频可以配置两个大小相同的区域Region 0和Region 1。当DMA在Region 0传输时CPU处理Region 1中的数据传输完成后通过中断切换让DMA使用Region 1CPU处理Region 0。这需要与通道的“自动初始化”模式配合使用。策略三分级存储。Region 0配置为高速紧耦合存储器如RAM用于存放需要极低延迟访问的关键数据Region 1配置为容量更大的普通RAM用于存放历史数据或日志。2.2 通道控制数据包DMA传输的“任务描述符”如果说DMAMPR定义了DMA的“活动范围”那么通道控制数据包就是交给DMA的“详细工作任务单”。这份任务单存储在DMA内部的本地RAM中并且受奇偶校验保护确保了配置信息的可靠性。每个通道都有自己独立的一套控制数据包。2.2.1 控制数据包的结构与生命周期如文档所述一个控制数据包包含9个字段前6个可编程后3个只读。我们可以将其理解为两个部分编程配置区前6个字段由工程师在传输开始前设置定义了传输的“蓝图”。ISADDR初始源地址。数据从哪里来。IDADDR初始目的地址。数据到哪里去。ITCOUNT初始传输计数。定义了传输的规模元素数 x 帧数。CHCTRL通道控制寄存器。定义了传输的“行为模式”数据大小、地址模式、触发类型等。EIOFF元素索引偏移。每次传输一个“元素”后源地址和目的地址的增量。FIOFF帧索引偏移。每传输完一“帧”后源地址和目的地址的增量。运行时状态区后3个只读字段由DMA硬件在传输过程中自动更新反映了传输的实时进度。CSADDR当前源地址。CDADDR当前目的地址。CTCOUNT当前剩余传输计数。这种分离设计非常巧妙。工程师只需初始化“蓝图”DMA硬件就会根据蓝图自动更新状态。你可以随时读取CSADDR、CDADDR和CTCOUNT来获取传输进度而无需打断DMA操作。2.2.2 关键寄存器详解与配置实战1. 初始传输计数寄存器ITCOUNT寄存器将传输任务分解为“帧”和“元素”两个维度。这为处理二维数据如图像、矩阵或复杂的数据包结构提供了便利。IFTCOUNT帧传输计数。可以理解为“行数”或“数据包个数”。IETCOUNT元素传输计数。可以理解为“每行的列数”或“每个数据包的字节数”。总传输量IETCOUNT*IFTCOUNT。例如要传输一个320x240的RGB565图像每个像素2字节可以配置为IETCOUNT 320*2一行640字节IFTCOUNT 240240行。这样每传输完一行640字节FIOFF偏移生效地址跳转到下一行起始位置。2. 通道控制寄存器CHCTRL是控制数据包的大脑其每一位都至关重要。CHAIN通道链。这是实现复杂传输序列的关键。当当前通道完成所有帧传输后会自动触发CHAIN指定的下一个通道。例如配置CHAIN 3则当前通道完成后会自动启动通道2注意是x-1。这可以用于实现通道0从ADC搬运数据到缓冲区A - 完成后自动触发通道1将缓冲区A的数据通过SPI发出 - 再触发通道2从ADC搬运数据到缓冲区B形成一个无缝的乒乓操作。务必注意必须在启动DMA传输之前配置好CHAIN位。RESWES读/写元素大小。定义了单次访问的粒度可以是8、16、32或64位。必须与外设数据寄存器的宽度对齐。例如一个32位宽的SPI数据寄存器RES或WES应配置为232位字。不匹配会导致数据错位或硬件错误。TTYPE传输类型。决定了单个硬件请求触发多少数据传输。0一次硬件请求触发一帧传输。适用于需要精确控制每个数据块传输的场景。1一次硬件请求触发一块传输即所有帧。适用于需要一次性搬运大量数据的场景。ADDMRADDMW读/写寻址模式。0常量模式。地址在传输中不变。适用于从固定寄存器如ADC结果寄存器读取数据或向固定寄存器如DAC数据寄存器写入数据。1后递增模式。每完成一次元素传输地址自动增加一个元素的大小。这是最常用的模式用于在连续的存储区间搬运数据。3索引模式。地址根据EIOFF和FIOFF中定义的偏移量进行跳变。用于访问非连续或规律分布的内存区域如二维数组、带间隔的数据流。AIM自动初始化模式。这是实现循环缓冲区或连续传输的灵魂。0禁用。传输完成后通道停止需要软件重新初始化控制包才能再次启动。1启用。当一次传输所有帧完成后DMA硬件会自动用ISADDR、IDADDR、ITCOUNT等初始值重新加载当前地址和计数寄存器使通道立即准备就绪等待下一个触发。这对于需要不间断数据流的应用如音频播放、实时数据采集是必须的。3. 元素与帧索引偏移寄存器EIOFF和FIOFF寄存器仅在寻址模式为“索引模式”时生效。它们提供了灵活的地址跳变能力。EIDXS/EIDXD每传输一个元素后源/目的地址增加的偏移量字节为单位。FIDXS/FIDXD每传输完一帧即IETCOUNT个元素后源/目的地址增加的偏移量。一个典型应用是处理一个结构体数组。假设结构体大小为20字节但DMA只需要传输其中从偏移4开始的12字节数据域。可以配置EIDXS EIDXD 12FIDXS FIDXD 20。这样DMA会在每个结构体内传输12字节然后跳过8字节定位到下一个结构体的数据域起始处。3. VIM向量中断管理器从请求到响应的全链路剖析3.1 VIM的架构与三种中断处理模式VIM的核心任务是以最优的延迟和确定性将上百个外设中断请求路由到CPU的FIQ或IRQ引脚并让CPU跳转到正确的中断服务程序。它提供了三种软件处理模式适应不同的性能和灵活性需求。3.1.1 索引中断模式这是最传统、兼容性最好的模式但速度最慢。外设触发中断VIM进行优先级仲裁。VIM将最高优先级中断的通道号写入IRQINDEX或FIQINDEX寄存器。CPU收到IRQ/FIQ跳转到固定的异常向量地址IRQ: 0x18, FIQ: 0x1C。在统一的IRQ/FIQ服务程序中软件读取IRQINDEX/FIQINDEX寄存器根据通道号通过一个大的switch-case语句或跳转表分支到具体的外设ISR。缺点需要软件查询增加了中断延迟且服务程序通常用汇编编写以保证效率。3.1.2 寄存器向量中断模式这是性能与灵活性的折中方案也是较常用的模式。初始化阶段软件将每个中断通道对应的ISR入口地址写入VIM RAM中断向量表的对应位置。中断发生时VIM根据获胜的通道号从向量表中取出ISR地址并加载到IRQVECREG或FIQVECREG寄存器。CPU跳转到0x18或0x1C该处存放一条加载指令如LDR PC, [PC, #-0x1B0]这条指令会从IRQVECREG/FIQVECREG寄存器中取出ISR地址并跳转。优点省去了软件查询索引的步骤由硬件自动获取向量地址延迟低于索引模式。向量表在RAM中可动态修改。3.1.3 硬件向量中断模式这是延迟最低的模式仅支持IRQ。同样需要预先初始化VIM RAM中的向量表。需要在CP15协处理器的R1寄存器中设置VE位使能硬件向量功能。中断发生时VIM通过专用的VIC端口将ISR地址直接传递给CPU。CPU不经过0x18的异常向量直接跳转到VIC端口提供的地址执行ISR。优点消除了所有软件跳转开销实现了理论上最小的中断延迟。这对于需要极速响应的控制环路至关重要。注意事项模式选择与配置陷阱FIQ的限制硬件向量模式仅对IRQ有效。FIQ中断只能使用索引或寄存器向量模式。因此通常将最紧急、最频繁的中断如电机故障信号分配为FIQ并采用寄存器向量模式以获取尽可能快的响应。向量表的初始化时机必须在使能全局中断之前完成VIM RAM的初始化。否则未初始化的向量表项可能包含随机值导致CPU跳转到非法地址引发硬件错误。软件优先级解码的额外步骤如果采用自定义的软件优先级方案而不是依赖VIM的硬件优先级在清除外设中断标志后必须额外清除VIM中的中断请求位通过读IRQVECREG或写INTREQ寄存器相应位。如果使用VIM的硬件向量或寄存器向量模式这一步是自动完成的。这个细节手册中提到了但极易被忽略是导致中断“锁死”或重复触发的一个常见原因。3.2 通道映射与优先级管理动态调整中断架构VIM最强大的特性之一是其可编程的通道映射。如图9-3所示除了通道0和1被硬连线到特定的不可屏蔽中断请求如ESM错误外其他通道2-126都可以通过CHANMAPx寄存器映射到任意的INT_REQx信号线上。3.2.1 映射的实战意义这意味着物理外设与逻辑中断通道的绑定关系是软件可配置的。例如默认情况下SPI接收中断INT_REQ10可能映射到CHAN10。但如果你希望SPI中断具有更高的优先级你可以通过CHANMAP2寄存器将INT_REQ10也映射到编号更小的CHAN2上因为VIM仲裁规则是通道号越小优先级越高。你甚至可以将其同时映射到多个通道然后通过动态启用/禁用不同的通道来实现运行时优先级切换。如图9-5所示将INT_REQ2映射到CHAN2和CHAN4将INT_REQ3映射到CHAN3。那么当CHAN2启用时优先级顺序为CHAN0-CHAN1-INT_REQ2(CHAN2) -INT_REQ3(CHAN3) -INT_REQ2(CHAN4)。如果在运行时通过REQENACLR寄存器禁用了CHAN2则优先级顺序变为CHAN0-CHAN1-INT_REQ3(CHAN3) -INT_REQ2(CHAN4)。 这种动态优先级调整能力对于实现复杂的状态机或满足不同运行模式下的实时性要求非常有用。3.2.2 使能与优先级配置寄存器REQENASET/REQENACLR通道使能设置/清除寄存器。每个位对应一个通道。通道0和1是NMI无法通过此寄存器禁用这是安全设计的要求。FIRQPR快速中断优先级寄存器。每个位决定对应通道产生的是FIQ还是IRQ。1表示FIQ0表示IRQ。同样通道0和1固定为FIQ此寄存器对它们无效。配置流程通常为禁用全局中断CPSR的I位和F位。配置CHANMAPx建立外设请求到逻辑通道的映射关系。配置FIRQPR为各通道分配FIQ/IRQ类型。向VIM RAM写入各个通道的ISR入口地址。通过REQENASET使能需要的中断通道。清除外设和VIM中可能存在的残留中断标志。在CPSR中使能全局IRQ和/或FIQ。3.3 中断向量表与ECC保护构建坚固的防线VIM RAM地址0xFFF82000开始存储了128个32位的ISR入口地址。通道0-126各占一项第127项是“幻影向量”。通道127没有对应的向量表项不应被使用。3.3.1 ECC功能的启用与运作对于安全关键系统VIM RAM的ECC错误纠正码保护是必不可少的。它能够检测并纠正单比特翻转软错误检测双比特错误。启用通过设置ECCCTL寄存器的ECCENA[3:0] 0xA来启用ECC功能。必须在初始化向量表之前完成。写入当CPU向VIM RAM写入一个ISR地址时VIM硬件会自动计算7位ECC校验位并将其与数据一起存储。读取与纠错当VIM或CPU读取向量时会重新计算数据的ECC并与存储的ECC校验位比较。如果匹配数据无误。如果出现单比特错误SBESECDED逻辑会自动纠正数据并将错误事件记录在ECCSTAT寄存器的SBERR位同时错误地址存入SBERRADDR。如果SBE_INT_EN使能还会向ESM模块报告。如果出现双比特错误DBE则无法纠正。错误事件记录在ECCSTAT的UERR位地址存入UERRADDR并一定会向ESM模块报告严重错误。3.3.2 后备向量与错误恢复FBVECADDR寄存器是ECC机制下的安全网。当发生不可纠正的错误DBE时VIM不会将损坏的向量地址送给CPU而是使用FBVECADDR中预设的“后备ISR”地址。这个后备ISR的责任非常重大保存现场。从ECCSTAT和UERRADDR/SBERRADDR获取错误信息。从可靠存储如Flash中恢复VIM RAM的正确内容。清除ECCSTAT寄存器标志位。安全地退出中断或进行系统复位。实操心得ECC配置的注意事项访问粒度启用ECC后对VIM RAM的访问必须是32位的。8位或16位的访问会破坏ECC的完整性可能直接触发ECC错误。初始化顺序正确的顺序是启用ECC - 设置FBVECADDR- 初始化VIM RAM向量表 - 使能中断。务必先设置好安全网FBVECADDR再填充可能出错的内容向量表。错误处理在FBVECADDR指向的ISR中恢复向量表后建议使用DSB和ISB屏障指令确保恢复的数据被正确写入且后续取指无误然后再清除ECCSTAT。4. DMA与VIM协同实战以高速数据采集为例让我们通过一个具体场景将DMA和VIM的知识串联起来设计一个基于MCU的高速、实时数据采集系统。ADC以1MSPS采样通过DMA将数据存入内存中的乒乓缓冲区当半满或全满时通过中断通知CPU进行处理如数字滤波、存储或上传。4.1 系统设计与寄存器配置1. 内存规划与DMA区域配置在链接脚本中定义两个32KB的缓冲区AdcBufferA(0x8000 0000),AdcBufferB(0x8000 8000)。配置DMA Region 0:DMAMPR0S 0x8000 0000,DMAMPR0E 0x8000 7FFF。仅允许DMA访问Buffer A。配置DMA Region 1:DMAMPR1S 0x8000 8000,DMAMPR1E 0x8000 FFFF。仅允许DMA访问Buffer B。为什么分开配置实现硬件级的访问隔离防止DMA配置错误时跨越缓冲区边界写入破坏另一个缓冲区的数据。2. DMA通道配置以通道0用于ADC搬运为例ISADDR ADC结果寄存器地址如0xFFF8 0000。ADDMR 0常量模式因为始终从同一个外设寄存器读取。IDADDRAdcBufferA起始地址。ADDMW 1后递增模式因为数据要连续存入内存。ITCOUNT:IETCOUNT 1024(一次触发搬1024个样本)IFTCOUNT 32(搬32次后触发中断)。总数据量32KB。CHCTRL:RES 1 (16位假设ADC是16位)。WES 1 (16位)。TTYPE 0 (每次ADC转换完成硬件请求触发一帧传输即搬运一个样本)。AIM 1 (启用自动初始化实现循环搬运)。CHAIN 1 (本通道完成后触发通道1。通道1将用于处理BufferA的数据)。EIOFF:EIDXS 0(源地址不变)EIDXD 2(目的地址每次增加2字节)。FIOFF:FIDXS 0,FIDXD 0(单帧内地址连续递增帧间无额外偏移)。3. VIM中断配置映射假设ADC序列转换完成中断请求为INT_REQ20。我们希望它作为高优先级IRQ。将其映射到CHAN5一个编号较小的通道CHANMAP5 20。优先级与使能FIRQPR5 0(配置为IRQ)。REQENASET.5 1(使能通道5)。向量表在VIM RAM中计算CHAN5对应的向量表地址0xFFF82000 5 * 4 0xFFF82014。向该地址写入ADC中断服务程序ADC_ISR的入口地址。模式选择为了低延迟在CP15中使能硬件向量中断模式VE1。4.2 工作流程与协同细节初始化配置好DMA区域、通道0、VIM映射和向量表。使能ADC序列转换和DMA请求。使能全局中断。启动软件启动ADC转换序列和DMA通道0。数据搬运ADC每完成一个转换产生一个硬件请求。DMA通道0响应将ADC结果寄存器的一个16位数据搬运到AdcBufferA中目的地址自增。重复1024次一帧完成。帧完成与中断当DMA完成一帧1024个样本传输后其帧计数器减1。当完成所有32帧即搬满整个32KB BufferA后DMA通道0会 a. 自动根据AIM1重新加载初始地址和计数准备下一轮搬运此时目的地址会因自动初始化而重置回AdcBufferA起始处但我们可以通过中断服务程序来切换目标缓冲区。 b. 根据CHAIN1自动触发通道1。通道链触发通道1被触发我们预先将通道1配置为在触发时产生一个中断到CPU。这个中断通过VIM路由假设INT_REQ21映射到CHAN6并配置为IRQ。中断响应VIM收到INT_REQ21根据优先级仲裁获取CHAN6的ISR地址假设是DMA_BufferFull_ISR通过VIC端口直接送给CPU。CPU处理CPU硬件跳转到DMA_BufferFull_ISR。在该ISR中 a. 切换DMA通道0的目的地址到AdcBufferB通过修改其控制数据包中的IDADDR。 b. 处理AdcBufferA中已满的数据。 c. 清除DMA通道1的中断标志可能也需要清除VIM中的请求位取决于模式。循环往复此时DMA通道0已在向AdcBufferB搬运新数据。当BufferB满时会再次触发通道1在ISR中再将DMA目的地址切回BufferA并处理BufferB的数据形成“乒乓”操作。4.3 常见问题与调试技巧实录问题1DMA传输数据错位或丢失。排查点1元素大小对齐。检查CHCTRL中的RES和WES是否与外设数据寄存器宽度匹配。例如32位寄存器必须配置为32位访问。不匹配会导致DMA每次访问错位只读到部分数据。排查点2地址递增模式。确认ADDMR和ADDMW是否符合预期。如果从内存到内存的传输两边通常都应设为“后递增”。如果从固定外设寄存器读源地址应为“常量”。排查点3缓冲区对齐。确保源和目的地址符合数据大小的对齐要求如32位访问最好32位对齐。某些硬件对非对齐访问支持不完善或效率低下。调试技巧在传输开始前和完成后分别读取CSADDR、CDADDR和CTCOUNT寄存器与预期值对比。如果CTCOUNT不为0而传输已停止可能是触发了内存保护错误或总线错误。问题2中断无法触发或只触发一次。排查点1VIM通道使能。确认REQENASET寄存器对应位已置1。这是最容易被遗忘的步骤。排查点2中断标志清除顺序。在ISR中必须先清除外设自身的中断标志再根据需要清除VIM中的中断请求位如果使用软件优先级解码。顺序反了可能导致中断立即重新挂起。排查点3DMA中断触发条件。确认DMA通道的中断是配置为“传输完成中断”还是“帧完成中断”检查CHCTRL的TTYPE以及DMA全局控制寄存器中关于中断使能的位。调试技巧利用VIM的IRQINDEX/FIQINDEX或IRQVECREG/FIQVECREG寄存器。在疑似中断未触发时读取这些寄存器看是否有值。如果有值但CPU未响应检查CPSR的I/F位是否已使能。如果没值说明中断请求未到达VIM需检查外设和DMA的中断产生逻辑。问题3系统在使能中断后跑飞。排查点1VIM RAM向量表。这是头号嫌疑犯。检查是否在所有向量表项中都填充了有效的ISR地址。未使用的通道应填充一个安全的默认中断处理函数如死循环或复位函数地址。排查点2栈指针。确保在进入IRQ/FIQ模式前已正确初始化了对应模式的栈指针SP_irq, SP_fiq。中断处理中使用栈如果栈指针无效会立即导致硬件错误。排查点3ECC错误。如果启用了ECC检查ECCSTAT寄存器是否有SBE或UERR标志。这可能是向量表在初始化前被意外写入或发生了软错误。调试技巧在初始化向量表后通过调试器内存窗口检查0xFFF82000开始的区域确认写入的地址值是否正确。在FBVECADDR中设置一个简单的、带断点的后备ISR如果系统跑飞后停在这个断点就证明发生了不可纠正的ECC错误。问题4使用硬件向量中断模式无效。排查点1CP15 VE位。确认在初始化代码中通过操作CP15协处理器的R1寄存器正确设置了VE位。这是一个特权操作通常需要在汇编代码或专门的系统控制函数中完成。排查点2向量表地址对齐。有些ARM核要求向量表地址有特定的对齐如128字节或1KB。确保VIM RAM的基地址符合CPU的要求。排查点3仅IRQ有效。再次确认硬件向量模式只对IRQ有效。FIQ无法使用此模式。通过将DMA的高效数据搬运能力与VIM的确定性强中断管理相结合可以构建出CPU占用率极低、响应极其迅速的嵌入式系统。关键在于深入理解每个寄存器位的含义并在设计之初就规划好内存布局、中断优先级和DMA工作模式。调试时从硬件信号流外设-DMA请求-VIM-CPU逐级排查善用状态寄存器就能快速定位问题所在。

本月热点