1680|0

1140

帖子

0

TA的资源

纯净的硅(初级)

楼主
 

TMS320C6748开发板EDMA例程 [复制链接]

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;
}

 
点赞 关注

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表