Chinaunix首页 | 论坛 | 博客
  • 博客访问: 209534
  • 博文数量: 93
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 978
  • 用 户 组: 普通用户
  • 注册时间: 2014-11-10 15:46
个人简介

青春无悔

文章分类

全部博文(93)

文章存档

2015年(16)

2014年(77)

我的朋友

分类: 嵌入式

2014-11-10 16:42:46

1.中断程序需要写1清请求DMA_IRQ_STATUS寄存器

2.UART的DMA通过
1)配置系统DMA的寄存器
2)使能UART的ERBFI或ETBEI中断位在UART_IER寄存器

3.发送DMA,建议DMA_CONFIG寄存器的SYNC置位。只有SYNC置位情况下,
UART TX DMA中断服务程序才允许启动另外DMA序列或者清楚ETBEI位

4.默认的DMA通道与外设的映射大多数可以满足要求。如果为了提高DMA的优先级处理外设,也可以通过寄存器DMAx_PERIHERAL_MAP的4-bit PMAP区域填充需要映射外设即可。

5.DMA的工作模式:
5.1.基于寄存器的操作
配置流程:
1)DMAx_START_ADDR写入源/目的地址32-bit
2)DMAx_X_COUNT写入传输的words个数16-bit
3)DMAx_X_MODIFY写入每次指针的移动字节数。例如写入0x0004表示32-bit DMA传输,0x0002表示16-bit 传输,0x0001表示8-bit传输
4)DMAx_CONFIG的配置,以下尤为注意的几个
     DMAEN:表示使能DMA通道
     WNR:控制DMA的方向
     WDSIZE:表示传输字宽。可以8/16/32bit
     DI_EN:表示使能产生中断,在DMA传输完成后
     FLOW:若0x0--STOP MODE, 0x1--AUTOBUFFER MODE
5)状态寄存器DMAx_IRQ_STATUS有DMA_DONE,DMA_ERR,DMA_RUN三个相关位。其中DMA_DONE,DMA_ERR也会产生中断,而在中断服务程序必须(W1C)请标志;若不使用中断处理,可以检测DMA_RUN位判断(0表示传输完成)
STOP-MODE:    
a) DMA只运行1次,完成后即停止。
b)若DMA不再使用,需要软件清除DMAEN位。
c)STOP-MODE的配置是通过DMAx_CONFIG的FLOW位写0,同时NDSIZE必须也为0
d)在接收(写内存)操作中,DMA_RUN与DMA_DONE是相反的;在发送(读内存)操作中,参考DMAx_CONFIG的SYNC位的说明
AUTOBUFFER MODE:  
a) DMA循环自动管理,当所有数据传输完成,DMAx_CURR_ADD重新加载回DMAx_START_ADDR值,同时会产生中断。
b)AUTO-MODE的配置是通过DMAx_CONFIG的FLOW位写1,同时NDSIZE必须也为0

5.2.二维DMA模式(略)
5.3.Descriptor-Based DMA Operation(略)

6.Continuous Transfers Using Autobuffering
1.一维中断驱动
关键设计考虑的是软件之前必须先处理项目缓冲DMA传输。
这个方案可能是可行的,如果系统设计保证了数据重复周期长于中断延迟在所有情况下。
2.双缓冲机制
例如把1K-word的buffer分成2个512-word sub-buffers,接收16bit外设数据。配置如下:

DMAx_START_ADDR = buffer base address

DMAx_CONFIG = 0x10D7 (FLOW = 1, DI_EN = 1, DI_SEL = 1, DMA2D = 1, WDSIZE = b#01, WNR = 1, DMAEN = 1)

DMAx_X_COUNT =  512

DMAx_X_MODIFY = 2 for 16-bit data

DMAx_Y_COUNT =  2 for two sub-buffers

DMAx_Y_MODIFY = 2 same as DMAx_X_MODIFY for contiguous sub-buffers
3.二维轮询机制
For example, assume receive data needs to be processed in packets of sixteen 32-bit elements. A four-part 2-D DMA buffer can be allocated where each of the four sub-buffers can hold one packet with these settings:

DMAx_START_ADDR =  buffer base address

DMAx_CONFIG = 0x101B (FLOW = 1, DI_EN = 0, DMA2D = 1, WDSIZE = b#10, WNR = 1, DMAEN = 1)

DMAx_X_COUNT = 16

DMAx_X_MODIFY = 4 for 32-bit data

DMAx_Y_COUNT = 4 for four sub-buffers

DMAx_Y_MODIFY = 4 same as DMAx_X_MODIFY for contiguous sub-buffers
同步核心可能读DMAx_Y_COUNT确定哪些sub-buffer目前正在转移,然后允许一个完整sub-buffer占管道。例如,如果一个阅读DMAx_Y_COUNT显示值为3,那么软件应该假设sub-buffer 3被转移,但有些部分sub-buffer 2或许尚未收到。然而,软件可以安全地进行处理sub-buffers 1或0。
4.一维非同步FIFO




阅读(700) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~