📄 dma.c
字号:
#include<stdio.h>
#include<csl.h>
#include<csl_dma.h>
#include<csl_irq.h>
#define N 128
interrupt void fun_dma(void);
void init_dma(void) ;
#pragma DATA_SECTION(src,"section_xx")
Uint16 src[N];
#pragma DATA_SECTION(dst,"section_yy")
Uint16 dst[N];
DMA_Config dmaconfig=
{
DMA_DMACSDP_RMK(
0, //DMA_DMACSDP_DSTBEN_NOBURST,
0, //DMA_DMACSDP_DSTPACK_OFF,
1, //DMA_DMACSDP_DST_DARAM,0-SARAM,1-DARAM,2-EMIF,3-外设
0, //DMA_DMACSDP_SRCBEN_NOBURST,
0, //DMA_DMACSDP_SRCPACK_OFF,
1, //DMA_DMACSDP_SRC_DARAM,0-SARAM,1-DARAM,2-EMIF,3-外设
1 //DMA_DMACSDP_DATATYPE_16BIT 0-8bit,1-16bit,2-32bit
), /* DMACSDP */
DMA_DMACCR_RMK(
1, //DMA_DMACCR_DSTAMODE_POSTINC,地址自动增加模式
1, //DMA_DMACCR_SRCAMODE_POSTINC,地址自动增加模式
0, //DMA_DMACCR_ENDPROG_OFF,0-编程就绪,1-编程结束
0, //DMA_DMACCR_REPEAT_OFF,编程结束时才自动初始化
0, //DMA_DMACCR_AUTOINIT_OFF,
0, //DMA_DMACCR_EN_STOP,禁止DMA
0, //DMA_DMACCR_PRIO_HI,低优先权
0, //DMA_DMACCR_FS_ENABLE,0-每单元的传输都需要同步信号,1-每帧的传输都需要同步信号
15 //DMA_DMACCR_SYNC_NONE 15到20分别对应int0到int5,用来产生DMA同步信号,以启动DMA数据传输
), /* DMACCR */
DMA_DMACICR_RMK(
0, //DMA_DMACICR_BLOCKIE_OFF,块中断使能,每输完一块数据就产生一次中断
0, //DMA_DMACICR_LASTIE_OFF,最后帧中断使能,开始传输最后帧时产生中断
1, //DMA_DMACICR_FRAMEIE_ON,帧中断使能,每输完一帧数据就产生一次中断
0, //DMA_DMACICR_FIRSTHALFIE_OFF,半帧中断使能,每帧输完一半时产生中断
0, //DMA_DMACICR_DROPIE_OFF,同步事件旁落中断使能,产生同步事件旁落时产生中断
0 //DMA_DMACICR_TIMEOUTIE_OFF,超时中断使能,每超时一次即产生一次中断
), /* DMACICR */
(DMA_AdrPtr)&src, /* DMACSSAL */
0, /* DMACSSAU */
(DMA_AdrPtr)&dst, /* DMACDSAL */
0, /* DMACDSAU */
N, /* DMACEN 一帧的单元数目 */
1, /* DMACFN 每块的帧数目 */
0, /* DMACFI */
0 /* DMACEI */
};
extern void VECSTART(void);
volatile Uint16 count=0;
DMA_Handle mydma ;
Uint16 dma_eventid,old_intm;
void main(void)
{
Uint16 i;
for (i=0;i<=(N-1);i++)
{
dst[i]=0;
src[i]=i+1;
}
CSL_init() ;
IRQ_setVecs((Uint32)(&VECSTART));
old_intm=IRQ_globalDisable();
init_dma() ;
IRQ_globalEnable() ;
DMA_start(mydma) ;
while(count!=1) ;
IRQ_globalRestore(old_intm);
DMA_close(mydma) ;
}
void init_dma(void)
{
Uint16 srcaddressh,srcaddressl,dstaddressh,dstaddressl;
//由于DMA采用的是字节寻址,而src,dst是数据空间的地址常量,代表的是字地址,
//所以需要经过下面方法将字地址转换为字节地址,即将字地址左移一位就转换为字节地址
srcaddressh=(Uint16)(((Uint32)&src)>>15)&0xffffu;;
srcaddressl=(Uint16)(((Uint32)dmaconfig.dmacssal)<<1)&0xffffu;
dstaddressh=(Uint16)(((Uint32)&dst)>>15)&0xffffu;
dstaddressl=(Uint16)(((Uint32)dmaconfig.dmacdsal)<<1)&0xffffu;
dmaconfig.dmacssal=(DMA_AdrPtr)srcaddressl;
dmaconfig.dmacssau=srcaddressh;
dmaconfig.dmacdsal=(DMA_AdrPtr)dstaddressl;
dmaconfig.dmacdsau=dstaddressh;
mydma=DMA_open(DMA_CHA0, DMA_OPEN_RESET);//打开DMA通道0
dma_eventid=DMA_getEventId(mydma);
IRQ_clear(dma_eventid);
IRQ_plug(dma_eventid,&fun_dma);
DMA_config(mydma,&dmaconfig);
IRQ_enable(dma_eventid);
}
interrupt void fun_dma( void )
{
count++;
DMA_stop(mydma);
printf("dma transmition has been finished");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -