DMA
控制器允许
Blackfin
或者外设指定数据传送操作,然后返回正常操作中。
DMA
控制器传送数据的过程独立于处理器的活动
。
DMA
控制器传送数据的方式有下面几种:
<!-- [if !supportLists]-->l
<!-- [endif]-->存储器
<->
存储器
(
MemDMA
);
<!-- [if !supportLists]-->l
<!-- [endif]-->存储器
<->
串行外设接口;
<!-- [if !supportLists]-->l
<!-- [endif]-->存储器
<->
串行接口;
<!-- [if !supportLists]-->l
<!-- [endif]-->存储器
<-> UART
口;
<!-- [if !supportLists]-->l
<!-- [endif]-->存储器
<-> USB
口;
DMA
系统有包括
DMA
控制器(
MemDMA
)在内的
8
个
DMA
兼容外设,图
5.1
是
12
个通道和总线控制器,其中
DMA
传送可以使基于描述符
的,也可以是基于自动缓冲
的。
DAB,
DCB, DEB Master
|
默认仲裁优先级
|
PPI
|
0-highest
|
SPORT0
RCV DMA Controller
|
1
|
SPORT1
RCV DMA Controller
|
3
|
SPORT0
XMT DMA Controller
|
2
|
SPORT1
XMT DMA Controller
|
4
|
SPI
DMA Controller
|
5
|
UART
RCV Controller
|
6
|
UART
XMT Controller
|
7
|
Memory
DMA0(dest) Controller
|
8
|
Memory
DMA0(source) Controller
|
9
|
Memory
DMA1(dest) Controller
|
10
|
Memory
DMA1(source) Controller
|
11-lowest
|
图
5.1 12
个通道和总线控制器
1
基于描述符的
DMA
传送
基于描述符的
DMA
传送是
Blackfin
控制
DMA
最普通的方法。使用该方法时,
DMA
通道需要一组称为
DMA
描述符的参数,该参数存储在存储器中。每个描述符包含特定
DMA
传送序列所需要的所有信息,其组成结构如下:
<!-- [if !supportLists]-->(1)
<!-- [endif]-->要传送数据块的
32
位起始地址;
<!-- [if !supportLists]-->(2)
<!-- [endif]-->要传送的数据量
<!-- [if !supportLists]-->(3)
<!-- [endif]-->其他各种控制信息——如该
DMA
做什么,传送何时完成等配置信息;
<!-- [if !supportLists]-->(4)
<!-- [endif]-->指向下一个描述符的指针。
下面步骤是设置基于描述符的
DMA
的典型时序。在进行这些步骤之前,必须将描述符基地址(
BASE+0
)的高
16
位设置到
DMA
描述符的基址指针寄存器(
DMADBP
)中。
<!-- [if !supportLists]-->(1)
<!-- [endif]-->将
DMA
配置字(其
15
位置为
1
),
DMA
传送计数,
DMA
起始地址(
15:0
),
DMA
起始地址(
31:16
)以及下一个描述符指针(
15:0
),写入描述符存储器地址
BASE+0~BASE+8
中。如果描述符是链表中的最后一个元素,或者是链表中的唯一元素,那么该描述符中的下一个描述符指针应该指向下一个存储单元,该存储单元的
15
位必全为零。基于上述要求,下一个描述符指针可以指向当前描述符的基地址
BASE+0
。在
DMA
传送序列完成之后,
DMA
配置字的位
15
被清零。控制器返回给处理器。
<!-- [if !supportLists]-->(2)
<!-- [endif]-->将描述符基地址(
BASE+0
)的低
16
位写到相应外设的下一个描述符寄存器中。
<!-- [if !supportLists]-->(3)
<!-- [endif]-->设置相应外设的
DMA
配置寄存器中
DMA
使能位。
<!-- [if !supportLists]-->(4)
<!-- [endif]-->仅在单个
DMA
传送序列或链表中的第一个
DMA
传送序列需要进行写操作。
<!-- [if mso & !supportInlineShapes & supportFields]><span
lang=EN-US><span style="mso-element:field-begin;mso-field-lock:yes" mce_style="mso-element:field-begin;mso-field-lock:yes"></span><span
style='mso-spacerun:yes'> </span>SHAPE<span style="mso-spacerun:yes" mce_style="mso-spacerun:yes">
</span>/* MERGEFORMAT <span style="mso-element:field-separator" mce_style="mso-element:field-separator"></span></span><![endif]--><!-- [if gte vml 1]><v:group id="_x0000_s1026" editas="canvas"
style='width:414pt;height:202.8pt;mso-position-horizontal-relative:char;
mso-position-vertical-relative:line' coordorigin="2362,1000" coordsize="7200,3533">
<o:lock v:ext="edit" aspectratio="t"/>
<v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75"
o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f">
<v:stroke joinstyle="miter"/>
<v:formulas>
<v:f eqn="if lineDrawn pixelLineWidth 0"/>
<v:f eqn="sum @0 1 0"/>
<v:f eqn="sum 0 0 @1"/>
<v:f eqn="prod @2 1 2"/>
<v:f eqn="prod @3 21600 pixelWidth"/>
<v:f eqn="prod @3 21600 pixelHeight"/>
<v:f eqn="sum @0 0 1"/>
<v:f eqn="prod @6 1 2"/>
<v:f eqn="prod @7 21600 pixelWidth"/>
<v:f eqn="sum @8 21600 0"/>
<v:f eqn="prod @7 21600 pixelHeight"/>
<v:f eqn="sum @10 21600 0"/>
</v:formulas>
<v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/>
<o:lock v:ext="edit" aspectratio="t"/>
</v:shapetype><v:shape id="_x0000_s1027" type="#_x0000_t75" style='position:absolute;
left:2362;top:1000;width:7200;height:3533' o:preferrelative="f">
<v:fill o:detectmouseclick="t"/>
<v:path o:extrusionok="t" o:connecttype="none"/>
<o:lock v:ext="edit" text="t"/>
</v:shape><v:shapetype id="_x0000_t109" coordsize="21600,21600" o:spt="109"
path="m,l,21600r21600,l21600,xe">
<v:stroke joinstyle="miter"/>
<v:path gradientshapeok="t" o:connecttype="rect"/>
</v:shapetype><v:shape id="_x0000_s1028" type="#_x0000_t109" style='position:absolute;
left:2675;top:1272;width:1722;height:2310'>
<v:textbox style="mso-next-textbox:#_x0000_s1028" mce_style="mso-next-textbox:#_x0000_s1028">
<![if !mso]>
<table cellpadding=0 cellspacing=0 width="100%">
<tr>
<td><![endif]>
<div>
<p class=MsoNormal><b style="mso-bidi-font-weight:normal" mce_style="mso-bidi-font-weight:normal"><span
lang=EN-US style='font-size:9.0pt'>Next_Desc_Ptr[15:0]<o:p></o:p></span></b></p>
<p class=MsoNormal><b style="mso-bidi-font-weight:normal" mce_style="mso-bidi-font-weight:normal"><span
lang=EN-US style='font-size:9.0pt'>Start_Addr[15:0]<o:p></o:p></span></b></p>
<p class=MsoNormal><b style="mso-bidi-font-weight:normal" mce_style="mso-bidi-font-weight:normal"><span
lang=EN-US style='font-size:9.0pt'>Start_Addr[31:16]<o:p></o:p></span></b></p>
<p class=MsoNormal><b style="mso-bidi-font-weight:normal" mce_style="mso-bidi-font-weight:normal"><span
lang=EN-US style='font-size:9.0pt'>DMA_Config<o:p></o:p></span></b></p>
<p class=MsoNormal><b style="mso-bidi-font-weight:normal" mce_style="mso-bidi-font-weight:normal"><span
lang=EN-US style='font-size:9.0pt'>X_Count<o:p></o:p></span></b></p>
<p class=MsoNormal><b style="mso-bidi-font-weight:normal" mce_style="mso-bidi-font-weight:normal"><span
lang=EN-US style='font-size:9.0pt'>X_Modify<o:p></o:p></span></b></p>
<p class=MsoNormal><b style="mso-bidi-font-weight:normal" mce_style="mso-bidi-font-weight:normal"><span
lang=EN-US style='font-size:9.0pt'>Y_Count<o:p></o:p></span></b></p>
<p class=MsoNormal><b style="mso-bidi-font-weight:normal" mce_style="mso-bidi-font-weight:normal"><span
lang=EN-US style='font-size:9.0pt'>Y_Modify<o:p></o:p></span></b></p>
<p class=MsoNormal><span lang=EN-US style="font-size:9.0pt" mce_style="font-size:9.0pt"><o:p> </o:p></span></p>
</div>
<![if !mso]></td>
</tr>
</table>
<![endif]></v:textbox>
</v:shape><v:shape id="_x0000_s1029" type="#_x0000_t109" style='position:absolute;
left:5023;top:1951;width:1721;height:2310'>
<v:textbox style="mso-next-textbox:#_x0000_s1029" mce_style="mso-next-textbox:#_x0000_s1029">
<![if !mso]>
<table cellpadding=0 cellspacing=0 width="100%">
<tr>
<td><![endif]>
<div>
<p class=MsoNormal><b style="mso-bidi-font-weight:normal" mce_style="mso-bidi-font-weight:normal"><span
lang=EN-US style='font-size:9.0pt'>Next_Desc_Ptr[15:0]<o:p></o:p></span></b></p>
<p class=MsoNormal><b style="mso-bidi-font-weight:normal" mce_style="mso-bidi-font-weight:normal"><span
lang=EN-US style='font-size:9.0pt'>Start_Addr[15:0]<o:p></o:p></span></b></p>
<p class=MsoNormal><b style="mso-bidi-font-weight:normal" mce_style="mso-bidi-font-weight:normal"><span
lang=EN-US style='font-size:9.0pt'>Start_Addr[31:16]<o:p></o:p></span></b></p>
<p class=MsoNormal><b style="mso-bidi-font-weight:normal" mce_style="mso-bidi-font-weight:normal"><span
lang=EN-US style='font-size:9.0pt'>DMA_Config<o:p></o:p></span></b></p>
<p class=MsoNormal><b style="mso-bidi-font-weight:normal" mce_style="mso-bidi-font-weight:normal"><span
lang=EN-US style='font-size:9.0pt'>X_Count<o:p></o:p></span></b></p>
<p class=MsoNormal><b style="mso-bidi-font-weight:normal" mce_style="mso-bidi-font-weight:normal"><span
lang=EN-US style='font-size:9.0pt'>X_Modify<o:p></o:p></span></b></p>
<p class=MsoNormal><b style="mso-bidi-font-weight:normal" mce_style="mso-bidi-font-weight:normal"><span
lang=EN-US style='font-size:9.0pt'>Y_Count<o:p></o:p></span></b></p>
<p class=MsoNormal><b style="mso-bidi-font-weight:normal" mce_style="mso-bidi-font-weight:normal"><span
lang=EN-US style='font-size:9.0pt'>Y_Modify<o:p></o:p></span></b></p>
<p class=MsoNormal><span lang=EN-US style="font-size:9.0pt" mce_style="font-size:9.0pt"><o:p> </o:p></span></p>
</div>
<![if !mso]></td>
</tr>
</table>
<![endif]></v:textbox>
</v:shape><v:shape id="_x0000_s1030" type="#_x0000_t109" style='position:absolute;
left:7527;top:1272;width:1721;height:2310'>
<v:textbox style="mso-next-textbox:#_x0000_s1030" mce_style="mso-next-textbox:#_x0000_s1030">
<![if !mso]>
<table cellpadding=0 cellspacing=0 width="100%">
<tr>
<td><![endif]>
<div>
<p class=MsoNormal><b style="mso-bidi-font-weight:normal" mce_style="mso-bidi-font-weight:normal"><span
lang=EN-US style='font-size:9.0pt'>Next_Desc_Ptr[15:0]<o:p></o:p></span></b></p>
<p class=MsoNormal><b style="mso-bidi-font-weight:normal" mce_style="mso-bidi-font-weight:normal"><span
lang=EN-US style='font-size:9.0pt'>Start_Addr[15:0]<o:p></o:p></span></b></p>
<p class=MsoNormal><b style="mso-bidi-font-weight:normal" mce_style="mso-bidi-font-weight:normal"><span
lang=EN-US style='font-size:9.0pt'>Start_Addr[31:16]<o:p></o:p></span></b></p>
<p class=MsoNormal><b style="mso-bidi-font-weight:normal" mce_style="mso-bidi-font-weight:normal"><span
lang=EN-US style='font-size:9.0pt'>DMA_Config<o:p></o:p></span></b></p>
<p class=MsoNormal><b style="mso-bidi-font-weight:normal" mce_style="mso-bidi-font-weight:normal"><span
lang=EN-US style='font-size:9.0pt'>X_Count<o:p></o:p></span></b></p>
<p class=MsoNormal><b style="mso-bidi-font-weight:normal" mce_style="mso-bidi-font-weight:normal"><span
lang=EN-US style='font-size:9.0pt'>X_Modify<o:p></o:p></span></b></p>
<p class=MsoNormal><b style="mso-bidi-font-weight:normal" mce_style="mso-bidi-font-weight:normal"><span
lang=EN-US style='font-size:9.0pt'>Y_Count<o:p></o:p></span></b></p>
<p class=MsoNormal><b style="mso-bidi-font-weight:normal" mce_style="mso-bidi-font-weight:normal"><span
lang=EN-US style='font-size:9.0pt'>Y_Modify<o:p></o:p></span></b></p>
<p class=MsoNormal><span lang=EN-US style="font-size:9.0pt" mce_style="font-size:9.0pt"><o:p> </o:p></span></p>
</div>
<![if !mso]></td>
</tr>
</table>
<![endif]></v:textbox>
</v:shape><v:line id="_x0000_s1031" style="position:absolute" mce_style="position:absolute" from="4397,1408"
to="5023,2224">
<v:stroke endarrow="block"/>
</v:line><v:line id="_x0000_s1032" style="position:absolute;flip:y" mce_style="position:absolute;flip:y" from="6745,1543"
to="7527,2087">
<v:stroke endarrow="block"/>
</v:line><w:wrap type="none"/>
<w:anchorlock/>
</v:group><![endif]--><!-- [if !vml]--><!-- [endif]-->
<!-- [if mso & !supportInlineShapes & supportFields]><span
lang=EN-US><v:shape id="_x0000_i1025" type="#_x0000_t75" style='width:414pt;
height:202.8pt'>
<v:imagedata croptop="-65520f" cropbottom="65520f"/>
</v:shape><span style="mso-element:field-end" mce_style="mso-element:field-end"></span></span><![endif]-->
图
5-2
设置基于描述符的
DMA
的典型时序
2
基于自动缓冲的
DMA
传送
基于自动缓冲的
DMA
操作,除了不需要存储器中的描述符外,与基于描述符的
DMA
相同。在自动缓冲模式中,
DMA
控制器是可写的,并且可以被处理器直接编程以发起一个
DMA
传送过程。一旦传送完成,控制寄存器被他们的原始设置值重载,以备下一次传送。这将产生一个循环缓冲区,并且不断地传送数据,直到通过将外设
DMA
配置寄存器的
DMA
使能位清零,才被禁止。如果允许中断,在传送过程进行一半
和完成
时,将产生中断。
下面是设置基于自动缓冲
DMA
的典型步骤:
<!-- [if !supportLists]-->(1)
<!-- [endif]-->将
DMA
配置寄存器中的自动缓冲使能位置
1
;
<!-- [if !supportLists]-->(2)
<!-- [endif]-->初始化
DMA
传送计数器,
DMA
起始地址高位寄存器,
DMA
起始地址低位寄存器;
<!-- [if !supportLists]-->(3)
<!-- [endif]-->写
DMA
配置寄存器,对
DMA
传送进行设置,并将
DMA
使能位置
1.
这一部将启动基于自动缓冲的
DMA
的传送过程。
<!-- [if !supportLists]-->(4)
<!-- [endif]-->要停止
DMA
的传送,需要将寄存器中的
DMA
使能位清零,正在传送期间将位清零,不会像基于描述符的
DMA
那样引起
DMA
错误结束,一旦检测到
DMA
使能位被清零,
DMA
传送寄存器
可以用来监视
DMA
传送状态。
3
存储器
DMA
存储器
DMA
(
MemeDMA
)控制器提供在
Blackfin
存储空间中存储器对存储器的
DMA
数据传送。这些存储空间包括外设组件互连(
PCI
)地址空间、
L1
、
L2
以及外部的同步
&
异步存储器。
MemDMA
控制器由两个通道组成。一个是源通道,用于读存储器,另一个是目的通道,用于写存储器。两个通道共享
一个可以存放
16
条记录的
32
位
FIFO
。源
DMA
通道写
FIFO
,目的
DMA
通道读
FIFO
。
FIFO
深度大大改善了内部与外部存储器之间的数据传送流量。
FIFO
支持
8
位、
16
位和
32
位的传送。但是,在
8
位和
16
位传送中,仅使用
32
位数据总线的一部分,因此,这两种传送的流量要比
32
位的
DMA
操作低。
MemDMA
控制器不支持基于自动缓冲的
DMA
,使用
MemDMA
控制器的传送必须是基于描述符的
DMA
。而且要有两个独立的描述符列链表,一个用于源
DMA
通道,另一个用于目的
DMA
通道。
因为源
DMA
和目的
DMA
通道共享一个
FIFO
缓冲,两个描述符中的传送计数必须设置为相同值,数据尺寸也设置为相同值。
4
二维
DMA
Blackfin-533
支持二维
DMA
的传送操作,其相关寄存器和功能如下:
<!-- [if !supportLists]-->(1)
<!-- [endif]-->配置寄存器(
DMAx-CONFIG_yy_CONFIG
)
设置二维
DMA
方式使能,中断产生的方式,其中中断可以在一行结束时产生,也可以在整个
DMA
结束时产生。
<!-- [if !supportLists]-->(2)
<!-- [endif]-->内层循环计数寄存器(
DMAx_X_COUNT/MDMA-yy_X_COUNT
)
在二维
DMA
时保存二维
DMA
内层循环的数目(行数)必须大于等于
2
<!-- [if !supportLists]-->(3)
<!-- [endif]-->内层循环地址增量寄存器(
DMAx_X_MODIFY/MDMA_yy_X_MODIFY
)
在二维
DMA
时保存每一次内层循环计数器加
1
后
DMA
操作(读或者写)地址在内存中的增量,此增量应该是二维
DMA
操作的数据单元长度的整数倍,比如二维
DMA
进行
16
位读
/
写,则此增量必须是
2
的
N
倍。
<!-- [if !supportLists]-->(4)
<!-- [endif]-->外层循环计数寄存器(
DMAx_Y_COUNT/MDMA-yy_Y_COUNT
)
在二维
DMA
时保存二维
DMA
外层循环的数目(列数)。
<!-- [if !supportLists]-->(5)
<!-- [endif]-->外层循环地址增量寄存器(
DMAx_Y_MODIFY/MDMA_yy_Y_MODFIY
)
在二维
DMA
时,保存每一外层循环计数器加
1
后
DMA
操作(读或者写)地址在内存中的增量,可以使负值,此增量应该是二维
DMA
操作的数据单元长度的整数倍。
参考书籍:《
ADI
Blackfin
系列
DSP
处理器试验指导书》
分享到:
相关推荐
DMA传输的C语言实现DMA传输的C语言实现DMA传输的C语言实现DMA传输的C语言实现DMA传输的C语言实现DMA传输的C语言实现DMA传输的C语言实现DMA传输的C语言实现DMA传输的C语言实现DMA传输的C语言实现DMA传输的C语言实现...
STM32作为主控芯片,72Mhz,利用DMA+PWM实现驱动WS2812,创建16个并行800kBit / s数据流的想法如下: 使用定时器每1.25us创建一个800kHz的时基和一个DMA请求。 使用2个比较模块在低位时间(350ns)和高位时间(700ns...
目前STM32家族中有些系列支持DMA的双缓冲模式,比如STM32F2/STM32F4/STM32F7等系列。尤其随着人们对STM32F4/F7系列应用不断拓宽和加深,在设计中运用到DMA双缓冲的场合也越来越多。STM32芯片中的DMA又可分为两大类,...
DMA技术是Direct Memory Access的缩写。其意思是“存储器直接访问”。它是指一种高速的数据传输操作,允许在外部设备和存储器之间直接读写数据,既不通过CPU,也不需要CPU干预。 DMA是指外部设备不通过CPU而直接与...
DMA:开启DMA,DMA发送完一帧数据后产生发送完成中断,在DMA发送完成中断中,开启USART接收中断(字节), 在USART接收中断中保存接收到的数据。注: 本程序额外开启了USART空闲中断,在空闲中断中将 USART接收中断...
本资源是RH850/F1L的DMA使用例子程序。 RH850/F1L是Renesas/瑞萨的一款汽车级的32bit芯片/MCU,DMA(Direct Memory Access)模块,助理于数据的高效搬运,有效减少系统CPU负载。本资源演示了UART通信过程中使用DMA...
Stm32的ADC有DMA功能这都毋庸置疑,也是我们用的最多的!然而,如果我们要对一个信号(比如脉搏信号)进行定时采样(也就是隔一段时间,比如说2ms),有三种方法: 1、使用定时器中断每隔一定时间进行ADC转换,这样...
Altera 免费提供的DMA IP与一般的MCU中的DMA有些不同.doc DMA(Memory to Memory)驱动演示代码.doc DMA.pdf dma_main.c DMA传输小结.doc DMA在实时图像处理中的应用.pdf DMA在高速红外图像实时处理系统中的应用...
于是就想到用DMA来接收串口数据,这个STM32也是支持的。但是关键的一点,怎么知道数据接收完毕了呢?如果接收的数据长度固定,那就好办,直接设置DMA的接收数据个数就行了。但是如果长度不固定了,那应该怎么办了?
2. UART1使用DMA+双缓存方式存放数据,并将收到的数据长度和内容即时存放到队列之中,然后交给另一个任务。这个任务即时把队列中的数据用串口返回给上位机。 如果是从我的文章来的,可以直接看stm32f1xx_it.c文件,...
注意点:采用DMA发送应该等到BTF(发送寄存器空,移位寄存器也为空)事件后设置停止位,不可以在DMA传输完成中断中设置停止位,因为此时正在发送最后一个字节,故开启BTF中断(I2C_EV),在该中断服务函数中发送停止位并...
在显示刷新时可以不占用CPU运算时间,利用芯片内的DMA做数据通信,节约CPU资源。提高CPU的运行较率。
工程是基于STM32F207的ADC_DMA的整体程序 #define ADC1_DR_Address ((u32)0x4001204C) //ADC1数据寄存器地址=ADC1基准地址(0x40012000)+数据寄存器偏移地址(0x4c) GPIO_InitTypeDef GPIO_InitStructure; ADC_...
STM32H7串口DMA的实现代码,供参考
基于STM32F407 MCU,对RS485进行通讯测试,DMA收发数据,经测试数据稳定,功能正常
在keil环境下基于stm32F407的DMA的双缓冲的ADC数据采集,这是一个完整的工程,可以直接下载使用
实验内容: CC2530 DMA 数据传输的使用,并利用 UART 实现 CC2530 芯片与 PC 机的 DMA 方式数据传输。 zigbee硬件实验,用的是CC2530,包含实验代码code一个文件夹和实验报告。 硬件开发语言:C语言 !!实验报告...
内含1-STM32F4xx中文参考手册2(DMA2D+LTDC+SAI+FMC) LTCD + DMA2D LTDC仅使用一个图层,如果要使用双图层则使用DMA2D的前景和背景来实现 仅存储的有1帧图像 如果要绘制包含透明通道的图像,请调用LCD_Mix_Copy...
DMA的verilog硬件实现,此版本为东南大学2005年版本。目测可用。 网上有很多该版本,但是不全,此次为收集齐全的版本方便大家学习研究。(没有找到文档说明,代码注释较详细)
stm32f407 用dma发送IIC测试程序