DMA是一个数据转运小助手,协助CPU完成数据转运。
DMA(Direct Memory Access)直接存储器存取
DMA可以提供外设(外设数据寄存器)和存储器(运行内存存储器SRAM与程序存储器Flash,是存储变量数组和程序代码的地方)或者存储器和存储器之间的高速数据传输,无须CPU干预,节省了CPU的资源
12个独立可配置的通道: DMA1(7个通道), DMA2(5个通道) 每个通道都支持软件触发(软件触发:片内存储器只见的传输,把数据一股脑的传送过去)和特定的硬件触发 (外设与存储器之间的转运,不能一下子触发,比如转运ADC数据,需要每次转换成功后触发一次DMA转运一个。),从一个地方移动到另一个地方就需要占用一个通道,多个通道各自运行,互不干扰。
STM32F103C8T6 DMA资源:DMA1(7个通道)
类型 |
起始地址 |
存储器 |
用途 |
ROM |
0x0800 0000 |
程序存储器Flash |
存储C语言编译后的程序代码 |
0x1FFF F000 |
系统存储器 |
存储BootLoader,用于串口下载 |
|
0x1FFF F800 |
选项字节 |
存储一些独立于程序代码的配置参数(Flash的读保护写保护看门狗) |
|
RAM |
0x2000 0000 |
运行内存SRAM |
存储运行过程中的临时变量 |
0x4000 0000 |
外设寄存器 |
存储各个外设的配置参数 |
|
0xE000 0000 |
内核外设寄存器 |
存储内核各个外设(NVIC,SysTick)的配置参数 |
ROM:只读存储器,非易失性,掉电不丢失的存储器
RAM:随即存储器,掉电丢失
0地址的别名区:由BOOT的两个引脚决定映射到什么区域,映射到那里就从那里启动。
APB1与APB2连接的是各个外设,也是一种SRAM存储器,是一种特殊的存储器,CPU可以对寄存器进行读写,寄存器的背后都连接了一条导线,用于控制外设的状态,是软件与硬件的桥梁。
DMA的实质就是从某个地方取内容,放到另一个地方去。
总线矩阵的左端是主动单元,也就拥有了存储器的访问权,其中Decode是专门访问Flash的,系统是访问其他的,右边是被动单元,他们的存储器只能被左边的主动单元读写。
DMA中的哥哥通道可以设定他们的原地址以及目的地址,然后进行工作。
仲裁器:虽然很多通道,但是只有一条DMA总线,所以所有的通道只能分时复用一条DMA总线,发生冲突的时候就由仲裁器根据优先级决定谁先使用。在总线矩阵里面也有,当DMA与CPU都访问同一个目标时,DMA就会暂停CPU的访问,防止冲突,不过总线仲裁器仍会保持CPU仍然保留一半带宽,保证其正常工作。
AHB从设备:是DMA自身的寄存器,连接到AHB总线上,是主动单元又是被动单元。CPU通过系统,经过总线矩阵,再去到AHB从设备中就可以进行DMA的配置了。
DMA请求:连接各种外设,各种外设是DMA的硬件触发源。
由于Flash是只读的,所以不可以由SRAM到Flash,但是可以从SRAM到SRAM。
外设跟存储器两者都有三个参数,其实地址决定数据从哪里来到哪里去,数据宽度决定一次转运要按照多大的数据宽度来进行。可以选自字节8位,也就是一个uint8_t。半字是十六位,也就是uint16_t,比如ADC。字是32位,也就是uint32_t。地址是否自增,就是转运一次异动一个坑。如果要进行存储器之间的传送,就需把其中一个存储器的地址,放在外设的这个站点,也就值在外设地址写存储器的地址就行。虽然他叫外设存储器,但是他只不过是名字代号罢了。
传输计数器就是自减的一个作用,计算需要转运多少次的,每一次就减一,当减到0的时候,就重新回到起始地址,方便进行下一轮的转运。自动重装器使用之后,当达到0时,就重新回到计数器的初始值。M2M决定使用触发的方式,为1就软件触发,软件触发不是通过软件控制什么东西,而是一最快的速度之子那个完传输计数器的所有次数,不能以自动重装器一起用,不然就无休止了,适用于存储器到存储器只见装运。为0就是硬件触发,与外设有关,触发源一般都跟外设有关,比如ADC转换完成,串口收到数据,定时时间到达等等,当硬件达到时机的时候,就触发。开关控制制,DMA_Cmd函数控制,当DMA是能之后,DMA就准备就绪,可以开始转运,但是要达到一条件:1.DMA_Cmd必须使能。2.传输技术器必须大于0。3.触发源必须有触发信号。
每个外设不同,选择的通道不同。也就是每个软件都支持软件触发和特定的硬件触发。通道号越小,通道优先级越高。
当两者的宽度不一致的时候,遵循的逻辑。
注意两边要进行自增,如果两边有一方不自增,就会连连看......
在每个通道的每次ADC转换结束之后,传送到DMA之中,然后进行自增,等到下一个。
DMA外设地址写入ADC_DR,DMA存储器地址,可以在SRAM中定义一个数组,然后把这个数组的地址当做存储器的地址,之后数据宽度,因为ADV_DR跟SRAM地址都是16位数据,所以就选用半字长度,地址是否自增,外设地址不自增,存储器地址自增。传送次数七次,ADC如果是单此扫描就不需要自动重装,连续就需要自动重装。ADC要与DMA同步,当ADC启动下轮转换时,DMA也进行下一轮转换。所以选择ADC的硬件触发。每个通道转换完成的时候,不产生标志位或者中断,但是会产生DMA请求,触发DMA转运。