在 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” 的組合能確保波形數據無丟失、低延遲,具體應用如下: