stm32之串列埠DMA傳送與接收

2021-10-05 15:17:04 字數 2282 閱讀 2867

硬體環境:stm32f103zet6戰艦開發板

軟體環境:mdk5、串列埠除錯助手

概念解析:dma--direct memory access--直接儲存器訪問

dma作用:用來傳輸資料的,在**傳輸呢,可以在外設和儲存器之間,也可以在儲存器和儲存器之間。dma傳輸方式無需cpu直接控制傳輸,能使cpu的效率大為提高。

本博文簡單實現功能

1、通過dma傳輸方式,從儲存器把資料搬到串列埠1的資料暫存器即(usart1->dr),借助串列埠除錯助手檢視資料傳輸的正確性

2、通過dma傳輸方式,加上串列埠idle中斷的配合,把串列埠助手發到串列埠1(usart1->dr) 的資料搬到儲存器中,再列印出來,檢視資料傳輸的正確性

1、儲存器到外設的實現步驟

如圖所示,要實現儲存器到串列埠1的傳輸,則要選擇dma1通道4。

這個實驗用到串列埠1,dma1,因此需要初始化它們。   

串列埠1初始化,注意這裡沒有涉及到接收,因此把專案工程的接收中斷注釋了。

void uart_init(u32 bound)

dma1通道4初始化

void dma_init(dma_channel_typedef*dma_chx, u32 paddr, u32 maddr, u16 len)

簡單的主函式框架,只是簡單傳送一次。

int main(void)

;    

nvic_prioritygroupconfig(nvic_prioritygroup_2);

uart_init(115200);

dma_init(dma1_channel4, (u32)&usart1->dr, (u32)&send_buf, sizeof(send_buf));

while(1);

}實驗效果圖

到此,通過dma方式從儲存器(用陣列表示)搬到外設(傳送資料)就完成了。

2、dma+idle中斷接收外設的資料實現步驟

通樣用到串列埠1,dma1,需初始化它們,這裡串列埠接收的時候不需要起用平常使用的接收中斷,直接是開啟idle中斷,這裡對idle中斷做下說明,複製手冊內容,

idle:監測到匯流排空閒 (idle line detected),當檢測到匯流排空閒時,該位被硬體置位。如果usart_cr1中的idleie為』1』,則產生中斷。由軟體序列清除該位(先讀usart_sr,然後讀usart_dr)。

平常的rxne中斷標誌位是接收一位元組就中斷一次,idle中斷基本就是接收完一位元組,隔了一段時間沒有資料過來,匯流排空閒,就會傳送中斷,可以理解為接收所有資料了(個人理解,不對的地方還望各位大佬指出,一起交流)。

串列埠1初始化

void uart1_init(u32 bound)

檢視上面dma1通道圖,usart1_rx是在通道5上,初始化如下

void dma_init(dma_channel_typedef* dma_chx, u32 paddr, u32 maddr, u16 len)

idle中斷服務函式

void usart1_irqhandler(void)

printf("\n");

usart_clearitpendingbit(usart1, usart_it_idle);              //清除中斷標誌位

dma_setcurrdatacounter(dma1_channel5, rec_buf_size);  //需要重新配置dma1通道5快取資料大小

dma_cmd(dma1_channel5, enable);                                        //資料處理完了,開啟dma1,等待下一幀資料過來

}主函式簡單框架

int main(void)

實驗效果圖

這裡用串列埠助手往微控制器串列埠1傳送6位元組的666666,通過dma+idle方式把串列埠1的資料搬到儲存器(陣列),再把儲存器的值列印出來,如圖接收正常。

總結利用dma方式簡單實現資料的傳輸(傳送與接收),在實際專案工程中,資料會更多,此時處理資料方式就比較重要了,相關博文很多,就不提了。純屬記錄,博文有錯的地方還請各位大佬指出,我一定及時修改。本博文示例**實測還行。

好了,到此本篇博文就結束了。

STM32Cube IDE配置串列埠傳送與接收

串列埠與中斷配置如下 在生成的main函式中,新增開啟串列埠接收中斷 hal init user code begin init user code end init configure the system clock systemclock config user code begin sysi...

Python串列埠資料打包傳送STM32接收資料解析

嘗試使用python中的struct.pack函式打包資料通過串列埠傳送,由stm32接收解析。1 struct.pack struct.pack用於將python的值根據格式符,轉換為字串 因為python中沒有位元組 byte 型別,可以把這裡的字串理解為位元組流,或位元組陣列 其函式原型為 s...

STM32 串列埠DMA(一)

今天調usart,資料在晶元內部用dma傳到串列埠快取,發現dma真的很好,很快,而且不消耗系統資源。只是在傳輸完的時候中斷的標誌置位。下面解釋一下程式。void dma configuration void 再弄幾個重要的語句。這裡是開始dma傳輸前的一些準備工作,將usart1模組設定成dma方...