[靈動微電子 MM32BIN560CN MM32SPIN0280]讀懂電機MCU之串口DMA

在 MM32SPIN560C 微控制器中,串口(UART)的 DMA 傳輸可大幅減輕 CPU 負擔,實現數據的“自動收發”。結合《MM32SPIN560C 用戶手冊(中文版)》中 UART 和 DMA 相關章節,以下從“原理匹配”“配置步驟”“關鍵注意事項”三方面,詳解串口打印(UART 發送)如何使用 DMA。

一、先明確:UART 與 DMA 的硬件關聯

根據手冊內容,UART 模塊支持通過 DMA 實現數據發送(TX)和接收(RX),核心關聯規則如下:

  1. 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 請求映像”章節)。
  2. DMA 傳輸方向
    串口打印為“存儲器到外設”方向——DMA 從指定的 RAM 緩沖區中讀取數據,自動發送到 UART 的發送數據寄存器(UART_TDR),無需 CPU 逐字節寫入。

二、串口打印(UART_TX)用 DMA 的詳細配置步驟

以“UART1 結合 DMA 通道 2 實現串口打印”為例,結合手冊寄存器配置邏輯,步驟如下:

第一步:使能核心外設時鐘

需先為 UART、DMA、SYSCFG(用于 DMA 通道重映射,可選)使能時鐘,確保模塊正常工作:

  1. 使能 UART1 時鐘
    配置 RCC_APB2ENR(APB2 外設時鐘使能寄存器)的 UART1 位為 1(手冊“5.3.8 RCC_APB2ENR”章節),UART1 掛載于 APB2 總線,時鐘頻率最高支持 96MHz。
  2. 使能 DMA 時鐘
    配置 RCC_AHBENR(AHB 外設時鐘使能寄存器)的 DMA 位為 1(手冊“5.3.7 RCC_AHBENR”章節),DMA 掛載于 AHB 總線,需確保 AHB 時鐘正常。
  3. (可選)使能 SYSCFG 時鐘
    若需調整 UART1 與 DMA 的通道映射(如重映射到通道 4),需配置 RCC_APB2ENRSYSCFG 位為 1(手冊“5.3.8 RCC_APB2ENR”章節),后續通過 SYSCFG_CFGR 寄存器修改映射關系。

第二步:配置 UART 基本參數(波特率、數據格式)

串口打印需先確定 UART 通信參數,確保與上位機(如電腦串口助手)匹配:

  1. 配置波特率
    通過 UART_BRR(波特率寄存器)和 UART_FRA(分數波特率寄存器)設置波特率。例如,若 APB2 時鐘為 48MHz,需配置 9600bps 波特率,可計算 UART_BRR = 48000000 / (16 * 9600) = 312(即 0x138),UART_FRA 配置為 0(手冊“23.7.10 UART_BRR”章節)。
  2. 配置數據格式
    通過 UART_CCR(通用控制寄存器)設置:數據位(默認 8 位)、停止位(默認 1 位)、校驗位(無校驗則配置 UART_CCR.PCE = 0)(手冊“23.7.9 UART_CCR”章節)。
  3. 使能 UART 發送功能
    配置 UART_GCR(全局控制寄存器)的 TE 位為 1(使能發送),UE 位為 1(使能 UART 模塊)(手冊“23.7.8 UART_GCR”章節)。

第三步:配置 DMA 通道(以 DMA 通道 2 為例)

DMA 配置需明確“傳輸源地址、目標地址、傳輸數量、傳輸方向”等核心參數,對應手冊“11.7 DMA 寄存器”章節:

  1. 配置 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 = 0HTIE = 0TCIE = 1:僅使能“傳輸完成中斷”(可選,用于判斷打印結束);
      • EN = 0:暫不使能通道,待參數配置完成后使能。
  2. 配置 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 發送功能

  1. 使能 UART 的 DMA 發送請求
    配置 UART_IER(中斷使能寄存器)的 TX_DMA_EN 位為 1(手冊“23.7.6 UART_IER”章節),允許 UART 向 DMA 發送“發送請求”。
  2. 使能 DMA 通道 2
    配置 DMA_CCR2.EN = 1,DMA 開始工作——自動從 tx_buf 讀取數據,發送到 UART_TDR,直至 DMA_CNDTR2 遞減至 0(傳輸完成)。

第五步:(可選)處理 DMA 傳輸完成中斷

若需在打印結束后執行后續操作(如發送下一段數據),可配置 DMA 傳輸完成中斷:

  1. 使能 NVIC 中的 DMA 中斷
    在 NVIC 控制器中,使能 DMA 通道 2 的中斷(中斷號可參考手冊“10.3.2 中斷向量表”),設置中斷優先級。
  2. 編寫中斷服務函數
    DMA_ISR.TCIF2 = 1(通道 2 傳輸完成標志)時,清除標志(配置 DMA_IFCR.CTCIF2 = 1),并執行后續邏輯(如重新配置 DMA_CNDTR2 發送新數據)(手冊“11.7.1 DMA_ISR”章節)。

三、關鍵注意事項(避坑指南)

  1. 地址對齊要求
    DMA 傳輸中,存儲器地址和外設地址需與數據寬度對齊。例如,若數據寬度為 8 位(字節),地址無特殊要求;若為 16 位(半字),地址需為 2 的倍數(手冊“11.6.4 可編程的數據傳輸寬度”章節)。串口打印為字節傳輸,無需額外處理對齊。
  2. DMA 通道映射唯一性
    每個 DMA 通道同一時間只能對應一個外設請求。若 DMA 通道 2 已用于 UART1_TX,不可再同時映射到其他外設(如 SPI1_RX)(手冊“11.5.1 DMA 請求映像”章節)。
  3. UART 發送緩沖區空判斷
    雖然 DMA 自動發送,但需確保 UART 發送緩沖區(UART_TDR)空閑時啟動 DMA 傳輸。可通過讀取 UART_CSR.TXE 位(發送緩沖區空)為 1 時,再使能 DMA 通道(手冊“23.7.4 UART_CSR”章節)。
  4. 中斷標志清除
    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” 的組合能確保波形數據無丟失、低延遲,具體應用如下:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/920808.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/920808.shtml
英文地址,請注明出處:http://en.pswp.cn/news/920808.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【機器學習】-torch相關知識01

學習代碼時遇到的問題,GPT給的答案,如有錯誤請指出。 問題1 torch.empty nn.init.xavier 問題2 nn.Parameter 是什么? 問題3 self.add_module 問題4 torch.matmul torch.mm 文章目錄問題1 torch.empty nn.init.xavier問題2 nn.Parameter 是什…

Hutool DsFactory多數據源切換

一、簡單上手&#xff1a;從配置到使用全流程 DsFactory 的核心優勢是零侵入配置&#xff0c;支持多種配置方式&#xff0c;不管是 properties 文件還是代碼里直接定義&#xff0c;都能快速初始化數據源。先引依賴&#xff08;Maven&#xff09;&#xff1a; <dependency>…

Mysql中事務隔離級別有哪些?

Mysql中事務隔離級別有哪些&#xff1f; 讀未提交&#xff1a; 一個事務可以看到另一個事務尚未提交的數據。可能導致臟讀。 讀已提交&#xff1a; 一個事務只能看到其他事務提交后的數據。避免了臟讀&#xff0c;仍可能引發不可重復讀。 可重復讀&#xff1a; 可以確保一個事務…

el-carousel在新增或者刪除el-carousel-item時默認跳到第一頁的原因和解決

現象 使用走馬燈效果時 當el-carousel-item增加或者減少時&#xff0c;頁會跳到第一頁 體驗很不友好。 原因 當新增或這刪除el-carousel-item時&#xff0c;會觸發setActiveIndex&#xff08;props.initialindex&#xff09;, setActiveIndex的行為是小于0或者大于最大頁會有一…

人工智能學習:機器學習相關面試題(二)

7、有監督學習和無監督學習的區別 有監督學習&#xff1a; 對具有概念標記&#xff08;分類&#xff09;的訓練樣本進行 學習&#xff0c;以盡可能對訓練樣本集外的數據進行 標記&#xff08;分類&#xff09;預測。 這里 &#xff0c;所有的標記&#xff08;分類&#xff09…

python如何下載svg圖片

# 生成博客文章框架代碼 import datetimeblog_content f"""# Python如何下載SVG圖片## 引言 SVG&#xff08;可縮放矢量圖形&#xff09;作為一種基于XML的矢量圖形格式&#xff0c;在Web開發中廣泛應用。本文將介紹如何使用Python從網絡下載SVG圖片&#xff0…

Linux(一) | 初識Linux與目錄管理基礎命令掌握

個人主頁-愛因斯晨 文章專欄-Linux 最近學習人工智能時遇到一個好用的網站分享給大家&#xff1a; 人工智能學習 文章目錄個人主頁-愛因斯晨文章專欄-Linux一、前言1.為什么學習Linux2.操作系統概述&#xff1a;3.常見的操作系統&#xff1a;二、初識Linux1.誕生2.什么是Linux…

android-studio 安裝

下載地址 國內&#xff1a;https://developer.android.google.cn/studio?hlzh-cn 全國&#xff1a;https://developer.android.com/studio 1.設置 ANDROID_HOME 環境變量 ANDROID_HOME D:\zhy\android-studio\sdk 2. 更新 PATH 環境變量 %ANDROID_HOME%\platform-tools %AN…

【重學MySQL】九十三、MySQL字符集與比較規則完全解析

【重學MySQL】九十三、MySQL字符集與比較規則完全解析一、字符集概述1.1 支持的字符集1.2 UTF8與UTF8MB4的區別二、比較規則&#xff08;Collation&#xff09;2.1 比較規則分類2.2 常見比較規則差異三、配置層級與繼承關系3.1 配置層級3.2 繼承關系四、最佳實踐與問題解決4.1 …

基于Kafka的延遲隊列

實現原理 通過topic區分不同的延遲時長&#xff0c;每個topic對于一個延遲&#xff0c;比如 topic100 僅存儲延遲 100ms 的消息&#xff0c;topic1000 僅存儲延遲 1s 的消息&#xff0c;依次類推。生產消息時&#xff0c;消息需按延遲時長投遞到對應的topic。消費消息時&#x…

LabVIEW轉速儀校準系統

LabVIEW 與機器視覺的智能校準系統以工控機為核心&#xff0c;整合標準源、智能相機等硬件&#xff0c;通過軟件實現校準流程自動化&#xff0c;支持 500-6000r/min 轉速范圍校準&#xff0c;覆蓋 5 類轉速測量儀&#xff0c;校準時間縮短約 70%&#xff0c;滿足計量院高效、精…

Synchronized 概述

1. 初識 synchronized 是 Java 中的關鍵字&#xff0c;是一種 同步鎖 &#xff0c;可重入鎖&#xff0c;悲觀鎖。它修飾的對象有以下幾種&#xff1a; 具體表現為以下3種形式。 對于普通同步方法&#xff0c;鎖是當前實例對象。 對于靜態同步方法&#xff0c;鎖是當前類的 Clas…

通過Auth.log來查看VPS服務器是否被掃描和暴力破解及解決辦法

說明&#xff1a;很多人vps可能出現過被掃的情況&#xff0c;有的還被爆破了&#xff0c;這里提供下查看方法 查看用密碼登陸成功的IP地址及次數grep "Accepted password for root" /var/log/auth.log | awk {print $11} | sort | uniq -c | sort -nr | more查看用密…

碰一碰發視頻手機版源碼開發:支持OEM

**從事開發 20 年&#xff0c;見過不少技術風口起起落落&#xff0c;最近 “碰一碰發視頻” 又成了熱門話題。不少同行或剛入行的年輕人來問我&#xff0c;手機版源碼開發該從哪下手&#xff0c;怕踩坑、怕走彎路。今天就以一個老程序員的視角&#xff0c;把碰一碰發視頻手機版…

只出現一次的數字(總結)

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄前言一、給定一個整數數組nums&#xff0c;除了某個元素只出現一次以外&#xff0c;其余元素均出現兩次。找出那個只出現一次的元素二、給你一個整數數組nums&#x…

Cesium 入門教程(十一):Camera相機功能展示

文章目錄一&#xff0c;Cesium 實際示例&#xff08;含源代碼&#xff09;1&#xff0c;vuecesium&#xff1a; 圍繞一個固定點自動左右旋轉2&#xff0c;vuecesium&#xff1a; flyto一個具體的實體位置3&#xff0c;vuecesium&#xff1a; flyto一個具體的點位置4&#xff0c…

go語言基本排序算法

package mainimport "fmt"func main() {BubbleSort()SelectSort()InsertSort()MergeSort()QuickSort()HeapSort()ShellSort() }//冒泡排序 func BubbleSort() {str : []int{9, 1, 5, 8, 3, 7, 4, 6, 2}for i : 0; i < len(str)-1; i {flag : falsefor j : len(str…

一步完成CalDAV賬戶同步,日歷服務助力釘釘日歷日程集中管理

在信息爆炸節奏飛快的今天&#xff0c;高效的管理時間已經成為我們工作和生活中的核心競爭力&#xff0c;復雜紛繁的日程安排&#xff0c;無處不在的提醒需求以及跨設備同步的困擾&#xff0c;這些問題仿佛都在呼喚著一個更智能、更便捷、更可靠的解決方案。 而華為日歷App&am…

企業內部機密視頻安全保護|如何防止企業內部機密視頻泄露?

在企業數字化進程飛速發展的今天&#xff0c;視頻內容已成為承載企業內部培訓、戰略會議、產品機密和核心技術的關鍵載體。一次意外的泄露&#xff0c;不僅可能導致知識產權流失&#xff0c;更會讓企業聲譽和市場競爭力遭受重創。面對無孔不入的安全威脅&#xff0c;企業該如何…

C# Deconstruct | 簡化元組與對象的數據提取

官方文檔&#xff1a;析構元組和其他類型 - C# | Microsoft Learn 標簽&#xff1a;Deconstruct、Tuple、record、模式匹配 PS&#xff1a;record相關內容后續還會繼續更新&#x1f504; 模式匹配可以查看我的另一篇&#x1f449;模式匹配 目錄1. 概述2. 基本用法2.1 元組解…