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

 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转运。

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

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
DMA(Direct Memory Access,直接内存访问)是一种数据传输方式,它允许外设设备直接与内存进行数据的读写操作,减轻了CPU的负担。在DMA传输中,数据的地址模式可以选择固定(fix)、递增(increment)或递减(decrement)。 1. 固定地址模式(Fix Address Mode):在固定地址模式下,DMA传输期间使用固定的地址来进行数据读写。这意味着每次传输都使用相同的地址,适用于需要从固定地址读取或写入数据的情况。例如,当外设设备的数据缓冲区位于固定的内存地址时,可以选择固定地址模式。 2. 递增地址模式(Increment Address Mode):在递增地址模式下,DMA传输期间使用递增的地址来进行数据读写。这意味着每次传输都会自动增加地址,用于连续读取或写入连续的数据块。递增地址模式适用于需要按顺序访问内存中连续数据的情况,例如音频、视频流等。 3. 递减地址模式(Decrement Address Mode):在递减地址模式下,DMA传输期间使用递减的地址来进行数据读写。这意味着每次传输都会自动减少地址,适用于需要从后向前读取或写入数据的情况。递减地址模式在某些特定的应用中可能会有用,但相对较少使用。 选择何种地址模式取决于具体的应用需求和外设设备的工作方式。通常情况下,递增地址模式是最常用的,因为它适用于大多数连续数据传输的情况。但在某些特殊情况下,固定地址模式或递减地址模式可能更为合适。因此,在设计DMA传输时,需要根据具体情况选择适当的地址模式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值