【STM32】标准库 菜鸟入门教程之DMA

DMA直接存储器存取

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的两个引脚决定映射到什么区域,映射到那里就从那里启动。

【STM32】标准库 菜鸟入门教程之DMA_第1张图片

 APB1与APB2连接的是各个外设,也是一种SRAM存储器,是一种特殊的存储器,CPU可以对寄存器进行读写,寄存器的背后都连接了一条导线,用于控制外设的状态,是软件与硬件的桥梁。

DMA的实质就是从某个地方取内容,放到另一个地方去。

总线矩阵的左端是主动单元,也就拥有了存储器的访问权,其中Decode是专门访问Flash的,系统是访问其他的,右边是被动单元,他们的存储器只能被左边的主动单元读写。

DMA中的哥哥通道可以设定他们的原地址以及目的地址,然后进行工作。

仲裁器:虽然很多通道,但是只有一条DMA总线,所以所有的通道只能分时复用一条DMA总线,发生冲突的时候就由仲裁器根据优先级决定谁先使用。在总线矩阵里面也有,当DMA与CPU都访问同一个目标时,DMA就会暂停CPU的访问,防止冲突,不过总线仲裁器仍会保持CPU仍然保留一半带宽,保证其正常工作。

AHB从设备:是DMA自身的寄存器,连接到AHB总线上,是主动单元又是被动单元。CPU通过系统,经过总线矩阵,再去到AHB从设备中就可以进行DMA的配置了。

DMA请求:连接各种外设,各种外设是DMA的硬件触发源。

【STM32】标准库 菜鸟入门教程之DMA_第2张图片

 由于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.触发源必须有触发信号。

【STM32】标准库 菜鸟入门教程之DMA_第3张图片

 每个外设不同,选择的通道不同。也就是每个软件都支持软件触发和特定的硬件触发。通道号越小,通道优先级越高。

 【STM32】标准库 菜鸟入门教程之DMA_第4张图片

当两者的宽度不一致的时候,遵循的逻辑。

【STM32】标准库 菜鸟入门教程之DMA_第5张图片 注意两边要进行自增,如果两边有一方不自增,就会连连看......

【STM32】标准库 菜鸟入门教程之DMA_第6张图片

 在每个通道的每次ADC转换结束之后,传送到DMA之中,然后进行自增,等到下一个。

DMA外设地址写入ADC_DR,DMA存储器地址,可以在SRAM中定义一个数组,然后把这个数组的地址当做存储器的地址,之后数据宽度,因为ADV_DR跟SRAM地址都是16位数据,所以就选用半字长度,地址是否自增,外设地址不自增,存储器地址自增。传送次数七次,ADC如果是单此扫描就不需要自动重装,连续就需要自动重装。ADC要与DMA同步,当ADC启动下轮转换时,DMA也进行下一轮转换。所以选择ADC的硬件触发。每个通道转换完成的时候,不产生标志位或者中断,但是会产生DMA请求,触发DMA转运。

DMA数据转运&DMA+AD多通道

你可能感兴趣的:(单片机,stm32,嵌入式硬件)