新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > STM32-DMA學(xué)習(xí)筆記

STM32-DMA學(xué)習(xí)筆記

作者: 時(shí)間:2016-11-23 來源:網(wǎng)絡(luò) 收藏
DMA,全稱為:Direct Memory Access,即直接存儲器訪問。DMA傳輸方式無需CPU 直接控制傳輸,也沒有中斷處理方式那樣保留現(xiàn)場和恢復(fù)現(xiàn)場的過程,通過硬件為RAM 與I/O設(shè)備開辟一條直接傳送數(shù)據(jù)的通路,能使CPU 的效率大為提高。
STM32中 DMA1有7個(gè)通道,DMA2有5個(gè)通道(DMA2 僅存在大容量產(chǎn)品中)。DMA掛載的時(shí)鐘為AHB總線,其時(shí)鐘為72Mhz,所以可以實(shí)現(xiàn)高速數(shù)據(jù)搬運(yùn)。
STM32F103RBT6 只有1 個(gè)DMA控制器,DMA1 ,下面我們就針對DMA1 進(jìn)行介紹。
從外設(shè)(TIMx、ADC、SPIx 、I2Cx 和USARTx )產(chǎn)生的DMA請求,通過邏輯或輸入到DMA控制器,這就意味著同時(shí)只能有一個(gè)請求有效。外設(shè)的DMA請求,可以通過設(shè)置相應(yīng)的外設(shè)寄存器中的控制位,被獨(dú)立地開啟或關(guān)閉。
DMA1各通道一覽:
這里我們要使用的是串口 1 的 DMA 傳送,也就是要用到通道 4。
DMA1通道4的配置方法如下:
dma.c主要代碼:
[cpp]view plaincopy
  1. u16DMA1_MEM_LEN;//保存DMA每次數(shù)據(jù)傳送的長度
  2. //DMA1的各通道配置
  3. //這里的傳輸形式是固定的,這點(diǎn)要根據(jù)不同的情況來修改
  4. //從存儲器->外設(shè)模式/8位數(shù)據(jù)寬度/存儲器增量模式
  5. //DMA_CHx:DMA通道CHx
  6. //cpar:外設(shè)地址
  7. //cmar:存儲器地址
  8. //cndtr:數(shù)據(jù)傳輸量
  9. voidMYDMA_Config(DMA_Channel_TypeDef*DMA_CHx,u32cpar,u32cmar,u16cndtr)
  10. {
  11. RCC->AHBENR|=1<<0;//開啟DMA1時(shí)鐘
  12. delay_ms(1);//等待DMA時(shí)鐘穩(wěn)定
  13. DMA_CHx->CPAR=cpar;//DMA1外設(shè)地址
  14. DMA_CHx->CMAR=(u32)cmar;//DMA1,存儲器地址
  15. DMA1_MEM_LEN=cndtr;//保存DMA傳輸數(shù)據(jù)量
  16. DMA_CHx->CNDTR=cndtr;//DMA1,傳輸數(shù)據(jù)量
  17. DMA_CHx->CCR=0X00000000;//復(fù)位
  18. DMA_CHx->CCR|=1<<4;//從存儲器讀
  19. DMA_CHx->CCR|=0<<5;//普通模式
  20. DMA_CHx->CCR|=0<<6;//外設(shè)地址非增量模式
  21. DMA_CHx->CCR|=1<<7;//存儲器增量模式
  22. DMA_CHx->CCR|=0<<8;//外設(shè)數(shù)據(jù)寬度為8位
  23. DMA_CHx->CCR|=0<<10;//存儲器數(shù)據(jù)寬度8位
  24. DMA_CHx->CCR|=1<<12;//中等優(yōu)先級
  25. DMA_CHx->CCR|=0<<14;//非存儲器到存儲器模式
  26. }
  27. //開啟一次DMA傳輸
  28. voidMYDMA_Enable(DMA_Channel_TypeDef*DMA_CHx)
  29. {
  30. DMA_CHx->CCR&=~(1<<0);//關(guān)閉DMA傳輸
  31. DMA_CHx->CNDTR=DMA1_MEM_LEN;//DMA1,傳輸數(shù)據(jù)量
  32. DMA_CHx->CCR|=1<<0;//開啟DMA傳輸
  33. }
}
在主函數(shù)里主要有這幾個(gè)語句完成DMA傳輸:
1.首先配置DMA1通道4相關(guān)參數(shù)
MYDMA_Config(DMA1_Channel4,(u32)&USART1->DR,(u32)SendBuff,5200);//DMA1通道4,外設(shè)為串口1,存儲器為SendBuff,長度5200.
2.然后將待發(fā)送內(nèi)容裝入存儲器
SendBuff[i]=TEXT_TO_SEND[t];
3.然后開啟一次DMA傳輸
MYDMA_Enable(DMA1_Channel4);//開始一次DMA傳輸!
4.監(jiān)控傳送進(jìn)度。
pro=DMA1_Channel4->CNDTR;//得到當(dāng)前還剩余多少個(gè)數(shù)據(jù)


關(guān)鍵詞: STM32DMA學(xué)習(xí)筆

評論


技術(shù)專區(qū)

關(guān)閉