4. DMA触发源配置:硬件触发与软件触发、触发源选择(PIT、ADC、LPUART等)

DMA传输的启动依赖于触发源产生的请求信号。在S32K3系列中,DMA触发源分为硬件触发和软件触发两大类。正确配置触发源是实现高效、低延迟数据传输的关键,也是项目移植中最容易出错的环节之一。

核心概念: DMA本身不主动搬运数据,它等待触发源发出“开始传输”的脉冲。触发源的选择直接决定了数据传输的实时性和CPU的解放程度。

4.1 硬件触发 vs. 软件触发

特性 硬件触发 软件触发
触发方式 由外设(定时器、ADC、串口等)硬件事件自动产生DMA请求 由CPU执行特定指令(写寄存器)手动启动DMA传输
实时性 高,外设事件与DMA传输之间延迟极低(通常几个时钟周期) 低,依赖CPU响应和指令执行时间
CPU负载 零负载,CPU可同时处理其他任务或进入低功耗模式 需要CPU参与触发,增加软件开销
典型应用 ADC连续采样、PWM更新、串口FIFO搬运、定时器触发数据搬移 初始化数据块拷贝、内存填充、调试阶段手动触发
配置复杂度 需要配置外设的DMA请求输出和DMA通道的触发选择 只需配置DMA通道,无需外设联动
移植避坑: 从S32K1移植到S32K3时,硬件触发源的映射关系(DMAMUX)发生了根本性变化。S32K3使用新的DMA请求多路复用器(DMA_MUX),每个DMA通道的触发源选择寄存器位宽和编码方式与S32K1完全不同,不能直接复制寄存器配置值。

4.2 触发源选择架构:DMA_MUX

S32K3的DMA触发源通过DMA请求多路复用器(DMA_MUX)进行路由。每个DMA通道对应一个DMA_MUX通道,开发者通过配置DMA_MUX通道寄存器来选择该通道的触发源。

S32K3 DMA触发源选择架构(DMA_MUX) PIT 定时器 ADC 转换完成 LPUART 接收/发送 LPI2C / LPSPI 软件触发 (SW) DMA_MUX 通道 0 ~ 31 触发源选择寄存器 (CHCFG[SOURCE]) 使能位 (ENBL) 触发类型 (TRIG) eDMA 引擎 通道 0 通道 1 通道 2 ... 通道 31 说明: 每个DMA通道通过DMA_MUX独立选择触发源,支持硬件事件和软件触发。 虚线表示软件触发路径,无需外设事件参与。

4.3 常用硬件触发源详解

4.3.1 PIT(周期中断定时器)触发

PIT是最常用的DMA触发源之一,适用于需要周期性数据搬移的场景,如定时从ADC结果寄存器读取数据、定时更新DAC输出等。

  • 配置要点: 使能PIT通道的DMA请求输出(PIT_TCTRLn[TIE] = 0,PIT_TCTRLn[CHN] = 0,PIT_TCTRLn[TEN] = 1),定时器溢出时自动产生DMA请求。
  • 移植注意: S32K3的PIT模块与S32K1基本兼容,但DMA请求输出使能位的位置和DMA_MUX的触发源编号需要重新确认。
/* PIT配置示例:PIT通道0产生DMA请求,触发DMA通道3 */
/* 1. 配置PIT */
PIT->CH[0].LDVAL = 10000;          /* 加载值,决定周期 */
PIT->CH[0].TCTRL = 0x3;            /* TEN=1, TIE=0, 使能定时器,不使能中断,使能DMA请求 */

/* 2. 配置DMA_MUX通道3,选择PIT通道0作为触发源 */
DMA_MUX->CHCFG[3] = (0U
    | DMA_MUX_CHCFG_SOURCE(41)      /* PIT_CH0触发源编号为41(需查阅芯片参考手册) */
    | DMA_MUX_CHCFG_ENBL_MASK       /* 使能DMA_MUX通道 */
    | DMA_MUX_CHCFG_TRIG_MASK       /* 设置为硬件触发模式 */
);

4.3.2 ADC触发

ADC转换完成后自动触发DMA,将转换结果搬移到内存缓冲区,实现零CPU开销的连续采样。

  • 配置要点: 在ADC配置中使能DMA请求(ADC_CR[DMAEN] = 1),并设置ADC结果寄存器为DMA源地址。
  • 典型场景: 多通道扫描模式下,每次转换完成触发一次DMA传输,将结果依次存入数组。
性能优势: 使用ADC+DMA方式,即使以1Msps采样率连续采集,CPU占用率几乎为0%,而传统中断方式在相同采样率下CPU占用率可达30%~50%。

4.3.3 LPUART触发

LPUART的接收和发送均可触发DMA,适用于大数据量串口通信,如固件升级、日志输出、与无线模块的数据交换。

方向 触发条件 DMA传输方向 典型配置
接收 (RX) 接收数据寄存器非空(RDRF) 外设 → 内存 源地址:LPUART_RDR,目的地址:接收缓冲区
发送 (TX) 发送数据寄存器空(TDRE) 内存 → 外设 源地址:发送缓冲区,目的地址:LPUART_TDR
/* LPUART DMA发送配置示例 */
/* 1. 配置LPUART使能DMA发送请求 */
LPUART->BAUD |= LPUART_BAUD_TDMAE_MASK;   /* 使能发送DMA请求 */

/* 2. 配置DMA_MUX通道5,选择LPUART0_TX作为触发源 */
DMA_MUX->CHCFG[5] = (0U
    | DMA_MUX_CHCFG_SOURCE(26)      /* LPUART0_TX触发源编号(需查阅参考手册) */
    | DMA_MUX_CHCFG_ENBL_MASK
    | DMA_MUX_CHCFG_TRIG_MASK
);

/* 3. 配置DMA TCD(传输控制描述符) */
DMA->TCD[5].SADDR = (uint32_t)txBuffer;          /* 源地址:发送缓冲区 */
DMA->TCD[5].DADDR = (uint32_t)&LPUART0->DR;      /* 目的地址:LPUART数据寄存器 */
DMA->TCD[5].NBYTES = 1;                          /* 每次传输1字节 */
DMA->TCD[5].CITER = 256;                         /* 主循环次数 */
DMA->TCD[5].BITER = 256;
/* ... 其他TCD配置(地址调整、中断使能等) ... */

4.4 软件触发配置

软件触发用于非实时性数据搬移或调试阶段。配置方式简单,无需外设参与。

/* 软件触发DMA传输示例 */
/* 1. 配置DMA_MUX通道0,选择软件触发 */
DMA_MUX->CHCFG[0] = (0U
    | DMA_MUX_CHCFG_SOURCE(0)       /* SOURCE=0 表示软件触发 */
    | DMA_MUX_CHCFG_ENBL_MASK       /* 使能通道 */
    /* 注意:软件触发时TRIG位通常置0,表示由软件写触发寄存器启动 */
);

/* 2. 配置DMA TCD(略) */

/* 3. 软件触发:写DMA_SSRT寄存器启动传输 */
DMA->SSRT = DMA_SSRT_SSRT(0);       /* 向通道0的软件触发寄存器写入任意值 */
关键区别: 软件触发时,DMA_MUX的TRIG位应配置为0(电平触发模式),而硬件触发通常配置为1(边沿触发模式)。错误配置TRIG位可能导致DMA请求无法被正确识别。

4.5 触发源选择流程与移植检查清单

DMA触发源配置移植检查流程 步骤1 确定外设DMA请求编号 步骤2 配置外设DMA请求使能 步骤3 配置DMA_MUX通道 步骤4 配置DMA TCD 步骤5 使能DMA通道 步骤6 验证触发与传输 移植检查清单: ☐ 外设DMA请求编号是否与S32K3参考手册一致? ☐ DMA_MUX的TRIG位配置是否正确(硬件触发=1,软件触发=0)? ☐ 外设时钟是否已使能?DMA_MUX通道是否已使能(ENBL=1)?

4.6 常见问题与调试建议

问题现象 可能原因 排查方法
DMA从未启动 DMA_MUX通道未使能(ENBL=0)或触发源编号错误 读取DMA_MUX_CHCFG寄存器,确认SOURCE和ENBL位
DMA只传输一次后停止 TCD的CITER/BITER配置为1,或DREQ位导致传输完成后自动禁用 检查TCD的CITER初始值和DREQ位设置
传输数据错位 源/目的地址未按传输宽度对齐,或地址调整配置错误 检查SADDR/DADDR对齐方式和SMOD/DMOD设置
硬件触发不响应 外设DMA请求输出未使能,或DMA_MUX的TRIG位配置为0 确认外设DMA使能位,检查TRIG位是否为1
调试技巧: 在开发初期,可以先使用软件触发验证DMA通道和TCD配置是否正确,确认无误后再切换为硬件触发。这样可以隔离问题,快速定位是DMA配置问题还是外设触发问题。