|
EDMA例程
(1) 手动触发事件11,可运行PaRAM11中的传递参数并通过PaRAM.LINK链接到PaRAM10,再手动触发事件11即可运行PaRAM10中的传递参数。
extern void setup_EDMA ( void)//EDMA3初始化,通道10,使用CPU开始中断
{
// Clear EventRegisters
CSL_FINST(edma3ccRegs->ECR, EDMA3CC_ECR_REG, MASK);//清空中断事件
CSL_FINST(edma3ccRegs->SECR, EDMA3CC_SECR_REG, MASK);//清空中断事件
/*---------------------------------- EDMA Event10-------------------------------*/
// Enable Channel 10to DSP (Region 1)
CSL_FINST(edma3ccRegs->DRA[CSL_EDMA3_REGION_1].DRAE,
EDMA3CC_DRAE_E10,ENABLE);//设置DRA1通道的第10个通道
// Assign Channel 10to Queue 0
CSL_FINST(edma3ccRegs->DMAQNUM[1], EDMA3CC_DMAQNUM_E2, Q0);//将通道10放置在队列0中;
//由于只定义了E0-E7,在NUM0时对应E2,在NUM1时对应E10,查表可知
// Initialize PaRAMTransfer Context for Event 10
// init_PaRAM_event10();//设置参数向量
// Enable Channel 10Event Register
CSL_FINST(edma3ccRegs->EESR, EDMA3CC_EESR_E10, SET);//使能事件10
// Enable Interruptsfor Channel 10
CSL_FINST(edma3ccRegs->IESR, EDMA3CC_IESR_I10, SET);//允许通道10中断
/*---------------------------------- EDMA Event11-------------------------------*/
// Enable Channel 11to DSP (Region 1)
CSL_FINST(edma3ccRegs->DRA[CSL_EDMA3_REGION_1].DRAE,
EDMA3CC_DRAE_E11,ENABLE);//设置DRA1通道的第11个通道
// Assign Channel 11to Queue 0
CSL_FINST(edma3ccRegs->DMAQNUM[1], EDMA3CC_DMAQNUM_E3, Q0);//将通道11放置在队列0中;
//由于只定义了E0-E7,在NUM0时对应E3,在NUM1时对应E11,查表可知
// Initialize PaRAMTransfer Context for Event 11
//init_PaRAM_event11();//设置参数向量
// Enable Channel 11Event Register
CSL_FINST(edma3ccRegs->EESR, EDMA3CC_EESR_E11, SET);//使能事件10
// Enable Interruptsfor Channel 11
CSL_FINST(edma3ccRegs->IESR, EDMA3CC_IESR_I11, SET);//允许通道10中断
}
/*---------------------------------------------------------------------------*/
/* setup_EDMA */
/*---------------------------------------------------------------------------*/
void main(void)
{
setup_EDMA();//初始化EDMA3寄存器
for(jj=0;jj<2;jj++)
{
for(kk=0;kk<256;kk++)
{
SRC_AA[jj][kk]=kk*(jj+1);
}
}
for(jj=0;jj<2;jj++)
{
for(kk=0;kk<256;kk++)
{
SRC_BB[jj][kk]=kk;
}
}
for(jj=0;jj<256;jj++)
{
SRC_CC[jj]=2*jj;
}
for(jj=0;jj<256;jj++)
{
SRC_DD[jj]=3*jj;
}
EDMA_event11_Buffer_transfer(1,0,2,2,256);//flag(单行转秩1/矩阵转秩other);转换第x行;数据类型;行数;列数
EDMA_event10_Buffer_transfer(1,1,2,2,256);//flag(单行转秩1/矩阵转秩other);转换第x行;数据类型;行数;列数
CSL_FINST(edma3ccRegs->ESR, EDMA3CC_ESR_E11, SET);
delay(10000);
CSL_FINST(edma3ccRegs->ESR, EDMA3CC_ESR_E11, SET);
delay(10000);
}
/*--------------------------------数组转秩-----------------------------------*/
// function:完成通道10单行/矩阵转秩存储,需要在函数中修改源、目的地址,当转秩矩阵时,参数为转换第0行
// parameters:flag(单行转秩1/矩阵转秩other);转换第x行;数据类型;行数;列数
int EDMA_event10_Buffer_transfer(Uint16 flag,Uint16 trans_number,Uint16 type_data,Uint16 row,Uint16 column)//参数RAM配置
{
int time_EDMA=0;
edma3ccRegs->PARAMSET[EDMA_EVENT10].OPT = CSL_EDMA3CC_OPT_RESETVAL;//参数RAM复位
// ConfigPaRAM OPT (Enable TC Interrupt & ITC Chaining; Set TCC)//允许产生中断,对应事件10
edma3ccRegs->PARAMSET[EDMA_EVENT10].OPT =
CSL_FMKT(EDMA3CC_OPT_ITCCHEN,ENABLE) |
CSL_FMKT(EDMA3CC_OPT_TCINTEN,ENABLE) |
CSL_FMK(EDMA3CC_OPT_TCC,EDMA_EVENT10)|
CSL_FMKT(EDMA3CC_OPT_TCCMOD,NORMAL) |
CSL_FMKT(EDMA3CC_OPT_FWID,8BIT) |//仅仅针对常数位有效
CSL_FMKT(EDMA3CC_OPT_STATIC,NORMAL) |
CSL_FMKT(EDMA3CC_OPT_SYNCDIM,ASYNC) |
CSL_FMKT(EDMA3CC_OPT_DAM,INCR) |
CSL_FMKT(EDMA3CC_OPT_SAM,INCR);
// Initialize EDMAEvent Src and Dst Addresses
edma3ccRegs->PARAMSET[EDMA_EVENT10].SRC = (Uint32)&(SRC_AA);//设置源数组地址
edma3ccRegs->PARAMSET[EDMA_EVENT10].DST = (Uint32)&(DST_BB[0][trans_number]);//设置目的数组地址
// Set EDMA EventPaRAM A,B,C CNT
edma3ccRegs->PARAMSET[EDMA_EVENT10].A_B_CNT =
CSL_FMK(EDMA3CC_A_B_CNT_ACNT,type_data) |//设定传输数据类型
CSL_FMK(EDMA3CC_A_B_CNT_BCNT,column);//设置传输数目
if(flag==1)
{
edma3ccRegs->PARAMSET[EDMA_EVENT10].CCNT = 1;
}
else
{
edma3ccRegs->PARAMSET[EDMA_EVENT10].CCNT = row;
}
edma3ccRegs->PARAMSET[EDMA_EVENT10].SRC_DST_BIDX =
CSL_FMK(EDMA3CC_SRC_DST_BIDX_SRCBIDX,type_data) |
CSL_FMK(EDMA3CC_SRC_DST_BIDX_DSTBIDX,row*type_data);//二维索引
edma3ccRegs->PARAMSET[EDMA_EVENT10].SRC_DST_CIDX =
CSL_FMK(EDMA3CC_SRC_DST_CIDX_SRCCIDX,type_data) |
CSL_FMK(EDMA3CC_SRC_DST_CIDX_DSTCIDX,(1-column)*type_data*row+type_data);//三维索引
// Set EDMA EventPaRAM LINK and BCNTRLD
edma3ccRegs->PARAMSET[EDMA_EVENT10].LINK_BCNTRLD =
CSL_FMK(EDMA3CC_LINK_BCNTRLD_LINK,0xFFFF) |
CSL_FMK(EDMA3CC_LINK_BCNTRLD_BCNTRLD,column);
time_EDMA=1;
return time_EDMA;
}
/*--------------------------------数组转秩PaRAM参数-----------------------------------*/
// function:完成通道11单行/矩阵转秩存储,需要在函数中修改源、目的地址,当转秩矩阵时,参数为转换第0行
// parameters:flag(单行转秩1/矩阵转秩other);转换第x行;数据类型;行数;列数
int EDMA_event11_Buffer_transfer(Uint16 flag,Uint16 trans_number,Uint16 type_data,Uint16 row,Uint16 column)//参数RAM配置
{
int time_EDMA=0;
edma3ccRegs->PARAMSET[EDMA_EVENT11].OPT = CSL_EDMA3CC_OPT_RESETVAL;//参数RAM复位
// ConfigPaRAM OPT (Enable TC Interrupt & ITC Chaining; Set TCC)//允许产生中断,对应事件10
edma3ccRegs->PARAMSET[EDMA_EVENT11].OPT =
CSL_FMKT(EDMA3CC_OPT_ITCCHEN,ENABLE) |
CSL_FMKT(EDMA3CC_OPT_TCINTEN,ENABLE) |
CSL_FMK(EDMA3CC_OPT_TCC,EDMA_EVENT11)|
CSL_FMKT(EDMA3CC_OPT_TCCMOD,NORMAL) |
CSL_FMKT(EDMA3CC_OPT_FWID,8BIT) |//仅仅针对常数位有效
CSL_FMKT(EDMA3CC_OPT_STATIC,NORMAL) |
CSL_FMKT(EDMA3CC_OPT_SYNCDIM,ASYNC) |
CSL_FMKT(EDMA3CC_OPT_DAM,INCR) |
CSL_FMKT(EDMA3CC_OPT_SAM,INCR);
// Initialize EDMAEvent Src and Dst Addresses
edma3ccRegs->PARAMSET[EDMA_EVENT11].SRC = (Uint32)&(SRC_CC);//设置源数组地址
edma3ccRegs->PARAMSET[EDMA_EVENT11].DST = (Uint32)&(DST_BB[0][trans_number]);//设置目的数组地址
// Set EDMA EventPaRAM A,B,C CNT
edma3ccRegs->PARAMSET[EDMA_EVENT11].A_B_CNT =
CSL_FMK(EDMA3CC_A_B_CNT_ACNT,type_data) |//设定传输数据类型
CSL_FMK(EDMA3CC_A_B_CNT_BCNT,column);//设置传输数目
if(flag==1)
{
edma3ccRegs->PARAMSET[EDMA_EVENT11].CCNT = 1;
}
else
{
edma3ccRegs->PARAMSET[EDMA_EVENT11].CCNT = row;
}
edma3ccRegs->PARAMSET[EDMA_EVENT11].SRC_DST_BIDX =
CSL_FMK(EDMA3CC_SRC_DST_BIDX_SRCBIDX,type_data) |
CSL_FMK(EDMA3CC_SRC_DST_BIDX_DSTBIDX,row*type_data);//二维索引
edma3ccRegs->PARAMSET[EDMA_EVENT11].SRC_DST_CIDX =
CSL_FMK(EDMA3CC_SRC_DST_CIDX_SRCCIDX,type_data) |
CSL_FMK(EDMA3CC_SRC_DST_CIDX_DSTCIDX,(1-column)*type_data*row+type_data);//三维索引
// Set EDMA EventPaRAM LINK and BCNTRLD
edma3ccRegs->PARAMSET[EDMA_EVENT11].LINK_BCNTRLD =
CSL_FMK(EDMA3CC_LINK_BCNTRLD_LINK,0x4140) |
CSL_FMK(EDMA3CC_LINK_BCNTRLD_BCNTRLD,column);
time_EDMA=1;
return time_EDMA;
}
|
|