<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

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

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

          作者: 時間: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個通道,DMA2有5個通道(DMA2 僅存在大容量產(chǎn)品中)。DMA掛載的時鐘為AHB總線,其時鐘為72Mhz,所以可以實現(xiàn)高速數(shù)據(jù)搬運。
          STM32F103RBT6 只有1 個DMA控制器,DMA1 ,下面我們就針對DMA1 進行介紹。
          從外設(shè)(TIMx、ADC、SPIx 、I2Cx 和USARTx )產(chǎn)生的DMA請求,通過邏輯或輸入到DMA控制器,這就意味著同時只能有一個請求有效。外設(shè)的DMA請求,可以通過設(shè)置相應(yīng)的外設(shè)寄存器中的控制位,被獨立地開啟或關(guān)閉。
          DMA1各通道一覽:
          這里我們要使用的是串口 1 的 DMA 傳送,也就是要用到通道 4。
          DMA1通道4的配置方法如下:
          dma.c主要代碼:
          [cpp]view plaincopy
          1. u16DMA1_MEM_LEN;//保存DMA每次數(shù)據(jù)傳送的長度
          2. //DMA1的各通道配置
          3. //這里的傳輸形式是固定的,這點要根據(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時鐘
          12. delay_ms(1);//等待DMA時鐘穩(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ù)里主要有這幾個語句完成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)控傳送進度。
          pro=DMA1_Channel4->CNDTR;//得到當前還剩余多少個數(shù)據(jù)


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

          評論


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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();