【无标题】

STM32 DMA搬运

本文内容在于细致介绍DMA搬运,可能会有不足之处尽情谅解
DMA可以提供外设和存储器或者存储器与存储器之间的高速数据传输,无需CPU的干预,节省了CPU的资源
下图为其 DMA转运示意图

外设指的是外设的数据寄存器DR(Data Register),比如ADC的数据寄存器、串口的数据寄存器等等
存储器指的是运行内存SRAM和程序存储器Flash,使我们存储变量和程序代码的地方
在这里插入图片描述
ROM只读存储器,是一种非易失性、掉电不丢失的存储器
RAM随机存储器,是一种易失性、掉电丢失的存储器
存储器到存储器的转运一般使用软件触发
外设到存储器的数据转运一般使用硬件触发(注意每个DMA通道它的硬件触发源是不一样的,使用某个外设的硬件触发源,就的使用它连接的那个通道,不能任意选择通道)
由于Flash是只读的所以DMA是不可以进行SRAM到Flash,或者Flash到Flash的转运操作,在程序中被const 修饰的变量只能读不能写,Flash里面的数据也是只能读不能写的,所以在stm32中被const定义的常量,是存储在Flash里面的。
数据宽度:
字节Byte:字节就是8位,一次转运一个uint8_t的数据
半字Halfword:半字是16位,一次性转运uint16_t的数据
字Word:字是32位,一次性转运uint32_t的数据
DMA转运有几个条件
1、 就是开关控制。DMA_Cmd必须使能
2、 传输计数器必须大于零
3、 触发源必须有触发信号,触发一次转运一次,传输计数器自减一次
4、 当传输计数器为零时,需要开关控制DMA_Cmd失能,给传输计数器输一个大于零的值,再开启DMA(传输计数器值为几DMA就搬运几次)
5、调运一下XXX_DMACmd,开启一下触发信号输出,M2M使能,对应软件触发,M2M失能对应硬件触发
补充:
1.地址一般都习惯用16进制表示,&号加变量,就表示这个变量取地址,32位系统的地址都是32位的,16进制长度为8的地址表示32位地址,注意指针跨级赋值的问题,需强制类型转换
2.可以根据存储器映像来查找相应的外设起始地址,首先在外设寄存器里查起始地址,再在外设的寄存器总表里查一下偏移,起始地址加偏移就是这个寄存器的实际地址,例如ADC1的外起始地址0x4001 2400,ADC1_CR存储器地址为0x4001 244C。
3.再来研究一下ADC1->DR,这个东西是如何知道ADC1_DR寄存器的地址的,结构体的方式是如何访问到寄存器呢?
基地址加偏移就是外设的实际地址,在这里ST公司使用了一个非常巧妙的方式,就是用结构体来实现,将结构体成员的顺序与寄存器里成员的顺序一一对应,定义一个结构体指针,并且指针的地址就是这个外设的起始地址,那这个结构体的每个成员,就会正好映射实际的每个寄存器,结构体的内存和外设寄存器的内存完美重合,访问结构体的某个成员,就相当于访问这个外设的某个寄存器了。(这就是STM32中使用结构体来访问寄存器的流程)
标志位是否需要手动清除需查看一下手册。
4.关于ADC触发DMA搬运:当ADC转换完成后,ADC的“转换完成”标志位(EOC)将触发DMA请求,DMA将自动将转换结果从ADC的数据寄存器搬运到指定的内存缓冲区。

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值