STM32F429在HAL庫上對DMA的研究及其測試


1DMA背景知識介紹

DMA全稱Direct Memory Access,即存儲器直接訪問,所謂直接訪問,即不需要經由CPU處理,直接在外設寄存器和存儲器之間開辟一條通道(或者存儲器和存儲器之間),用於傳遞數據。由於無需經過CPU處理,因此,當傳遞的數據量十分龐大時,可以大大提高系統的運行效率。STM32F429有兩個DMA控制器,DMA的工作原理如下圖:

 

 每個DMA有多達8個數據流,每個數據流又最多可以映射8種外設寄存器,但是每個數據流最多同時只能映射一個外設。他們的映射關系圖下圖:

 

2串口中斷DMA接收數據

具體原理就不介紹了,直接介紹使用步驟:

第一步:在CUBEMX上對其進行配置,並生成工程文件

 

 

 

 NVIC界面不需要配置,系統會強制你打開DMA中斷。

第二步:打開工程文件,找到stm32f4xx_it.c文件,找到DMA2_Stream5_IRQHandler函數

void DMA2_Stream5_IRQHandler(void)
{

    static int Height = 80;

    LCD_ShowString(0,Height,1280,24,24,(char*)USART1MESSAGE);Height+=30; //該函數用於將接收到的信息打印到顯示屏,功能類似於printf函數

    __HAL_DMA_CLEAR_FLAG(&hdma_usart1_rx, DMA_FLAG_TCIF1_5);

}

第三步:在mian中開啟中斷

    huart1.Instance->CR3 |= USART_CR3_DMAR;//開啟DMA接收,直接配置寄存器,因為沒找到API接口函數
    HAL_DMA_Start_IT(&hdma_usart1_rx, (u32)&huart1.Instance->DR, (u32)USART1MESSAGE, RX_Length);//開啟DMA中斷接收

運行一次上面兩行代碼(對,就是一次!),當接收到一共RX_Length個字節(博主設置為200)時,進入中斷函數DMA2_Stream5_IRQHandler。運行完后,當再次接收到RX_Length個字節,再次進入該函數,反復如此。

運行結果

 

 

 每隔5ms發送一次,瞬間填滿1280*800分辨率的屏幕

討論

有同學會問,如果想要接收不定長的數據,怎么辦,這個問題博主還沒解決,但是,在我看來,DMA既然設計的初衷就是幫助CPU減少負擔,那肯定是用於大量數據收發的時候,對於少量數據的傳輸,我認為大可不必采用DMA,普通的串口接收中斷完全可以搞定。順便附上我對串口接收中斷的理解:

https://www.cnblogs.com/showtime20190824/p/11407923.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM