13. DMA

1. DMA简介

直接存储器存取(Dma)是为了提供高速数据传输外围设备和内存以及内存到内存。数据可以通过dma快速移动。没有任何CPU操作。这使得CPU资源可以用于其他操作。

这两个DMA控制器总共有12个通道(DMA 1的7个通道和DMA 2的5个通道),每个通道都有。专用于管理来自一个或多个外围设备的内存访问请求。它有一个用于处理DMA请求之间优先级的仲裁器。

2. DMA 主要特点

  • 12个可独立配置的通道(请求):7个用于DMA 1,5个用于DMA 2
  • 12个通道中的每个通道都连接到专用硬件DMA请求和软件每个通道也支持触发器。此配置由软件完成。
  • 来自一个DMA通道的请求之间的优先级是软件可编程的(包括非常高、高、中、低的4个级别)或在平等情况下的硬件。(请求1优先于请求2等)
  • 独立的源和目标传输大小(字节,半字,字),模拟包装和拆包。源/目标地址必须根据数据大小对齐。
  • 支持循环缓冲区管理
  • 3个事件标志(DMA半传输、DMA传输完成和DMA传输错误)逻辑连接在单个中断请求中的每个通道
  • 内存到内存传输
  • 外设对内存和内存到外围,以及外围到外围的传输
  • 可访问作为源和目的地的Flash、SRAM、APB1、APB2和AHB外围设备
  • 要传输的可编程数据数:最多可达65536

3. DMA 功能描述

 DMA控制器通过与Cortex®-M3核心共享系统总线来执行直接内存传输。

当cpu和dma针对同一个目标(内存或(外围),dma请求可能会在某些总线时间内停止cpu对系统总线的访问。

总线矩阵实现循环调度,从而保证CPU可用至少一半的系统总线带宽(包括内存和外设)。

3.1 DMA事务

事件发生后,外设向DMA控制器发送请求信号。DMA控制器根据信道优先级为请求提供服务。DMA控制器一访问外围设备,DMA控制器就会向外设发送确认信息。外设一旦从DMA控制器获得确认信息,就会释放其请求。一旦请求被外围设备取消,DMA控制器就会释放确认。如果有更多的请求,外围设备可以启动下一个事务。

总之,每个DMA传输包括三个操作:

  1. 从外围数据寄存器或通过内部当前外围/存储器地址寄存器寻址的存储器中的位置加载数据。用于第一次传输的起始地址是在DMA_CPARx或DMA_CMARx寄存器中编程的基本外围/内存地址。
  2. 存储加载到外围数据寄存器或通过内部当前外设/存储器地址寄存器寻址的存储器中的数据。用于第一次传输的起始地址是在DMA_CPARx或DMA_CMARx寄存器中编程的基本外围/内存地址。
  3. DMA_CNDTRx寄存器的后递减,其中包含仍需执行的事务数。

3.3 DMA信道

每个信道可以处理位于固定地址和存储器地址的外围寄存器之间的DMA传输。要传输的数据量(高达65535)是可编程的。包含要传输的数据项数量的寄存器在每个事务之后减少。

可编程数据大小  

外设和存储器的传输数据大小通过DMA_CCRx寄存器中的PSIZE和MSIZE位完全可编程。

指针增量 

外设和内存指针可以根据DMA_CCRx寄存器中的PINC和MINC位在每个事务后自动递增。如果启用了增量模式,则下一次传输的地址将是上一次传输的地址,根据所选数据大小而递增1、2或4。第一个传输地址是在DMA_CPARx/DMA_CMARx寄存器中编程的地址。在传输操作期间,这些寄存器保留最初编程的值。软件无法访问当前传输地址(在当前内部外围/内存地址寄存器中)。

如果信道配置为非循环模式,则在最后一次传输之后(即一旦要传输的数据项数达到零时)不提供DMA请求。为了重新加载要传输到DMA_CNDTRx寄存器中的新数据项,必须禁用DMA通道。

说明: 

如果DMA通道被禁用,DMA寄存器不会被重置。DMA通道寄存器(DMA_CCRx、DMA_CPARX和DMA_CMARx)保留在通道配置阶段编程的初始值。

在循环模式中,在上次传输之后,DMA_CNDTRX寄存器会自动重新加载初始编程值。当前内部地址寄存器从DMA_CPARX/DMA_CMARx寄存器中重新加载基址值。

信道配置过程

应该按照以下顺序配置DMA通道(其中x是信道号)。

  1. 在 DMA_CPARx 寄存器中设置外设寄存器地址。
  2. 在 DMA_CMARx 寄存器中设置内存地址。数据将在外围事件之后写入或从该存储器中读取。
  3. 配置要在DMA_CNDTRX寄存器中传输的数据总数。在每个外围事件之后,该值将递减。
  4. 使用DMA_CCRx寄存器中的 PL[1:0] 位配置通道优先级
  5.  配置数据传送方向、循环模式、外围设备和内存增加模式、外设和内存数据大小,以及在半传输或者满传输后中断DMA_CCRX寄存器
  6. 通过在DMA_CCRx寄存器中设置启用位来激活通道。

一旦通道被启用,它就可以从连接在通道上的外围设备中处理任何DMA请求。一旦传输了一半的字节,就会设置半传输标志(HTIF),如果设置了半传输中断启用位(HTIE),则会产生中断。在传输结束时,设置传输完全标志(TCIF),如果设置了传输完全中断启用位(TCIE),则产生中断。

循环模式

循环模式可用于处理循环缓冲器和连续数据流(例如adc扫描模式)。可以使用DMA_CCRx寄存器中的CIRC位启用此特性。当循环模式被激活时,要传输的数据的数量会用在信道配置阶段编程的初始值自动重新加载,并且DMA请求继续被处理。

内存到内存模式

DMA通道也可以工作,而不被来自外围设备的请求触发。这种模式称为内存到内存模式。如果在DMA_CCRx寄存器中设置了MEM2MEM位,则该信道通过在DMA_CCRx寄存器中设置使能位(En),在软件启用后立即启动传输。当DMA_CNDTRx寄存器达到零时,传输停止。内存到内存模式不能与循环模式同时使用。

3.4 可编程数据宽度、数据对齐

当PSIZE和MSIZE不相等时,DMA执行一些数据对齐,如表76所述。

寻址不支持字节或半字写入的AHB外围设备操作:

当DMA启动AHB字节或半字写入操作时,数据将复制到没使用的HWDATA[31:0]总线。

因此,当使用的AHB从外围设备不支持字节或半字写入操作(当外设不使用HSIZE时)并且不生成任何错误时,DMA写入32 HWDATA位,如下所示:

  • 为了编写半字“0xABCD”,DMA使用HSIZE=HalfWord将HWDATA总线设置为“0xABCDABCD”。
  • 为了编写字节“0xAB”,DMA使用HSIZE=Byte将HWDATA总线设置为“0xABABABAB”

假设AHB/APB桥是不考虑HSIZE数据的AHB 32位从外围设备,它将以下列方式将任何AHB字节或半字操作转换为32位APB操作:

  • 将数据“0xB0”写入0x0(或0x1、0x2或0x3)的AHB字节写入操作将转换为数据“0xb0b0b0b0”到0x0的APB字写操作
  • 数据“0xb1b0”到0x0(或0x2)的AHB半字写操作将转换为数据“0xB1B0B1B0”到0x0的APB字写操作

例如,如果要编写apb备份寄存器(与32位地址边界对齐的16位寄存器),则必须将内存源大小(MSIZE)配置为“16位”,将外围目标大小(PSIZE)配置为“32位”。

 3.5 错误管理

DMA传输错误可以通过从保留地址空间读取或写入而产生。当DMA读或写访问期间发生DMA传输错误时,故障信道通过相应信道配置寄存器(DMA_CCRx)中的en位的硬件自动禁用。在DMA_IFR寄存器中设置信道的传输错误中断标志(TEIF),如果在DMA_CCRx寄存器中设置传输错误中断启用位(TEIE),则产生中断。

3.7 DMA request mapping

 4 DMA registers

4.1 DMA interrupt status register (DMA_ISR)

TEIFx: Channel x transfer error flag (x = 1 ..7) This bit is set by hardware. It is cleared by software writing 1 to the corresponding bit in the DMA_IFCR register.
0: No transfer error (TE) on channel x
1: A transfer error (TE) occurred on channel x

HTIFx: Channel x half transfer flag (x = 1 ..7) This bit is set by hardware. It is cleared by software writing 1 to the corresponding bit in the DMA_IFCR register.
0: No half transfer (HT) event on channel x
1: A half transfer (HT) event occurred on channel x

TCIFx: Channel x transfer complete flag (x = 1 ..7) This bit is set by hardware. It is cleared by software writing 1 to the corresponding bit in the DMA_IFCR register.
0: No transfer complete (TC) event on channel x
1: A transfer complete (TC) event occurred on channel x

GIFx: Channel x global interrupt flag (x = 1 ..7) This bit is set by hardware. It is cleared by software writing 1 to the corresponding bit in the DMA_IFCR register.
0: No TE, HT or TC event on channel x
1: A TE, HT or TC event occurred on channel x

 4.2 DMA interrupt flag clear register (DMA_IFCR)

4.3 DMA channel x configuration register (DMA_CCRx) (x = 1..7, where x = channel number)

Bit 14 MEM2MEM: Memory to memory mode This bit is set and cleared by software.

0: Memory to memory mode disabled
1: Memory to memory mode enabled

Bits 13:12 PL[1:0]: Channel priority level These bits are set and cleared by software.
00: Low
01: Medium
10: High
11: Very high

Bits 11:10 MSIZE[1:0]: Memory size These bits are set and cleared by software.
00: 8-bits
01: 16-bits
10: 32-bits
11: Reserved

Bits 9:8 PSIZE[1:0]: Peripheral size These bits are set and cleared by software.
00: 8-bits
01: 16-bits
10: 32-bits
11: Reserved

Bit 7 MINC: Memory increment mode This bit is set and cleared by software.
0: Memory increment mode disabled
1: Memory increment mode enabled

Bit 6 PINC: Peripheral increment mode This bit is set and cleared by software.
0: Peripheral increment mode disabled
1: Peripheral increment mode enabled

Bit 5 CIRC: Circular mode This bit is set and cleared by software.
0: Circular mode disabled
1: Circular mode enabled

Bit 4 DIR: Data transfer direction This bit is set and cleared by software.

0: Read from peripheral
1: Read from memory

Bit 3 TEIE: Transfer error interrupt enable
This bit is set and cleared by software.
0: TE interrupt disabled
1: TE interrupt enabled

Bit 2 HTIE: Half transfer interrupt enable
This bit is set and cleared by software.
0: HT interrupt disabled
1: HT interrupt enabled

Bit 1 TCIE: Transfer complete interrupt enable
This bit is set and cleared by software.
0: TC interrupt disabled
1: TC interrupt enabled

Bit 0 EN: Channel enable
This bit is set and cleared by software.
0: Channel disabled
1: Channel enabled

4.4 DMA channel x number of data register (DMA_CNDTRx) (x = 1..7), where x = channel number)

要传输的数据数量(0到65535)。只有当通道被禁用时,才能写入此寄存器。一旦通道被启用,这个寄存器就是只读的,指示要传输的剩余字节.此寄存器在每次DMA传输后都会减少。一旦传输完成,此寄存器可以保持在零或重新加载。如果通道配置为自动重新加载模式,则由先前编程的值自动设置。

如果此寄存器为零,则无论是否启用通道,都无法处理任何事务。

4.5 DMA channel x peripheral address register (DMA_CPARx) (x = 1..7), where x = channel number)

Bits 31:0 PA[31:0]: Peripheral address
Base address of the peripheral data register from/to which the data will be read/written.
When PSIZE is 01 (16-bit), the PA[0] bit is ignored. Access is automatically aligned to a halfword address.
When PSIZE is 10 (32-bit), PA[1:0] are ignored. Access is automatically aligned to a word address.

4.6 DMA channel x memory address register (DMA_CMARx) (x = 1..7), where x = channel number)

Bits 31:0 MA[31:0]: Memory address

数据将被读写到的内存区域的基本地址。

当MSIZE为01(16位)时,MA[0]位被忽略.Access自动对齐到半字地址。

当MSIZE为10(32位)时,MA[1:0]被忽略.Access将自动对齐到一个单词地址。

 

转载于:https://www.cnblogs.com/qiyuexin/p/9003092.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值