STM32使用DMA控制器試驗總結

2021-10-02 17:34:56 字數 1415 閱讀 5286

在使用串列埠dma試驗過程中,遇到了一些問題,通過試驗找到了問題所在,也對dma的應用有了新的認識,僅以此分享給大家,不足之處請多多指教。

dma初始化

// 串列埠對應的dma請求通道

#define usart_tx_dma_channel dma1_channel4

#define usart_tx_dma_irq dma1_channel4_irqn

#define usart_tx_dma_irqhandler dma1_channel4_irqhandler

// 外設暫存器位址

#define usart_dr_address (usart1_base+0x04)

// 一次傳送的資料量

#define sendbuff_size 250

/** * @brief usartx tx dma 配置,記憶體到外設(usart1->dr)

* @param 無

* @retval 無

*/void

usartx_dma_config

(void

)

在本次試驗中,主要遇到的問題是:dma模式配置為單次模式(dma_mode_normal),這樣在完成一次資料傳送後通道傳輸數量暫存器***tr數值為0,根據手冊介紹:當***tr為0 時,即使通道開啟,都不會發生任何資料傳輸。所以在下一次資料傳輸時,需要重新配置***tr暫存器。

我這裡是自己寫了乙個函式配置***tr暫存器。需要注意的是:***tr暫存器只有在通道不工作(dma_ccrx的en=0)時才可以寫入資料。

void

usart_dma_enable

(void

)

dma的迴圈模式

針對上面的問題,還可以使用dma的迴圈模式進行解決。

在dma迴圈模式下,***tr暫存器內容變為0時,將自動過載為之前配置的值。不需要手動過載。

當然這種模式下需要注意的是,當通道開啟時,會一直進行資料傳輸。所以需要在一次資料傳輸完成後,關閉dma通道。

我這裡是使用的dma中斷,在中斷中關閉dma通道。

void

usart_tx_dma_irqhandler

(void

)}

迴圈模式 下,傳送資料只要使能dma通道即可,不需要重新設定***tr暫存器

void

usart_dma_enable

(void

)

綜上所述,建議無論dma模式是單次還是迴圈,在dma初始化時先關閉dma通道,在需要資料傳輸時再開啟。

STM32之CAN控制器

1 can只具有can high和can low兩條訊號線,can是以差分訊號的形式進行通訊的 2 can通訊有兩種網路 一種是遵循iso11898標準的高速短距離閉環網路,它的匯流排最大長度為40m,通訊速度最高位1mbit s 另外一種是遵循iso11519 2標準的低速遠距離開環網路,最大傳輸...

STM32外設DMA使用總結

stm32外設dma使用總結 1 根據需要選擇dam模式 1 迴圈模式 dma mode dma mode circular 2 正常模式 dma mode dma mode normal 2 對於dma1的chanel3,對應外設為usart3的rx 試想 如果串列埠接收中斷和dam中斷同時開啟,...

STM32使用DMA方式Printf

使用庫函式除錯printf時需要占用系統資源所以採用dma方式來printf資料 兩種實現方式 pre 已經有dma傳送管理函式 include stdio.h include stdarg.h brief modbus傳送管理 void startmodbustranst uart handlet...