在USART文章中講解了串口的輪詢和中斷模式,本文介紹一下通過DMA模式控制串口傳輸。
直接存儲器訪問 (DMA) 用于在外設與存儲器之間以及存儲器與存儲器之間提供高速數據傳輸。可以在無需任何 CPU 操作的情況下通過 DMA 快速移動數據。這樣節省的 CPU 資源可供其它操作使用。說白了DMA就是一個搬運工,將數據從一個地方搬到另一個地方而不需要CPU處理。作為一個搬運工,要他正常工作必須要確定幾個重要的參數:
傳輸模式:數據從哪里搬到哪里。三種可能的傳輸方向:存儲器到外設、外設到存儲器或存儲器到存儲器
通道選擇:就是數據傳輸的是走那條道路
仲裁器:多個DMA傳輸是優先級高的優先傳輸
數據長度:每次傳輸的數據長度,可以一個字節,兩個字節(半字),四個字節(字)
指針遞增:如果使能了遞增模式,則下一次傳輸的地址將是前一次傳輸的地址遞增 1(對于字節)、2(對于半字)或4(對于字)
打開STM32CubeMX重新建工程,配置和上一章配置一樣。只是這個工程中,在DMA設置欄添加UASART發送TX和接收RX的DMA。發送選擇 DMA1 Channel 4通道,方向從存儲器到外設。優先級為低。接收選擇DMA1 Channel 5通道,方向外設到存儲器,優先級為低。Mode為Normal,Data Width選擇Byte。
其中mode設置可以選擇Normal表單次傳輸,傳輸一次后終止傳輸,Circular表示循環傳輸,傳輸完成后又重新開始繼續傳輸,不斷循環永不停止。此處選擇單次傳輸。
Increment Address表示地址指針遞增。串口發送數據是將數據不斷存進串口的發送數據寄存器(USARTx_TDR)。所以外接的地址是不遞增。而內存儲器存儲的是要發送的數據,所以地址指針要遞增才能將所以的數據發送出去。
串口數據發送寄存器只能存儲8bit,每次發送一個字節,所以數據長度選擇Byte。另外要注意的一點,必須要開啟串口中斷。DMA1中斷已默認開啟。生成報告以及代碼,編譯程序。在usart.c文件中,可以找到剛才的DMA設置。
在main函數前面添加發送的數據。
在main()函數的while(1)循環中添加應用程序,通過DMA將數據發送出去。這是只測試發送,至于接收可以看USART文內容。
編譯程序并下載到開發板。用USB線連接開發板到電腦,在電腦上打開串口調試助手。選擇對應的串口號,設置波特率為115200,接收到如圖信息。需要注意的是,如果不開啟串口中斷,則程序只能發送一次數據,程序不能判斷DMA傳輸是否完成,USART一直處于busy狀態。
-
dma
+關注
關注
3文章
566瀏覽量
100957 -
串口傳輸
+關注
關注
0文章
33瀏覽量
1846
原文標題:STM32CubeMX-直接存儲器訪問(DMA)
文章出處:【微信號:c-stm32,微信公眾號:STM32嵌入式開發】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
DMA 串口傳輸原理解析
![<b class='flag-5'>DMA</b> <b class='flag-5'>串口傳輸</b>原理解析](https://file1.elecfans.com/web2/M00/A3/72/wKgZomUFDdOADkVQAAA1q6zDUSg608.png)
5416與主機通信設想通過DMA的PINGPONG模式,通過USB口傳回主機可行嗎?
串口傳輸文件及漢字疊加顯示的方法
如何通過串口傳輸數據
如何用串口傳輸float類型數據
STM32 LoRa無線數傳模塊 PC通過串口傳輸數據到單片機
![STM32 LoRa無線數傳模塊 PC<b class='flag-5'>通過</b><b class='flag-5'>串口傳輸</b>數據到單片機](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
串口傳輸(51單片機版)
![<b class='flag-5'>串口傳輸</b>(51單片機版)](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論