在 MM32SPIN560C 微控制器中,串口(UART)的 DMA 传输可大幅减轻 CPU 负担,实现数据的"自动收发"。结合《MM32SPIN560C 用户手册(中文版)》中 UART 和 DMA 相关章节,以下从"原理匹配""配置步骤""关键注意事项"三方面,详解串口打印(UART 发送)如何使用 DMA。
一、先明确:UART 与 DMA 的硬件关联
根据手册内容,UART 模块支持通过 DMA 实现数据发送(TX)和接收(RX),核心关联规则如下:
- DMA 通道映射 :
UART 的 DMA 请求需映射到指定 DMA 通道,具体映射关系可通过SYSCFG_CFGR
寄存器(系统控制器配置寄存器)调整。以常用的 UART1 为例:- UART1_TX(发送)默认映射到 DMA 通道 2,若配置
SYSCFG_CFGR.UART1_TX_DMA_RMP = 1
,可重映射到 DMA 通道 4; - UART1_RX(接收)默认映射到 DMA 通道 3,若配置
SYSCFG_CFGR.UART1_RX_DMA_RMP = 1
,可重映射到 DMA 通道 5(参考手册"11.5.1 DMA 请求映像"章节)。
- UART1_TX(发送)默认映射到 DMA 通道 2,若配置
- DMA 传输方向 :
串口打印为"存储器到外设"方向------DMA 从指定的 RAM 缓冲区中读取数据,自动发送到 UART 的发送数据寄存器(UART_TDR),无需 CPU 逐字节写入。
二、串口打印(UART_TX)用 DMA 的详细配置步骤
以"UART1 结合 DMA 通道 2 实现串口打印"为例,结合手册寄存器配置逻辑,步骤如下:
第一步:使能核心外设时钟
需先为 UART、DMA、SYSCFG(用于 DMA 通道重映射,可选)使能时钟,确保模块正常工作:
- 使能 UART1 时钟 :
配置RCC_APB2ENR
(APB2 外设时钟使能寄存器)的UART1
位为 1(手册"5.3.8 RCC_APB2ENR"章节),UART1 挂载于 APB2 总线,时钟频率最高支持 96MHz。 - 使能 DMA 时钟 :
配置RCC_AHBENR
(AHB 外设时钟使能寄存器)的DMA
位为 1(手册"5.3.7 RCC_AHBENR"章节),DMA 挂载于 AHB 总线,需确保 AHB 时钟正常。 - (可选)使能 SYSCFG 时钟 :
若需调整 UART1 与 DMA 的通道映射(如重映射到通道 4),需配置RCC_APB2ENR
的SYSCFG
位为 1(手册"5.3.8 RCC_APB2ENR"章节),后续通过SYSCFG_CFGR
寄存器修改映射关系。
第二步:配置 UART 基本参数(波特率、数据格式)
串口打印需先确定 UART 通信参数,确保与上位机(如电脑串口助手)匹配:
- 配置波特率 :
通过UART_BRR
(波特率寄存器)和UART_FRA
(分数波特率寄存器)设置波特率。例如,若 APB2 时钟为 48MHz,需配置 9600bps 波特率,可计算UART_BRR = 48000000 / (16 * 9600) = 312
(即 0x138),UART_FRA
配置为 0(手册"23.7.10 UART_BRR"章节)。 - 配置数据格式 :
通过UART_CCR
(通用控制寄存器)设置:数据位(默认 8 位)、停止位(默认 1 位)、校验位(无校验则配置UART_CCR.PCE = 0
)(手册"23.7.9 UART_CCR"章节)。 - 使能 UART 发送功能 :
配置UART_GCR
(全局控制寄存器)的TE
位为 1(使能发送),UE
位为 1(使能 UART 模块)(手册"23.7.8 UART_GCR"章节)。
第三步:配置 DMA 通道(以 DMA 通道 2 为例)
DMA 配置需明确"传输源地址、目标地址、传输数量、传输方向"等核心参数,对应手册"11.7 DMA 寄存器"章节:
- 配置 DMA 通道 2 基本参数 :
- 选择通道:确保 DMA 通道 2 映射到 UART1_TX(默认映射,无需修改
SYSCFG_CFGR
); - 配置
DMA_CCR2
(DMA 通道 2 配置寄存器):DIR = 1
:传输方向为"存储器到外设"(符合串口发送需求);MINC = 1
:存储器地址递增(发送缓冲区数据连续读取);PINC = 0
:外设地址固定(UART_TDR 地址不变);MSIZE = 00
:存储器数据宽度为 8 位(串口数据为字节格式);PSIZE = 00
:外设数据宽度为 8 位(UART_TDR 接收 8 位数据);TEIE = 0
、HTIE = 0
、TCIE = 1
:仅使能"传输完成中断"(可选,用于判断打印结束);EN = 0
:暂不使能通道,待参数配置完成后使能。
- 选择通道:确保 DMA 通道 2 映射到 UART1_TX(默认映射,无需修改
- 配置 DMA 传输地址与数量 :
DMA_CPAR2
(外设地址寄存器):写入 UART1_TDR 的地址(手册"23.7.2 UART_TDR"章节,地址为 0x40013800);DMA_CMAR2
(存储器地址寄存器):写入 RAM 中发送缓冲区的首地址(如uint8_t tx_buf[] = "Hello DMA!"
,则地址为(uint32_t)tx_buf
);DMA_CNDTR2
(传输数量寄存器):写入发送数据的长度(如字符串长度为 10,则配置为 10)。
第四步:使能 DMA 与 UART 的 DMA 发送功能
- 使能 UART 的 DMA 发送请求 :
配置UART_IER
(中断使能寄存器)的TX_DMA_EN
位为 1(手册"23.7.6 UART_IER"章节),允许 UART 向 DMA 发送"发送请求"。 - 使能 DMA 通道 2 :
配置DMA_CCR2.EN = 1
,DMA 开始工作------自动从tx_buf
读取数据,发送到 UART_TDR,直至DMA_CNDTR2
递减至 0(传输完成)。
第五步:(可选)处理 DMA 传输完成中断
若需在打印结束后执行后续操作(如发送下一段数据),可配置 DMA 传输完成中断:
- 使能 NVIC 中的 DMA 中断 :
在 NVIC 控制器中,使能 DMA 通道 2 的中断(中断号可参考手册"10.3.2 中断向量表"),设置中断优先级。 - 编写中断服务函数 :
当DMA_ISR.TCIF2 = 1
(通道 2 传输完成标志)时,清除标志(配置DMA_IFCR.CTCIF2 = 1
),并执行后续逻辑(如重新配置DMA_CNDTR2
发送新数据)(手册"11.7.1 DMA_ISR"章节)。
三、关键注意事项(避坑指南)
- 地址对齐要求 :
DMA 传输中,存储器地址和外设地址需与数据宽度对齐。例如,若数据宽度为 8 位(字节),地址无特殊要求;若为 16 位(半字),地址需为 2 的倍数(手册"11.6.4 可编程的数据传输宽度"章节)。串口打印为字节传输,无需额外处理对齐。 - DMA 通道映射唯一性 :
每个 DMA 通道同一时间只能对应一个外设请求。若 DMA 通道 2 已用于 UART1_TX,不可再同时映射到其他外设(如 SPI1_RX)(手册"11.5.1 DMA 请求映像"章节)。 - UART 发送缓冲区空判断 :
虽然 DMA 自动发送,但需确保 UART 发送缓冲区(UART_TDR)空闲时启动 DMA 传输。可通过读取UART_CSR.TXE
位(发送缓冲区空)为 1 时,再使能 DMA 通道(手册"23.7.4 UART_CSR"章节)。 - 中断标志清除 :
DMA 传输完成后,需通过DMA_IFCR
寄存器清除中断标志(而非直接写DMA_ISR
),否则中断会持续触发(手册"11.7.2 DMA_IFCR"章节)。
四、总结
MM32SPIN560C 串口打印用 DMA 的核心逻辑是"UART 触发 DMA 请求,DMA 自动完成数据搬运 ",配置时需遵循"时钟使能→UART 参数配置→DMA 通道配置→使能传输"的流程,且严格参考手册中寄存器的位定义(如 DMA_CCRx
的方向、地址递增配置,UART_GCR
的发送使能)。通过 DMA 传输,CPU 无需等待串口发送完成,可专注于其他任务,大幅提升系统效率。
电机场景串口波形中的应用:故障监测与状态分析
电机运行时,需通过串口波形监测 "电流波动、转速反馈、控制信号" 等关键参数,排查堵转、过载等故障。"UART+DMA" 的组合能确保波形数据无丢失、低延迟,具体应用如下: