STM32 DMA直接存储器存取

简介

DMA(Direct Memory Access)直接存储器存取【DMA有权限访问单片机内部存储器包括运行内存SRAM、程序存储器Flash和寄存器等等】

DMA可以提供外设和存储器或者存储器和存储器之间的高速数据传输,无须CPU干预,节省了CPU资源。

12个对可配置的通道:DMA1(7个通道),DMA2(5个通道)每个通道都支持软件触发特定的硬件触发(每个DMA通道,其硬件触发源是不一样的)

STM32F103C8T6的DMA资源:DMA1(7个通道)

存储器映像

DMA浅析

DMA框图

总线矩阵左端是主动单元,可以对其右端的存储器进行读写;总线矩阵右端是被动单元,其存储器只能被左端的主动单元读写。

DMA1 有7个通道,DMA2 有5个通道。各个通道可以设置其转运数据的源地址和目的地址。

DMA框图内有仲裁器(调度AMA通道),来设置DMA通道的优先级,虽然DMA的各个通道可以独立工作,但最后到达总线矩阵只有一条线。

DMA框图中有AHB从设备(配置DMA参数),其连接到总线矩阵的右端。说明CPU可以此线路来配置DMA。

DMA请求,硬件触发DMA转运。

DMA基本结构图

外设下的数据宽度:指定一次转运要按多大的数据宽度来进行。分为字节Byte(8位)、半字Half Word(16位)、字Word(32位)

传输计数器:指定总共需要转运几次。

自动重装器:若使用,则传输计数器自减到0后继续回到自动重装器的值,再继续自减转运。若不使用,则自减到0后,转运停止。

M2M:置1时软件触发,置0时硬件触发。

           软件触发:以最快的速度连续不断地触发DMA,尽快把传输计数器清零(连续触发)软件               触发不能和自动重装器同时使用。软件触发一般用于数据从存储器到存储器的转运。

           硬件触发:一般是与外设有关的触发,触发需要一定的时机。

DMA开启的条件:1.DMA必须使能  2.传输计数器必须大于0  3.必须有触发源

#当传输计数器的值为0时,DMA停止工作,此时一定要关闭DMA,然后再写传输计数器,不能在DMA开启时写传输计数器。

细节问题

触发源部分细节框图

#如果要选择ADC1来触发的话,则必须选择通道1;如果要选择TIM2_UP(定时器2的更新事件)来触发的话必须选择通道2,后面同理。

优先级:默认优先级是通道号越小优先级越高。

数据宽度与对齐

当源端宽度等于目标宽度时,数据传输过程不变化;

当源端宽度大于目标宽度时,数据高位会被舍弃;

当源端宽度小于目标宽度时,数据高位会补0。

实例

1.起始地址:外设地址是数组DataA[7]的首地址,存储器地址是DataB[7]的首地址

2.数据宽度:都按照uint8_t传输

3.地址是否自增:因为想要数组A的第一位传到数组B的第一位,数组A的第二位传到数组B的第二位,以此类推。所以外设地址和存储器地址都要自增,

4.方向:外设寄存器传到存储器

5.传输计数器和自动重装器:传输计数器给7,自动重装器为0(此处为数组值的对应位置传递,不需要重复传递)

6.选择软件触发

7.开关控制:调用DMA_Cmd()给开关使能

#是一种复制转运,转运完成后DataA的数据不会消失

在每个单独的通道将数据传输到ADC_DR寄存器中后,进行一次DMA数据转运到存储器中。

1.起始地址:外设地址是ADC_DR寄存器的地址,存储器地址是在SRAM中定义的数组ADValue

2.数据宽度:都按照uint16_t传输(半字传输)

3.地址是否自增:外设地址不自增,存储器地址自增,

4.方向:ADC_DR外设寄存器传到存储器

5.传输计数器和自动重装器:传输计数器给7,自动重装器取决于ADC的扫描模式,若为单次扫描,则可以不自动重装;若为连续扫描,则自动重装。

6.触发方式:硬件触发(DMA转运需要和ADC单个通道转换完成同步)

7.开关控制:调用DMA_Cmd()给开关使能

#是一种复制转运,转运完成后DataA的数据不会消失

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值