在使用串列埠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...