# STM32 DMA ###### tags: `STM32` * 本篇只解說原理,不解說DMA程式上使用方式 * DMA就是不佔用CPU執行序,將執行放到SRAM上。 * 本篇解說STM32L0 and STM32L4方塊圖,STM32F系列也可以參考如下方塊圖 * 本篇解說STM32G4系列就沒有分 DMA1 和 DMA2,G4是規劃一個DMA區域讓User自行分配 ## DMA 原理 * Cortex-M 內核和 DMA1 控制器都與其他 MCU 周邊設備交互通過一系列Bus。如果仍然不清楚,重要的是要注意flash和SRAM暫儲器是 MCU 內核之外的元件,因此它們需要相互交互其他通過總線互連。 * Cortex-M 內核和 DMA1 控制器都是主機。這意味著他們是唯一的可以在總線上啟動事務的單元。但是,必須規範對總線的訪問這樣他們就不能同時訪問同一個從外圍設備。 * BusMatrix 管理 Cortex-M 內核與 DMA1 之間的訪問仲裁控制器。仲裁使用循環算法來控制對總線的訪問。這BusMatrix 由兩個主機(CPU、DMA)和四個從機(flash、SRAM、AHB1 帶有 AHB 到高級外部總線 (APB) 橋接器和 AHB2)。 BusMatrix 也允許在它們之間自動互連多個外部設備。 * 系統總線將 Cortex-M 內核連接到 BusMatrix。 * DMA 總線將 DMA 的高級高性能總線 (AHB) 主接口連接到 BusMatrix。 * AHB 到 APB 橋接器提供了 AHB 和 APB 總線之間的完全同步連接,其中連接了大多數周邊設備 ### ARM and RISC-V DMA差異 * 雖然周邊設備本身是獨立的,但它們如何與核心和記憶體互動,這才是 ARM 與 RISC-V 兩種架構在 系統層面 設計上的真正區別點。這主要體現在 DMA (直接記憶體存取) 和 系統匯流排 (Bus) 的設計上。 * DMA 的複雜度和匯流排標準: ARM 的 DMA 運行在標準化的 AMBA 匯流排體系上;RISC-V 的 DMA 更加靈活和多樣化。 * 標準化程度: ARM 在中斷 (NVIC) 和系統級互連上提供了高度標準化的參考,使得軟體開發和移植相對容易。RISC-V 則給予了晶片設計者在這些方面更大的自由度去優化和客製化。 ## DMA使用情境 * 做CMD傳輸如:UART、I2C、SPI、CAN就非常適合使用DMA * ADC傳輸, (1) 如果在系統上ADC多達6~12組或以上,使用DMA就非常有感 (2) 如果是消費型電子只有兩個ADC BUS用起來不會很有感 ## STM32 L0 and STM32 L4 ### M0 ![](https://i.imgur.com/IHLALn7.png) ### M4 ![](https://i.imgur.com/qMtkyvu.png) * I-bus * 該bus將 Cortex®-M4 內核的指令總線連接到 BusMatrix。 * I-bus使用該總線來獲取指令。 * 該總線的目標是包含代碼的存儲器(Flash memory、內部 SRAM 或通過 FMC 或 OCTOSPI 的外部存儲器)。 * D-bus * 該bus將 Cortex®-M4 內核的數據總線連接到 BusMatrix。 * 這D-bus由內核用於文字加載和調試訪問。 * 該總線的目標是包含代碼的存儲器(Flash memory、內部 SRAM 或通過 FMC 或 OCTOSPI 的外部存儲器)。 * S-bus * 該bus將 Cortex®-M4 內核的系統總線連接到 BusMatrix。 * 這s-bus是內核用於訪問位於外部設備或 SRAM 區域中的數據。 * 本次的目標總線是內部 SRAM,AHB1 外設包括 APB1 和 APB2外設、AHB2 外設和外部存儲器通過 OCTOSPI 或 FMC。 * SRAM2 也可通過該總線訪問以允許與 SRAM1 和 SRAM3 的連續映射。 * DMA總線 * 該總線將 DMA 的 AHB 主接口連接到 BusMatrix。 * 總線是 SRAM1、SRAM2 和 SRAM3,AHB1 外設包括 APB1 和APB2 外設、AHB2 外設和通過 OCTOSPI 的外部存儲器或FMC。 * DMA2D-bus 總線 * 該總線將 DMA2D 的 AHB 主接口連接到 BusMatrix。 * 的目標該總線是通過 OCTOSPI 的 SRAM1、SRAM2 和 SRAM3 以及外部存儲器或FMC。 * DMA搭配方式 ```= void Init_DMA1_CH1(void) { // ADC12 -> DMA1_CH1 _DMA1_CCR1.bit.DIR = 0; // Read data from peripheral _DMA1_CCR1.bit.CIRC = 1; // circular mode enabled _DMA1_CCR1.bit.MINC = 1; // memory increment mode enabled _DMA1_CCR1.bit.PINC = 0; // peripheral increment mode disabled _DMA1_CCR1.bit.PSIZE = 2; // Set peripheral size to 32-bits _DMA1_CCR1.bit.MSIZE = 2; // Set memory size to 32-bits _DMA1_CCR1.bit.PL = 3; //priority = very high _DMA1_CCR1.bit.TCIE = 1; // Enable DMA TC ISR _DMA1_CNDTR1.bit.NDT = 7; // Number of data need to be transfer _DMA1_CPAR1.bit.PA = (unsigned long)&_ADC12_CDR.all; // address of _ADC12_CDR.all or (0x5000030C) _DMA1_CMAR1.bit.MA = (unsigned long)&adc12RawData; _DMAMUX1_C0CR.bit.DMAREQ_ID = 5; // Set ADC12 as the DMA request source _DMA1_CCR1.bit.EN = 1; } ``` ```= void Init_DMA1_CH2(void) { // ADC345 -> DMA1_CH2 _DMA1_CCR2.bit.DIR = 0; // Read data from peripheral _DMA1_CCR2.bit.CIRC = 1; // circular mode enabled _DMA1_CCR2.bit.MINC = 1; // memory increment mode enabled _DMA1_CCR2.bit.PINC = 0; // peripheral increment mode disabled _DMA1_CCR2.bit.PSIZE = 2; // Set peripheral size to 32-bits _DMA1_CCR2.bit.MSIZE = 2; // Set memory size to 32-bits _DMA1_CCR2.bit.PL = 1; // priority = Med _DMA1_CCR2.bit.TCIE = 0; // Disable DMA TC ISR _DMA1_CNDTR2.bit.NDT = 8; // Number of data need to be transfer _DMA1_CPAR2.bit.PA = (unsigned long)&_ADC345_CDR.all; // address of _ADC345_CDR.all or (0x5000070C) _DMA1_CMAR2.bit.MA = (unsigned long)&adc345RawData; _DMAMUX1_C1CR.bit.DMAREQ_ID = 37; // Set ADC345 as the DMA request source _DMA1_CCR2.bit.EN = 1; } ``` * M4 ![](https://i.imgur.com/89WVnyO.png) ## STM32 DMA Datasheet ### STM32 L0 DMA * [Using the STM32F0/F1/F3/Gx/Lx Series DMA controller](https://www.st.com/resource/en/application_note/cd00160362-using-the-stm32f0f1f3gxlx-series-dma-controller-stmicroelectronics.pdf) ### STM32 F2 F4 F7 DMA * [Using the STM32F2, STM32F4 and STM32F7 Series DMA controller](https://www.st.com/resource/en/application_note/dm00046011-using-the-stm32f2-stm32f4-and-stm32f7-series-dma-controller-stmicroelectronics.pdf) ## Reference * [ARM的BUS Matrix的作用](https://blog.csdn.net/m0_49540263/article/details/111675882) * [CortexM3与CortexM0的bus matrix](https://blog.csdn.net/qq_34686440/article/details/116561517?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163600662716780264061646%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=163600662716780264061646&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-1-116561517.first_rank_v2_pc_rank_v29&utm_term=BUS+Matrix+M0) * [【STM32】 DMA原理,步骤超细详解,一文看懂DMA](https://blog.csdn.net/as480133937/article/details/104927922)