深度解析RA8D2 DMA/DTC寄存器机制与数据传输实战

深度解析RA8D2 DMA/DTC寄存器机制与数据传输实战
1. 项目概述与核心价值在嵌入式系统开发尤其是涉及高速数据流处理的场景里CPU常常被数据搬运这类“体力活”拖累。想象一下一个音频编解码芯片每秒需要接收或发送数十KB的PCM数据如果每个字节的搬运都需要CPU发起一次读写操作那CPU基本就“废”了什么核心算法都跑不动。这时候DMA直接内存访问技术就是解放CPU、提升系统整体性能的关键。它就像一个专职的“数据搬运工”在CPU设定好任务从哪里搬、搬到哪里、搬多少后就能独立完成大批量的数据传输期间CPU可以腾出手来处理更复杂的逻辑运算。然而用好DMA并非简单地开启功能就万事大吉。其高效运作的背后是一套精密的寄存器状态机在驱动。以瑞萨电子的RA8D2系列高性能微控制器为例其DMA控制器DMAC和与之协同的数据传送控制器DTC提供了高度灵活且强大的数据传输能力。但这份强大也带来了复杂性十多个关键寄存器在传输过程中如何动态更新不同的传输模式普通、重复、块、重复-块下地址和计数器的变化逻辑有何不同中断如何精准地通知CPU传输完成或异常DTC的链式传输又是如何实现多个数据块的无缝衔接这些问题如果理解不透开发中就极易踩坑。比如你以为传输结束了但某个状态标志位没清导致DMA无法再次启动或者链式传输配置不当数据流莫名其妙地中断。本文将以RA8D2的用户手册为蓝本结合我多年在音频处理和图像采集项目中的实际经验为你深度拆解DMAC和DTC的寄存器更新机制与数据传输逻辑。我们不止于翻译手册更会聚焦于“为什么”这么设计以及在实际编程中“如何”正确配置和避坑。无论你是正在调试一个高速ADC的DMA采集还是想优化SPI Flash的数据烧录速度这里的细节都将直接决定你的系统能否稳定、高效地运行。2. DMA控制器DMAC寄存器动态更新机制详解DMA传输的本质是DMAC硬件根据预先配置的参数自动执行“读取源地址数据 - 写入目标地址”的循环。这个过程里一系列寄存器扮演着“任务清单”和“进度记录本”的角色。它们并非一成不变而是随着每一次传输请求的完成而动态更新以指向下一次传输的“起点”。理解这种更新逻辑是编写可靠DMA驱动代码的基础。2.1 核心地址与计数器寄存器组在RA8D2的DMAC中有八个寄存器会在DMA传输过程中被硬件自动更新。我们可以把它们分为两类地址指针类和计数控制类。地址指针寄存器负责追踪数据的“来龙去脉”DMA源地址寄存器 (DMSAR)存放当前要读取的数据的内存地址或外设数据寄存器地址。一次传输完成后硬件会根据设定的寻址模式固定、递增、递减自动更新此寄存器为下一次传输准备好源地址。DMA目标地址寄存器 (DMDAR)存放当前要写入数据的内存地址或外设数据寄存器地址。同样在一次传输完成后根据寻址模式自动更新。计数控制寄存器负责管理传输的“量与节奏”DMA传输计数寄存器 (DMCRA)在普通传输模式下它记录剩余的总传输次数单位是传输次数。每完成一次传输其值减1。DMA块传输计数寄存器 (DMCRB)在重复、块或重复-块传输模式下它扮演着更复杂的角色。在重复模式下它记录一个“重复单元”内的剩余传输次数在块传输模式下它记录一个“数据块”内的剩余传输次数在重复-块模式下它则记录块内传输次数。DMA源缓冲区大小寄存器 (DMSBS)与DMA目标缓冲区大小寄存器 (DMDBS)这两个寄存器用于定义“扩展重复区域”的大小。当使用重复或块传输模式并且地址指针SAR或DAR的更新跨越了由这两个寄存器定义的边界时硬件会将其“折返”到区域的起始地址。这在处理环形缓冲区Circular Buffer时极其有用比如音频的double-buffer机制。传输完成后硬件会更新内部的偏移指针。这些寄存器的更新并非简单的“减一”或“加一”其具体行为高度依赖于DMA传输模式寄存器 (DMTMD)中MD[1:0]位的设置。手册中的表17.5至表17.13详细列举了所有组合但我们可以将其核心逻辑归纳为以下场景场景一普通传输模式 (MD[1:0] 00b)这是最简单的模式。假设你设置了DMCRA 100 SAR递增DAR递增。那么DMAC会从SAR指向的地址读一个数据大小由DMTMD.SZ决定写到DAR指向的地址然后SAR 数据宽度例如字节传输则1。DAR 数据宽度。DMCRA 减1。 这个过程重复100次直到DMCRA减为0传输结束。场景二重复传输模式 (MD[1:0] 01b)这个模式引入了“重复”的概念。假设你设置DMCRB 10重复大小 DMCRA 5重复次数 SAR固定DAR递增。DMAC会执行从固定的SAR地址读取数据写入DAR地址DAR地址递增。重复这个操作10次DMCRB从10减到0。这10次传输中SAR地址不变这常用于从同一个外设寄存器如ADC数据寄存器读取数据到一片连续的内存。当DMCRB减到0时触发“重复结束”事件。此时DMCRB会被硬件自动重载为初始值10而DMCRA减1。重复步骤1和2直到DMCRA也从5减到0整个传输才最终结束。 这种模式非常适合处理外设的FIFO数据或定期采样。关键点在重复和块传输模式下DMTMD.TKP传输保持位的行为需要特别注意。当TKP1自由运行模式时即使DMCRA/DMCRB计数到0DMAC也不会自动停止DMCNT.DTE位保持为1而是等待下一个传输请求。这用于需要持续不断传输数据的场景但要求软件必须能及时处理数据并管理缓冲区否则会覆盖未处理的数据。2.2 控制与状态寄存器的关键位除了上述“进度”寄存器两个控制/状态寄存器的位在传输生命周期中扮演着“开关”和“指示灯”的角色它们的互动是调试DMA问题的关键。DMA传输使能位 (DMCNT.DTE)这是DMA通道的“总开关”。软件写1启动传输写0请求停止。但更重要的是硬件也会在特定条件下自动清零此位完成指定的总数据量当DMCRA普通模式或DMCRB重复/块模式计数到0且TKP0时。被中断停止当发生“重复大小结束中断”或“扩展重复区域溢出中断”时。发生传输错误如总线访问错误、MPU保护错误等。重要注意事项手册明确警告当某个通道的DMCNT.DTE位为1传输使能时禁止软件写入该通道的其他配置寄存器如DMSAR, DMDAR, DMTMD等DMCNT寄存器本身除外。试图在传输过程中修改配置会导致不可预知的行为。正确的做法是先写0停止DMA修改配置再写1重新启动。这是一个非常常见的错误来源尤其是在动态改变传输目标地址时。DMAC活动标志 (DMSTS.ACT)这是一个只读标志位是判断DMAC“是否在忙”的最直接依据。DMAC开始响应一次传输请求时ACT标志置1。当响应本次请求的所有数据传输操作可能是一次单次传输也可能是一个块完成时ACT标志清零。一个关键细节即使软件在传输过程中写0停止了DTE位ACT标志也会保持为1直到当前正在进行的这个传输总线周期完成为止。这意味着ACT0才是DMA通道真正进入空闲状态的可靠信号而不仅仅是DTE0。传输结束中断标志 (DMSTS.DTIF) 与 传输逃逸结束中断标志 (DMSTS.ESIF)这两个标志位用于向CPU报告传输状态。DTIF当整个DMA传输任务即总传输量完成结束时由硬件置1。如果此时中断使能位DMINT.DTIE也为1则向CPU产生传输结束中断请求。ESIF当传输因“重复大小结束”或“扩展重复区域溢出”而停止时由硬件置1。如果DMINT.ESIE为1则产生传输逃逸结束中断请求。它们的清除方式体现了设计上的巧妙DTIF和ESIF不会自动清零。通常在对应的中断服务程序(ISR)中软件需要先将其清零以应答中断。但是如果你希望在中断处理后恢复而非终止DMA传输则操作不同你不需要手动清除ESIF而是直接写1到DMCNT.DTE位。这个操作会自动清零ESIF标志并恢复传输。这个机制避免了标志位清除和传输重启之间的竞态条件。2.3 通道优先级与仲裁机制当多个DMA通道甚至DTC同时产生传输请求时谁先谁后RA8D2的DMAC提供了两种优先级策略由DMCTL.PR位控制固定优先级 (PR0)通道号越小优先级越高。顺序为通道0 通道1 ... 通道7 DTC。这种模式简单可预测适合有明确轻重缓急的场景比如通道0服务高优先级的网络DMA通道1服务低优先率的串口DMA。轮询优先级 (PR1)采用类似Round-Robin的算法。最近一次获得服务的通道其优先级在下一轮仲裁中变为最低。这种模式能保证所有请求通道在长时间内获得公平的服务机会避免低优先级通道被“饿死”适用于多个带宽需求相近的外设。仲裁时机即使有高优先级请求到达DMAC也会先完成当前正在进行的数据传输的最后一次写操作然后再进行仲裁。这保证了每次传输操作的原子性。2.4 安全与特权属性对于涉及安全设计的应用如TrustZoneRA8D2的DMAC通道可以独立配置安全Secure和非安全Non-secure属性以及特权Privileged和非特权Unprivileged属性。安全属性 (CPSCU.DMACCHSAR.SADMACm0n)决定该通道发起传输时的主设备安全状态以及其寄存器所属的安全域。非安全主设备无法访问安全外设或内存区域。特权属性 (CPSCU.DMACCHPAR.PADMACm0n)决定该通道的访问权限级别。非特权访问可能被内存保护单元MPU阻止。严重警告绝对禁止在DMA传输过程中DMSTS.ACT1或DMCNT.DTE1修改这些安全/特权属性寄存器。这会导致不可预测的总线访问行为可能触发MPU或TrustZone Filter错误使系统崩溃。配置必须在DMA启动前完成并在DMA停止后才能修改。3. DMA传输的结束条件与中断处理流程DMA传输不会永远进行下去其结束通常由预设的条件触发。理解这些条件以及对应的中断处理流程是实现可靠数据流控制的关键。3.1 四种主要的传输结束条件完成指定次数的传输操作这是最常规的结束方式。在不同模式下判断的计数器不同普通模式DMCRA计数到0。重复/块/重复-块模式DMCRB计数到0。 当条件满足时硬件自动清除DMCNT.DTE位停止DMA并置位DMSTS.DTIF标志。如果DMINT.DTIE使能则向CPU发出传输结束中断。由重复大小结束中断停止在重复或块传输模式下当DMINT.RPTIE位使能时每完成一个“重复单元”由DMCRB定义的大小的传输就会产生一个“重复大小结束中断”。如果此中断被配置为用于停止DMA则硬件会清除DMCNT.DTE位并置位DMSTS.ESIF标志。这允许你在传输完一个逻辑数据块如一帧音频后及时通知CPU进行处理同时暂停DMA等待下一帧的开始。由扩展重复区域溢出中断停止当使用扩展重复区域环形缓冲区功能且使能了源或目标地址的溢出中断 (DMINT.SARIE或DMINT.DARIE) 时如果地址指针在更新后超出了DMSBS/DMDBS定义的区域就会触发此中断。同样这会清除DTE并置位ESIF。注意即使触发了溢出中断当前读或写周期也会完成以保证数据完整性。发生DMA传输错误当访问遇到MPU保护错误、总线错误、非法地址错误或TrustZone过滤错误时DMAC会立即停止出错通道的传输并清除该通道的DMCNT.DTE位。错误通道的信息会被记录在DMECHR寄存器中同时会产生一个错误响应检测中断DMAm_TRANSERR。关键点错误发生时不会执行寄存器回写。这意味着地址和计数器寄存器会停留在出错时的状态这对于错误恢复和调试至关重要。3.2 中断处理的服务程序设计要点根据是终止传输还是暂停后继续中断服务程序ISR的处理流程截然不同。下图清晰地展示了这个决策流程// 伪代码示意中断服务程序中的逻辑 void DMAC_ChannelX_IRQHandler(void) { uint32_t dmsts DMACn.DMSTS; // 读取状态寄存器 if (dmsts DMSTS_DTIF_Msk) { // 情况A整个传输任务完成 // 1. 清除中断标志必须做 DMACn.DMSTS ~DMSTS_DTIF_Msk; // 2. 此时DTE已被硬件清零通道已停止。 // 3. 处理数据例如通知主程序传输完成。 g_transfer_complete true; } else if (dmsts DMSTS_ESIF_Msk) { // 情况B由重复结束或区域溢出中断暂停 // 需要判断是终止还是继续 if (g_need_stop_transfer) { // B1. 决定终止传输 // 1. 清除ESIF标志必须做 DMACn.DMSTS ~DMSTS_ESIF_Msk; // 2. 此时DTE已被硬件清零通道已停止。 // 3. 可以重新配置寄存器为下一次传输做准备。 // 4. 清除ICU中的中断请求标志 ICU.DELSRn.IR 0; } else { // B2. 决定继续传输 // 1. 直接重新使能DMA传输ESIF标志会被硬件自动清除。 DMACn.DMCNT | DMCNT_DTE_Msk; // 2. DMA将从中断点继续执行。 // 注意不要在此处手动清除ESIF } } // ... 其他处理 }实操心得标志位清除顺序在决定终止传输的路径中一定要先清除DMSTS中的中断标志DTIF或ESIF再处理其他事情如清除ICU请求标志。顺序反了可能导致中断重复进入或状态混乱。继续传输的“捷径”当希望从重复结束中断点恢复时直接写DTE1是最简洁可靠的方法。硬件自动清除ESIF的机制消除了软件操作间的时序风险。错误中断处理对于传输错误中断除了处理系统级的错误报告一定要去查询DMECHR寄存器确定是哪个通道出了什么问题并检查BUS.BUSERRSTAT等寄存器获取详细错误类型如非法地址、权限错误等。在错误恢复前通常需要重新初始化该DMA通道的所有配置。4. 数据传送控制器DTC的工作机制与链式传输DTC可以看作是DMAC的一个轻量级、更灵活的“表亲”。它同样用于减轻CPU的数据搬运负担但激活方式和工作机制有显著不同。DTC不是基于通道的持续使能而是由中断事件激活每次激活执行一段预设的传输序列。4.1 DTC的核心传输信息表与向量表DTC的设计非常巧妙它的“配置”不是直接写入硬件寄存器而是存放在SRAM中的一张“传输信息表”里。每个中断向量号对应表中的一项。当该中断发生时DTC硬件会自动从SRAM的指定位置读取对应的传输信息加载到其内部寄存器MRA MRB MRC SAR DAR CRA CRB中然后开始传输。传输完成后它又可以将更新后的地址和计数值写回SRAM除非配置为不写回。这种设计使得DTC的上下文切换极其快速并且可以通过修改内存中的表来动态改变传输行为。关键寄存器解析DTCVBR (DTC Vector Base Register)指向存放“传输信息表”的SRAM基地址。MRA (Mode Register A)定义传输的基本模式。MD[1:0]传输模式00普通01重复10块11禁止。注意DTC没有重复-块模式。SZ[1:0]传输数据单元大小字节、半字、字、双字。SM[1:0]源地址更新模式固定、递增、递减。WBDIS写回禁止位。这是DTC的一个强大功能。当WBDIS1时传输完成后DTC不会将更新后的地址/计数写回SRAM。这意味着每次中断触发DTC都从完全相同的配置开始传输。这允许你将传输信息表存放在只读的Flash中用于静态的数据搬运任务节省宝贵的RAM。MRB (Mode Register B)定义更高级的控制模式。DM[1:0]目标地址更新模式。DTS选择重复/块区域是针对源地址还是目标地址。DISEL中断选择。0在完成指定数据量后向CPU发中断1每次执行DTC传输都向CPU发中断。后者可以实现更精细的每数据块通知。CHNE/CHNS链式传输使能和选择这是DTC的精华所在下文详述。4.2 链式传输实现复杂数据流的关键链式传输是DTC区别于基础DMAC的核心优势。它允许一次中断激活自动执行多个、可能不同配置的数据传输序列。工作原理 在传输信息表的一项中除了配置本次传输的参数还可以指定一个“下一个传输信息索引”Next Transfer Information Index。当本次传输完成后如果链式传输使能CHNE1且满足链触发条件由CHNS选择DTC不会停止而是自动根据这个索引去SRAM中加载下一组传输信息并继续执行而无需CPU干预。链触发条件 (CHNS位)CHNS 0连续链。只要本次传输完成就无条件启动链中的下一个传输。这用于创建一个连续的、多步骤的传输流水线。CHNS 1计数器归零链。仅当本次传输导致传输计数器CRA从1变为0时才启动链中的下一个传输。这用于实现“传输完N个数据后自动切换到另一个任务”的场景。一个典型应用案例数据采集与预处理流水线假设一个系统需要从ADC采集数据先存入Buffer A当Buffer A满后一方面开始采集到Buffer B另一方面需要对Buffer A的数据进行某种处理比如乘以一个系数表后送到DAC输出。传输信息1 (由ADC采样完成中断激活)源地址ADC数据寄存器固定目标地址Buffer A递增模式重复传输大小缓冲区A容量链式传输使能CHNS1计数器归零链指向传输信息2。中断DISEL0本传输完成后不发中断避免频繁打断CPU。传输信息2 (由传输信息1链式激活)源地址系数表固定或递增目标地址Buffer A递增模式块传输大小缓冲区A容量操作DTC从系数表读数据与Buffer A中的数据在总线上完成“读-修改-写”操作需硬件支持或配合其他外设实现系数乘法。链式传输使能CHNS1指向传输信息3。中断DISEL1本次块传输完成后向CPU发中断通知CPU“Buffer A已处理完毕可以取走”。传输信息3 (由传输信息2链式激活)源地址处理后的Buffer A递增目标地址DAC数据寄存器固定模式普通传输大小缓冲区A容量链式传输禁用。中断DISEL0。通过这样的链式配置一次ADC采样完成中断就自动触发了“填充Buffer A - 处理Buffer A - 输出Buffer A”的完整流水线。CPU仅在最后一步收到一个中断进行高层调度即可极大地提高了效率。配置陷阱手册在MRB寄存器的注释中特别警告当设置CHNE1且CHNS0连续链时每次传输请求链中每个传输信息的传输计数都会减1。因此你必须确保链中所有传输信息的传输计数设置是匹配的否则会导致链提前断裂或逻辑错误。在规划链式传输时务必仔细计算每个阶段的传输次数。5. 低功耗模式下的DMA/DTC操作要点在电池供电或对功耗敏感的设备中让系统进入低功耗模式是常态。DMA/DTC作为可能在外设触发下工作的模块其与低功耗模式的交互必须谨慎处理。5.1 进入低功耗模式前的准备在尝试进入模块停止Module-Stop、软件待机Software Standby或深度软件待机Deep Software Standby模式之前必须先将DMAST.DMST位设置为0挂起DMAC模块。为什么必须这么做低功耗模式会关闭或大幅降低某些时钟域或电源域的供电。如果DMA/DTC正在传输数据时进入这种模式可能会导致传输被意外中止数据丢失或损坏。总线访问失败触发错误中断。模块在非预期状态下被断电唤醒后无法正常工作。设置DMST0会通知DMAC/DTC模块即将进入低功耗状态使其有机会完成当前操作并进入一个安全的挂起状态。5.2 不同低功耗模式下的行为模块停止功能将对应DMAC的模块停止位置1可以关闭该DMAC的时钟以省电。关键点如果在该位置1时DMAC正在传输它会先完成当前的数据传输然后再进入模块停止状态。这保证了数据传输的完整性。在模块停止期间访问其寄存器是被禁止的。软件待机/深度软件待机模式当CPU执行WFI(Wait For Interrupt) 指令准备进入这些深度睡眠模式时如果DMA传输仍在进行系统会等待DMA传输完成然后才真正进入待机模式。这是一个硬件保障机制防止数据搬运过程被打断。唤醒后的操作从低功耗模式返回后如果需要使用DMA必须重新将DMAST.DMST位设置为1以解除DMAC模块的挂起状态。否则DMA将无法响应任何传输请求。5.3 一个常见的应用场景低功耗下的数据采集在传感器周期性采样的应用中通常使用定时器触发ADCADC转换完成触发DMA将数据存入内存。我们希望CPU在采样间隔内进入睡眠以省电。正确流程配置定时器、ADC、DMA使能DMA传输。CPU完成必要初始化后执行WFI进入睡眠。定时器到期触发ADC转换。ADC转换完成产生DMA请求。DMA被唤醒如果处于模块停止需要时钟恢复执行数据传输。DMA传输完成产生中断。CPU被DMA中断唤醒处理数据然后再次进入WFI。关键配置为了确保DMA请求能唤醒系统必须正确配置中断控制器ICU将DMA的传输完成中断请求目的地指定为CPU并且确保在待机模式下相关的中断源是使能的。6. 实际开发中的注意事项与排错指南手册的“Usage Notes”部分往往是血泪经验的结晶。这里结合我踩过的坑提炼出最关键的几个实操要点。6.1 传输期间禁止访问的寄存器列表这是一个铁律当某个通道的DMSTS.ACT标志为1或DMCNT.DTE位为1时严禁对以下寄存器进行写操作ICU.DELSR (DMA事件链接选择寄存器)DMSAR, DMDAR, DMCRA, DMCRB (地址和计数寄存器)DMTMD, DMINT, DMAMD, DMOFR (模式和控制寄存器)DMSBS, DMDBS, DMSRR, DMDRR (缓冲区和重复区域寄存器)DMBWR, ICUSARC, DMACSAR, DMCTL (其他控制寄存器)后果违反此规则会导致传输行为不可预测可能引发数据错误、总线锁死或系统异常。最常见的错误是在DMA传输过程中试图动态改变目标地址。正确做法是先停止DMA (DTE0)等待ACT0修改寄存器再重启DMA (DTE1)。6.2 DMA事件链接设置寄存器 (ICU.DELSRn) 的配置时机ICU.DELSRn寄存器用于选择哪个事件如外设中断触发DMA启动。手册强调必须在DMCNT.DTE0(DMA传输禁用) 时进行配置。对于同一个事件号不能同时将ICU.IELSRn.DTCE(DTC激活使能) 和ICU.DELSRn.DELS(DMA事件链接) 设置为有效。即一个事件源不能同时用于激活DTC和DMA二者只能选其一。6.3 暂停与重启DMA激活请求有时需要临时暂停DMA响应某个外设的请求。方法是将ICU.DELSRn.DELS[9:0]设置为0x000。这并不会停止正在进行的传输而是阻止新的传输请求被DMAC接收。 要重启只需重新写入正确的事件编号即可。6.4 防止DMA传输结束后意外的再次激活这是一个非常隐蔽的坑。假设一个DMA传输完成DTE被硬件清零。但是产生DMA请求的外设可能恰好在此时或稍早又产生了一个新的请求。由于DMA刚刚完成这个新请求可能会被DMAC锁存住。此时如果你简单地重新设置DTE1来启动下一次传输这个被锁存的旧请求会立即触发一次额外的、非预期的DMA传输。解决方案在重启DMA进行新一轮传输前按以下步骤清除可能残留的激活请求确保DMCNT.DTE 0。清除ICU中对应通道的中断请求标志ICU.DELSRn.IR 0。然后再进行新的配置并设置DTE1。6.5 DTC的写回禁止 (WBDIS) 与读跳过 (RRS) 的配合DTC的MRA.WBDIS位允许不写回传输信息这对于将配置表放在Flash中非常有用。但这里有一个限制如果传输信息表中至少有一项的WBDIS位为1则必须将DTCCR.RRS位设置为0禁止读跳过。 因为读跳过功能需要基于前一次传输写回的信息来计算下一次的读取地址如果写回被禁止读跳过逻辑就无法正确工作。在安全状态下则需要配置DTCCR_SEC.RRS位。6.6 调试技巧利用状态寄存器和错误寄存器当DMA/DTC行为异常时按以下顺序排查检查DMSTS.ACT和DMCNT.DTE确认DMA是否真的在运行或已停止。ACT比DTE更能反映硬件实际状态。检查DMSTS.DTIF和DMSTS.ESIF确认传输是否正常结束或被中断停止。如果标志位置1但没进中断检查DMINT中的中断使能位和ICU的中断配置。检查地址和计数器寄存器在传输停止后 (ACT0)读取DMSAR、DMDAR、DMCRA、DMCRB的值。它们应该与你预期的传输结束后的状态一致。如果不一致说明传输可能未完成或中途出错。检查错误寄存器DMECHR如果怀疑有传输错误这是第一个要查看的地方。它会记录是哪个通道发生了错误。检查总线错误状态寄存器如BUS.BUSERRSTATDMACm等可以获取更详细的错误类型主设备MPU错误、从设备总线错误、非法访问等。对于DTC检查SRAM中的传输信息表是否被正确写入。可以在DTC激活前后对比传输信息表内容的变化验证写回功能是否正常。最后关于DMA传输到保留区域的问题手册的警告非常明确绝对禁止。访问保留区域的结果是未定义的可能导致系统崩溃。务必在软件中做好地址范围的校验或者利用MPU对DMA通道的访问范围进行限制这是提高系统鲁棒性的重要手段。