新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STM32-DMA學習筆記

        STM32-DMA學習筆記

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


        關鍵詞: STM32DMA學習筆

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 鄢陵县| 顺平县| 密云县| 德安县| 金寨县| 磐石市| 中江县| 斗六市| 桦南县| 英德市| 武鸣县| 和平区| 循化| 万宁市| 彝良县| 贡嘎县| 麟游县| 江油市| 禹州市| 瓦房店市| 凉城县| 馆陶县| 平乐县| 舒城县| 同心县| 拉萨市| 铁力市| 临猗县| 福泉市| 阿尔山市| 古浪县| 海林市| 四会市| 榆社县| 临澧县| 临高县| 堆龙德庆县| 泰安市| 开阳县| 黔西县| 武宣县|