关于32的DMA
根据本人的一些理解,对于DMA在这里进行一些解释:
DMA(Direct Memory Access,直接内存存取) 是所有现代电脑的重要特色,它允许不同速度的硬件装置来沟通,而不需要依赖于 CPU 的大量中断负载。否则,CPU 需要从来源把每一片段的资料复制到暂存器,然后把它们再次写回到新的地方。在这个时间中,CPU 对于其他的工作来说就无法使用。(选自360百科)
我们进行如下的一个比较通俗的理解,在32中也有DMA,存放于内核,最常用的功能就是搬运数据,我们都知道,单片机执行程序是依次执行的,但是如果有了DMA,我们的单片机可以同时执行两件事情,这样就可以节省大量的CUP资源,在执行DMA数据传输的时候,还可以进行其他工作。
最简单的例子就是,我们在用DMA进行串口传输数据的时候,还可以让单片机去执行流水灯等。
DMA可以搬运数据可以从外设到存储器(ADC采样数据给程序里的一个变量),也可以从存储器到外设(FLASH到SRAM),也可以从存储器到存储器三种。存储器到存储器最直观的就是从FLASH到SRAM。
这里也同时讲一下FLASH跟SRAM(静态随机存取存储器)的区别,FLASH(存储器又成为闪存)是存放代码的,SRAM是存放程序运行的中间变量的,FLASH具有掉电不丢失。
首先我们要知道大容量的1系列的32有两个DMA,分为DMA1,DMA2
我们可以从图上看到,DMA1有七个通道,DMA2有两个通道,那么怎么理解通道呢,实际上就好比就好比搬运数据的路线一样,我们知道STM32有许许多多的外设,那么每个通道对应着不同的外设。
我们可以看到,这上面每一个通道,对应着许多的外设,例如通道1对应着ADC1,TIM2_CH3等,当我们需要搬运数据给这些外设或者内核里的外设的时候,还不想占用CPU,我们就可以启用DMA。
但是首先我们要发送DMA请求,就是某个外设去告诉DMA,我想让你给我搬运数据了。
同时我们在图上看到,有优先级,这个优先级就是如果多个外设同时向让DMA给他搬运数据,那要先搬运谁的呢,其实MDA会有一个仲裁器,就跟裁判一样,他来决定谁的优先级高,在DMA_CRRx寄存器这里有配置,如果我们在配置PL的时候配置的优先级一样高,那么他会取决于硬件编号,硬件分辨优先级是这样的,DMA1的优先级高于DMA2,然后通道1的优先级高于通道2(通道越小优先级越高)。如果我们想给内核的外设搬运数据,例如从FLASH搬运到SRAM,这两个都是内核的外设,这里我们有一个寄存器
对于固件库就是配置初始化结构体里面的M2M,寄存器的话配置为1就可以完成
关于怎么配置DMA我们下期见。
————————————————