使用dma傳輸可以連續獲取或傳送一段資訊而不占用中斷或延時,在通訊頻繁或有大段資訊要傳輸時非常有用。
由上表可知,要使用usart1tx/rx我們選擇通道4和5
1、dma傳輸方式:
(1) dma_mode_normal,當通道配置為非迴圈模式時,傳輸結束後(即傳輸計數變為0)將不再產生dma操作。要開始新的dma傳輸,需要3個步驟:在關閉dma通道的情況下,在dma_***trx暫存器中重新寫入傳輸數目,然後重新開啟dma。
void dma1_channel5_irqhandler(void)
}
usart_dmacmd(usart1, usart_dmareq_tx, enable);
3、資料的傳送
使用非迴圈模式,跟上文的1.(1)中重新開啟dma的3個步驟一樣,將uart_tx_buff中的資料準備好,然後開啟dma,即可自動傳送uart_tx_buff中的資料,資料傳輸完成,進入中斷dma1_channel4_irqhandler
4、資料的接收
使用dma中斷來接收資料,只能接收固定幀長的資料,usart接收夠一定長度的資料,就會進入dma中斷。
若要接收可變長度的資料,方法有以下3種:
1.將rx腳與一路時鐘外部引腳相連,當串列埠一幀發完,即可利用此定時器產生超時中斷.這個實時性較高,可以做到1個位元組實時監測.
2.不改變硬體,開啟乙個定時器監控dma接收,如果超時則產生中斷.這個實時性不高,因為超時時間必須要大於需要接收幀的時間,精度不好控制.
3.stm32微控制器有的串列埠可以監測匯流排是否處於空閒,如果空閒則產生中斷.可以用它來監測dma接收是否完畢.這種方式實時性很高。當usart在停止位後的乙個byte的時間內,匯流排是空閒的,就置位匯流排空閒標誌,這時我們認為一幀的資料傳輸完成,就會進入usart中斷處理。
但這裡需要注意乙個問題就是,如果兩幀的資料緊挨著一起被接收,那麼這種情況應該使用dma中斷。因為使用usart空閒中斷的話,要兩幀全部發完才能進入中斷,這樣只能處理一幀的資料;使用dma中斷的話,在第一幀結束就可以進入中斷,即使第二幀緊跟著後面。
**中是採用第三種方法。
【reference】
STM32的SPI查詢方式傳輸測試
stm32的spi查詢方式傳輸測試 環境 主機 win7 開發環境 mdk4.23 mcu stm32f103cbt6 說明 軟體設定nss腳,利用查詢方式傳輸 源 初始化 關閉spi spi cmd spi1,disable 初始化spi介面的ssn腳以及ntrx的rst腳 ntrxctrlini...
STM32硬體IIC之DMA傳輸資料
這裡給出乙個實現用dma傳輸iic資料的實現過程這裡咱們說3個點 1.檢查iic匯流排上是否有指定位址的器件 2.iic讀取資料 3.iic寫資料 下面來乙個乙個詳細說明 1.檢查iic匯流排上是否有指定位址的器件 1.判斷是否匯流排忙,如果忙則等待 2.產生起始位 3.等待起始位產生完成 4.傳送...
stm32的DMA傳輸一半中斷
這裡本想做乙個錄音程式 硬體很簡單 mic 麥克風 放大濾波電路 stm32的adc dma通道 乙個陣列快取 通過fatfs的 f write 存入到tf卡 之後就是程式思路 adc採集的電壓資料,dma設定成迴圈採集模式,這樣實時的採集電壓了漏不掉聲音資料,如果設定為一次傳輸,那麼在再次開啟前,...