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