1. 项目概述与DTC核心价值
在嵌入式系统开发,尤其是基于瑞萨RA8D2这类高性能MCU的项目中,我们经常面临一个经典矛盾:CPU需要处理复杂的应用逻辑,而同时又要应对大量、频繁的数据搬运任务,比如从ADC读取采样数据填充到缓冲区,或者将处理完的图像数据发送到LCD显存。如果让CPU亲自通过memcpy或循环读写来处理这些数据,其宝贵的计算周期就会被大量消耗在简单的“搬运工”工作上,导致系统响应变慢,实时性大打折扣。这时,DMA(直接内存访问)技术就成了我们的“救星”。
DTC,即数据传送控制器,是瑞萨RA系列MCU中集成的DMA引擎。与一些基础DMA控制器不同,DTC的设计更为精巧和强大。它不仅仅是一个简单的“数据搬运工”,更是一个可编程的、基于事件(通常是中断)触发的数据传输状态机。其核心思想是“配置一次,自动执行”。开发者通过预先在内存中设置好一套“传输信息”(Transfer Information),其中包括源地址、目标地址、传输次数、地址增减方式等。当某个外设(如ADC转换完成)或软件事件触发时,DTC便会自动加载这套配置,在后台独立完成全部数据传输,整个过程无需CPU干预。传输完成后,它还可以选择性地产生中断通知CPU,让CPU只在需要处理数据时才介入,极大提升了系统效率。
理解DTC的寄存器配置,尤其是像MRC、CRA、CRB这些控制传输行为细节的寄存器,是释放RA8D2芯片性能潜力的关键。这不仅仅是照着手册填几个数值,更是对数据传输流程的精细雕刻。今天,我们就深入这些寄存器的细节,从地址偏移到传输模式,把DTC的工作原理和配置“掰开揉碎”讲清楚。
2. DTC寄存器架构与访问机制解析
在开始配置具体的传输模式前,我们必须先理解DTC寄存器的一个独特设计:间接访问机制。这与我们通常直接读写外设寄存器的方式截然不同,也是新手最容易困惑的地方。
2.1 核心概念:传输信息与向量表
DTC的运作依赖于一套存储在SRAM(或ROM)中的数据结构,称为“传输信息”。每一组传输信息对应一个可能的触发源(即一个中断向量),它包含了控制一次传输所需的所有寄存器参数,例如我们即将详细讨论的MRC、SAR、DAR、CRA、CRB等。
那么DTC如何找到它呢?这需要另一张表:DTC向量表。你可以把它想象成一个“目录”或“跳转表”。这个表也存放在内存中,其基地址由DTCVBR(非安全区)或DTCVBR_SEC(安全区)寄存器指定。表中的每一项(每个向量号对应一项)存储的不是数据本身,而是指向对应“传输信息”结构起始地址的指针。
工作流程简化版:
- 事件触发:比如向量号为
n的ADC中断发生。 - 查找目录:DTC计算向量表项地址:
DTCVBR基地址 + n * 4。 - 获取地址:从该地址读取一个32位的值,这就是“传输信息(n)”在内存中的起始地址。
- 加载配置:DTC自动从这个起始地址开始,连续读取16字节(4个字)的数据,分别加载到其内部的MRC、SAR、DAR、CRA等寄存器中。
- 执行传输:根据加载的配置开始搬运数据。
- 回写(可选):传输完成后,DTC可能会将当前更新的寄存器值(如递减后的地址、计数器)写回内存中的“传输信息”区域,以便下次使用或供CPU查询。
2.2 寄存器“不可直接访问”的含义
现在来看手册中对MRC、SAR等寄存器的描述:“Base address: DTCVBR_SEC / DTCVBR, Offset address: 0x01 + 0x4 × Vector number (Inaccessible directly from the CPU)”。
这句话的意思是:你无法像操作GPIO控制寄存器那样,通过一个固定的内存映射地址(如0x4000_0000)来直接读写DTC内部的MRC寄存器。CPU能做的,是在内存中准备好“传输信息”结构体,并正确设置向量表。当DTC被激活时,它会自动将内存中的数据“搬运”到其内部寄存器中。
例如,对于向量号n,其传输信息结构体在内存中的布局如下(假设起始地址为InfoAddr_n):
InfoAddr_n + 0x00:MRA(模式寄存器A)InfoAddr_n + 0x01:MRC(模式寄存器C)InfoAddr_n + 0x02:MRB(模式寄存器B)InfoAddr_n + 0x03: 保留(必须为0)InfoAddr_n + 0x04:SAR(源地址寄存器,低32位)InfoAddr_n + 0x08:DAR(目标地址寄存器,低32位)InfoAddr_n + 0x0C:CRB(传输计数寄存器B)InfoAddr_n + 0x0E:CRA(传输计数寄存器A)
所以,当我们说“配置MRC寄存器”时,实际的操作是:在代码中定义一个结构体或数组,在偏移+0x01的位置写入我们希望MRC寄存器拥有的值(例如,设置DISPE位),并将这个结构体的起始地址填入向量表的对应项。
实操心得:在编程时,强烈建议使用结构体来定义传输信息,并通过
__attribute__((aligned(16)))确保其起始地址是16字节对齐的(手册强制要求)。这不仅使代码清晰,也避免了手动计算偏移量的麻烦和错误。例如:typedef struct __attribute__((packed, aligned(4))) { volatile uint8_t MRA; volatile uint8_t MRC; volatile uint8_t MRB; volatile uint8_t RESERVED; volatile uint32_t SAR; volatile uint32_t DAR; volatile uint16_t CRB; volatile uint16_t CRA; } dtc_transfer_info_t; // 在SRAM中定义一个实例,并强制16字节对齐 __attribute__((aligned(16))) dtc_transfer_info_t my_transfer_info; // 配置传输信息 my_transfer_info.MRC = 0x01; // 设置DISPE位为1 my_transfer_info.SAR = (uint32_t)&source_buffer; my_transfer_info.DAR = (uint32_t)&dest_buffer; my_transfer_info.CRA = 100; // 设置传输次数 // 将传输信息的地址填入向量表 uint32_t *dtc_vector_table = (uint32_t*)(DTCVBR); dtc_vector_table[ADC_VECTOR_NUM] = (uint32_t)&my_transfer_info;
3. 关键寄存器深度剖析与配置实战
理解了访问机制,我们就可以深入每个寄存器的位定义了。这里我们聚焦于项目资料中提到的几个关键寄存器。
3.1 MRC寄存器与DISPE位:动态源地址偏移
MRC寄存器目前只定义了一个有效的位:DISPE (Displacement Added)。
功能:当DISPE=1时,实际的传输源地址不再是SAR寄存器中的值,而是
SAR + DTCDISP。DTCDISP是一个独立的32位偏移量寄存器,可以直接由CPU配置。用途:这功能非常实用。假设你有一个大的数据缓冲区,但每次触发DTC时,只想传输其中一段。你不需要在每次传输前都去修改SAR寄存器(这需要CPU干预)。你可以将SAR设置为缓冲区基地址,然后通过改变
DTCDISP的值来动态指定本次传输的起始点。这在处理循环缓冲区或数据流窗口时特别高效。关键约束与配置要点:
- 必须与WBDIS和RRS位配合:手册明确强调,当设置
MRC.DISPE = 1时,必须同时设置MRA.WBDIS = 1(禁止回写)和DTCCR.RRS = 0(禁止读跳过)。这是硬性规定。 - 为什么?逻辑是这样的:DISPE功能依赖于
DTCDISP这个“外部”寄存器。如果允许传输信息回写(WBDIS=0),那么传输后SAR的值会被更新(可能是SAR+偏移后的地址),写回内存。下次传输再加载这个错误的SAR,就会出错。因此必须禁止回写,保持SAR为初始基地址。同时,读跳过(RRS)功能依赖于前后两次传输使用完全相同的传输信息,而DISPE引入了动态变量DTCDISP,破坏了这一前提,所以也必须禁用。 - 安全状态:如果在安全状态下使用,需要操作的是
DTCCR_SEC.RRS位,而非DTCCR.RRS。
- 必须与WBDIS和RRS位配合:手册明确强调,当设置
配置示例:实现一个从
source_array的某个偏移处开始,传输100个字节到dest_array的配置。// 1. 配置传输信息(禁止回写) my_transfer_info.MRA = 0x40; // 假设设置传输模式为普通模式,数据大小8位,WBDIS=1 my_transfer_info.MRC = 0x01; // DISPE = 1 my_transfer_info.SAR = (uint32_t)source_array; // 基地址 my_transfer_info.DAR = (uint32_t)dest_array; my_transfer_info.CRA = 100; // 2. 配置DTC全局控制寄存器(禁用读跳过) DTCCR = 0x00; // 确保RRS位为0 // 3. 在每次需要改变起始点时,在触发传输前设置偏移量 DTCDISP = offset; // offset为字节偏移量,例如 50 // 4. 触发DTC传输(例如使能对应中断)注意事项:
DTCDISP是字节偏移。如果你的数据宽度是半字(16位)或字(32位),且源地址SAR已按数据宽度对齐,那么DTCDISP也应该是数据宽度的整数倍,以避免非对齐访问错误(某些架构或模式下会触发总线错误)。
3.2 CRA与CRB寄存器:传输计数的艺术
CRA和CRB是控制传输次数的核心,但它们在不同模式下的行为截然不同,是配置中的重点和难点。
CRA寄存器:这是一个16位寄存器,在软件看到的传输信息结构体中,它被拆分为高8位CRAH和低8位CRAL。它的角色由MRA.MD[1:0](传输模式)决定。
CRB寄存器:这是一个16位寄存器,仅在块传输模式下用于计数“块”的数量。
下表清晰地展示了它们在不同模式下的分工:
| 传输模式 (MRA.MD[1:0]) | CRAH (高8位) 作用 | CRAL (低8位) 作用 | CRB (16位) 作用 | 总传输数据量计算 |
|---|---|---|---|---|
| 普通模式 (00b) | 与CRAL共同组成16位计数器 | 与CRAH共同组成16位计数器 | 忽略 | CRA次 × 数据宽度 |
| 重复模式 (01b) | 重复计数器(初始值) | 当前计数器(每次传输递减) | 忽略 | CRAH×CRAL次 × 数据宽度 |
| 块传输模式 (10b) | 块大小(每个块包含的数据单元数) | 块大小计数器(块内递减) | 块数量计数器 | CRB块 ×CRAH单元/块 × 数据宽度 |
3.2.1 普通传输模式解析
这是最直观的模式。CRA作为一个整体的16位计数器。
- 设置值:
0x0001代表传输1次,0xFFFF代表传输65535次,0x0000代表传输65536次。这是嵌入式系统中常见的“以0表示最大值”的约定。 - 操作:每完成一次数据传输,CRA值减1。
- 应用场景:简单的、一次性的线性数据传输。例如,将一段固定长度的数据从Flash拷贝到RAM。
3.2.2 重复传输模式解析
这个模式稍微复杂,用于实现“地址回环”的传输。你需要通过MRB.DTS位指定哪一端(源或目标)是“重复区域”。
- CRAH:设定重复的次数(例如,
CRAH = 10,表示重复10轮)。 - CRAL:每一轮中传输的次数(例如,
CRAL = 20,表示每轮传输20个数据单元)。 - 工作流程:
- DTC加载配置,开始传输。
- 每传输一个数据,
CRAL--。 - 当
CRAL减到0x00时,不是结束,而是将CRAH的值重新装载到CRAL,同时将重复区域的地址寄存器(SAR或DAR)重置为初始值。 - 重复步骤2-3,直到完成了
CRAH轮这样的循环。
- 关键点:在重复模式下,必须设置
CRAH == CRAL。因为当CRAL归零重载时,是用CRAH的值来填充的。如果你设置CRAH=10, CRAL=20,那么第一轮传输20次后,CRAL重载为10,第二轮就只传输10次了,这可能不是你想要的行为。 - 应用场景:非常适合处理二维数据或周期性刷新。例如,将一个包含10个传感器、每个传感器20个读数的数据表,传输到LCD上显示为10行x20列的表格。重复区域是行地址(每输完20个数据换行时地址复位),非重复区域是列地址(每输出一个数据后递增)。
3.2.3 块传输模式解析
这是最高效的模式,用于搬运大块连续数据。它将传输组织为“块”的嵌套循环。
- CRAH:定义每个“块”包含多少个数据单元(注意是单元数,不是字节数。单元大小由
MRA.SZ决定,可以是8/16/32/64位)。 - CRAL:作为块内计数器,每传输一个单元,
CRAL--。 - CRB:定义一共有多少个这样的“块”。
- 工作流程:
- DTC加载配置,开始传输。
- 在一个块内,每传输一个数据单元,
CRAL--。 - 当
CRAL减到0x00时,表示一个块传输完成。此时,CRAH的值重载到CRAL,为下一个块做准备,同时CRB--。 - 重复步骤2-3,直到
CRB减到0,整个传输结束。
- 关键点:同样需要设置
CRAH == CRAL。块传输模式的优势在于,它减少了对传输信息的访问开销。在普通模式下传输N个数据,DTC可能需要频繁更新和回写计数器。而在块传输模式下,它在一个块内连续传输,只有在一个块结束时才更新CRAL和CRB,效率更高。 - 应用场景:大数据量的DMA传输,例如从SD卡读取一个扇区(512字节)的数据到RAM。你可以设置一个块为32个字(128字节),共4个块(
CRB=4)来完成整个扇区的传输。
避坑指南:计数器的初始值手册中关于“1, 255, 256”的表述容易让人误解。它想表达的是计数器的“模运算”特性。以8位的
CRAL为例:
- 你写入
0x01,计数器初值为1,传输1次后归零。- 你写入
0xFF(255),计数器初值为255,传输255次后归零。- 你写入
0x00,计数器初值为0,但在硬件中它被解释为256,传输256次后归零。最安全的实践是:永远把你想要传输的次数N,直接写入计数器。即,想传100次,就写100 (0x64)。硬件会自动处理模256的运算。对于16位的CRA或CRB,同理,写入N即可,0x0000代表65536。
3.3 地址对齐与MRA.SZ配置
在配置SAR和DAR时,手册反复强调“Misalignment is prohibited”。这意味着你必须根据选择的数据宽度,确保地址是对齐的。
MRA.SZ[1:0] = 01b(16位半字传输):源和目标地址的bit[0]必须为0。MRA.SZ[1:0] = 10b(32位字传输):源和目标地址的bit[1:0]必须为0。MRA.SZ[1:0] = 11b(64位双字传输):源和目标地址的bit[2:0]必须为0。
非对齐访问在某些架构上会导致性能下降,在另一些架构上则会直接引发硬件错误。在RA8D2的DTC中,这是禁止的,配置时务必检查。
4. 传输模式实战配置与流程分析
了解了关键寄存器后,我们来组合它们,看看一次完整的DTC传输是如何进行的。我们以最常见的普通传输模式为例,梳理从初始化到触发完成的完整流程,并分析其状态变迁。
4.1 完整配置流程示例
假设我们需要配置向量号VEC_NUM=0x4A(对应某个ADC扫描完成中断)的DTC,将ADC结果寄存器&ADC->ADDR0(假设地址为0x40080000)中的数据,连续传输100个到数组adc_results[100]中。
// 步骤1:定义并初始化传输信息结构体(在SRAM中) __attribute__((aligned(16))) dtc_transfer_info_t adc_dtc_info; void dtc_adc_init(void) { // 步骤2:填充传输信息 // MRA: 普通模式(00),数据大小16位半字(01),源地址递增(01),目标地址递增(01),启用回写(0) // 假设 MRA = [MD1:0][SZ1:0][SM1:0][DM1:0][WBDIS] // = 00 01 01 01 0 adc_dtc_info.MRA = 0x14; // 二进制 00010100 adc_dtc_info.MRC = 0x00; // DISPE=0,不使用偏移 adc_dtc_info.MRB = 0x00; // 假设不使用链式传输和立即中断 adc_dtc_info.RESERVED = 0x00; adc_dtc_info.SAR = (uint32_t)&ADC->ADDR0; // 源:ADC数据寄存器 adc_dtc_info.DAR = (uint32_t)&adc_results[0]; // 目标:数组 adc_dtc_info.CRB = 0x0000; // 普通模式,CRB忽略 adc_dtc_info.CRA = 100; // 传输100次 // 步骤3:配置DTC向量表 // 首先需要设置向量表基地址DTCVBR(通常在系统初始化时完成一次) // 假设我们将向量表放在 SRAM 区域 0x20001000 #define DTC_VECTOR_TABLE_BASE (0x20001000UL) DTCVBR = DTC_VECTOR_TABLE_BASE; // 计算向量表项地址,并填入传输信息的地址 uint32_t *vector_table = (uint32_t*)DTC_VECTOR_TABLE_BASE; // 向量号 0x4A 对应的表项偏移是 0x4A * 4 = 0x128 // 传输信息地址必须16字节对齐,我们的结构体已用 aligned(16) 保证 vector_table[0x4A] = (uint32_t)&adc_dtc_info; // 步骤4:配置ICU(中断控制器),将ADC中断链接到DTC // 设置IELSRn(n=0x4A)的DTCE位为1,并选择正确的触发源 ICU.IELSR[0x4A].DTCE = 1; ICU.IELSR[0x4A].IELS = ADC_SCAN_COMPLETE_EVENT_NUM; // 假设的事件号 // 步骤5:启动DTC模块 DTCST = 0x01; // 置位DTCST启动位 }4.2 DTC操作流程与状态机解读
配置完成后,当ADC扫描完成中断发生时,DTC的硬件操作流程如下(结合手册图18.5):
- 激活与仲裁:ADC中断请求到达。由于ICU.IELSRn.DTCE=1,该中断被配置为触发DTC,而非CPU。DTC模块检查自身状态(DTCSTS.ACT标志)。如果DTC空闲(ACT=0),则接受该请求。如果DTC正忙,则根据向量号优先级排队。
- 向量读取与信息加载:
- DTC根据触发中断的向量号
n(0x4A),计算向量地址:DTCVBR + n * 4。 - 读取该地址处的值,得到传输信息起始地址
InfoAddr。 - DTC从
InfoAddr开始,连续读取16字节,加载到其内部的MRA, MRC, SAR, DAR, CRA, CRB寄存器中。
- DTC根据触发中断的向量号
- 数据传输循环:
- 根据SAR地址读取一个16位数据(半字)。
- 根据DAR地址写入该数据。
- 根据MRA.SM和MRB.DM的设置,更新SAR和DAR地址(本例中两者都递增2字节)。
- CRA寄存器值减1。
- 传输完成判断与后处理:
- 检查CRA是否减到0。如果未到0,回到步骤3进行下一次传输。
- 如果CRA减到0,表示100次传输全部完成。
- 回写:由于我们设置了
MRA.WBDIS=0,DTC会将当前更新的寄存器值(SAR和DAR已指向第100个数据之后的位置,CRA=0)写回内存中的adc_dtc_info结构体。这是一个关键点:如果你希望下次ADC触发时,DTC还能从初始地址开始传输,就必须在传输信息中设置地址为“固定”模式,或者在每次传输前由CPU重新初始化传输信息中的地址和计数器。否则,第二次触发会从错误的位置继续传输。 - 中断生成:传输完成后,DTC会清除ICU.IELSRn.IR标志(表示已处理),并清除ICU.IELSRn.DTCE位。这意味着,该中断源的下一次触发将不再激活DTC,而是可能直接触发CPU中断(如果CPU中断使能)。这是一个非常重要的行为,它防止了DTC被同一个未处理的事件连续触发。通常,我们会在CPU的中断服务程序(ISR)中,在处理完数据后,重新使能DTCE位,为下一次传输做准备。
- 状态更新:DTC将DTCSTS.ACT标志清零,表示传输结束,可以接受下一个请求。
4.3 链式传输与读跳过高级功能
- 链式传输:通过设置
MRB.CHNE=1,可以在一次激活后执行多次“不同”的传输。传输信息在内存中需要连续存放多份(每份16字节)。当第一组传输的计数器归零后,DTC会自动将传输信息起始地址增加16字节,加载下一组配置并继续执行。这适用于复杂的数据搬运序列,例如“从A拷贝到B,再从C拷贝到D”。 - 读跳过:通过设置
DTCCR.RRS=1,当DTC被相同向量号连续触发时,可以跳过“读取向量表”和“加载传输信息”的步骤,直接使用DTC内部寄存器中当前的配置进行传输。这能显著减少触发延迟,提高响应速度。但使用条件苛刻:必须保证前后两次传输的配置完全一致,且MRA.WBDIS必须为0(允许回写),以便DTC内部的配置在第一次传输后已被更新为正确的“下一次”状态。我们的ADC例子中,如果每次传输后地址和计数器都变了,就不适合用读跳过。
5. 常见问题排查与调试技巧实录
在实际使用DTC时,你一定会遇到传输没有发生、数据错位或系统卡住的问题。以下是我踩过坑后总结的排查清单。
5.1 问题排查速查表
| 现象 | 可能原因 | 检查点与解决方案 |
|---|---|---|
| DTC完全不启动 | 1. DTC模块未启动。 2. 中断源未正确链接到DTC。 3. 向量表地址未设置或设置错误。 4. 传输信息地址非16字节对齐。 | 1. 检查DTCST寄存器是否为1。2. 检查对应 ICU.IELSRn的DTCE位是否置1,IELS字段是否选择了正确的事件号。3. 检查 DTCVBR寄存器值,并用调试器查看该地址开始的向量表内容是否正确指向了传输信息地址。4. 使用 (uint32_t)&info_struct & 0xF检查地址低4位是否为0。 |
| 只传输了一次就停止 | 1. 传输计数器CRA/CRB设置错误(例如,设成了1)。 2. 传输完成后 DTCE位被自动清除,后续触发无效。 | 1. 核对CRA/CRB的写入值,确认是预期的传输次数。 2. 这是正常行为。需要在CPU的中断服务程序中,在数据处理完后,重新置位 ICU.IELSRn.DTCE = 1。或者,考虑使用MRB.DISEL=1配置为每次传输完成都产生中断(不自动清除DTCE),但这会增加CPU负载。 |
| 数据传输地址错乱 | 1. SAR/DAR地址未按数据宽度对齐。 2. 地址递增/递减模式配置错误(MRA.SM/MRB.DM)。 3. 使用了DISPE功能,但未遵守WBDIS=1和RRS=0的约束。 4. 传输信息回写导致地址被意外修改。 | 1. 检查地址值是否符合对齐要求。 2. 确认SM/DM位设置是否符合预期(00b固定,01b递增,10b递减)。 3. 检查 MRC.DISPE=1时,MRA.WBDIS和DTCCR.RRS是否已按要求配置。4. 如果不希望地址被修改,可将对应地址设置为固定模式,或设置 WBDIS=1禁止回写(需注意DISPE和RRS的关联限制)。 |
| 系统进入HardFault或卡死 | 1. DTC试图访问非法内存地址(如未初始化的指针)。 2. 传输过程中产生了总线错误(如非对齐访问)。 3. 中断嵌套或优先级冲突导致资源死锁。 | 1. 用调试器检查SAR和DAR寄存器的值是否在有效内存范围内。 2. 检查地址对齐和数据宽度设置。 3. 检查DTC传输与CPU或其他总线主设备(如DMA)是否访问了同一块内存区域而未做同步(考虑使用内存屏障或软件标志)。检查中断优先级配置。 |
| 使用读跳过(RRS)功能无效 | 1. 前后两次触发的向量号不同。 2. 第一次传输后,传输信息未成功回写(WBDIS=1)。 3. 第一次传输是链式传输或计数器归零。 | 1. 确保是同一个中断源连续触发。 2. 要使用RRS,必须设置 WBDIS=0。3. 手册规定,链式传输或计数器归零后的传输,会强制读传输信息,RRS无效。 |
5.2 调试心得与高级技巧
- 活用DTC状态寄存器:
DTCSTS寄存器是你的第一道诊断工具。ACT标志告诉你DTC是否正在忙。VECN字段(当ACT=1时有效)显示了当前正在处理哪个向量号的请求。这在调试多个DTC通道时非常有用。 - 初始化后手动触发测试:在系统初始化完成后,不要急于等待外部事件。你可以通过软件事件链接寄存器
ELSEGRn手动触发一次DTC传输,验证你的配置是否正确。这能帮你快速区分是DTC配置问题,还是外设中断产生的问题。 - 内存视图观察:在调试器中,实时观察你定义的传输信息结构体所在的内存区域。在DTC传输前后,查看SAR、DAR、CRA等字段的值是否按预期变化。这是验证回写行为最直接的方法。
- 性能考量:对于极小数据量的传输(如几个字节),DTC的启动开销(读向量表、读传输信息)可能抵消其优势。此时,用CPU直接搬运可能更简单高效。DTC的优势在于大批量、规律性的数据传输。
- 安全区与非安全区:RA8D2具有TrustZone安全特性。注意
DTCVBR和DTCVBR_SEC、DTCCR和DTCCR_SEC的区别。如果你的应用涉及安全世界和非安全世界,需要确保在正确的安全状态下配置对应的寄存器,并且向量表和传输信息也存放在对应安全属性的内存中。
理解DTC寄存器的工作机制,就像掌握了指挥一个高效后勤团队的密码。从地址偏移的微调(DISPE),到传输模式的宏观规划(普通、重复、块传输),再到计数器(CRA/CRB)的精细控制,每一步配置都直接影响着数据流的效率和可靠性。