串列埠資料使用DMA通道傳輸

2021-10-08 15:42:36 字數 1253 閱讀 5132

第一次寫 希望各位博友指正

本次為了減少cpu的占用,在配置串列埠的時候使用dma進行資料的收發。

不多說 直接上乾貨!!!

本次使用的dma1的通道4和通道5,圖中已標註。

乾貨**直接上:

unsigned char usart1_tx_buffer[usart_dma_buffer_size];

unsigned char usart1_rx_buffer[usart_dma_buffer_size];

unsigned char usart2_tx_buffer[usart_dma_buffer_size];

unsigned char usart2_rx_buffer[usart_dma_buffer_size];

#define usart1_tx_port gpioa

#define usart1_tx_pin gpio_pin_9

#define usart1_rx_port gpioa

#define usart1_rx_pin gpio_pin_10

//語音模組通訊通道

void usart1_init(u16 baud)

void usart1_dma_config(void)

## 中斷函式:

void usart1_irqhandler(void)//串列埠1的中斷服務函式

}void dma1_channel4_irqhandler(void)//dma通道4的中斷服務函式

}

特別強調:串列埠的空閒中斷idle清除中斷標誌位和平常的接收傳送中斷標誌位清除方法不一樣,如**上所寫,先讀取sr,再讀取dr才能清除空閒中斷標誌位,而平常的接收傳送中斷只需要讀取dr即可。

//usart1傳送函式

void usart1_send_char(u8 data)

}//usart1 dma傳送函式

void dma_usart1_send(int length)

配置完成了現在就可以使用dma_usart1_send()函式傳送所需要的的資料,如果接受資料使用的是dma1的通道5,可用中斷可不用

遇到問題可隨時交流,歡迎各位大佬指正,互相學習。

DMA資料傳輸

sd主控制器與系統儲存空間進行資料傳輸時使用sdma或adma2傳輸方式,需要配置的引數包括 一次傳輸的資料塊數 每塊資料大小 傳輸邊界 傳輸方向 傳輸資料首位址 dma傳輸模式等資訊 1 單dma傳輸 sdma 單dma傳輸的流程圖如下圖所示,在這種模式下,資料搬運通過sdma完成,無需處理器參與...

串列埠 DMA接受不定長資料

工作中經常會遇到串列埠通訊,並對互動的資料進行處理。經常用到的是通過不停的產生串列埠接收中斷,然後對資料做處理。這樣做的弊端就是,不停的會產生串列埠接受中斷。中斷請求不但使cpu停下來,而且要cpu執行中斷服務程式為中斷請求服務,這個請求包括了對斷點和現場的處理以及cpu與外設的傳送,所以cpu付出...

tcp檔案雙通道傳輸 命令通道和資料通道的關聯

開始的設計 1.開乙個固定的埠監聽,接收命令通道連線。2.開始傳輸資料的時候,為每個使用者臨時開乙個監聽埠,接收資料通道連線。這樣問題在於 資料通道的埠不能用固定的埠來傳輸資料,這樣如果有防火牆,就不知道應該給這個伺服器程式開那些埠,即使把這些資料通道的埠限制在一 定範圍內,實際上還是不好,開的埠過...