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通道寄存器来选择该通道的触发源。
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 触发源选择流程与移植检查清单
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配置问题还是外设触发问题。