📄 main.c
字号:
/**********************************************************************************/
/*程序名称:EDMA数据传输例程 */
/*创建人:马文武 */
/*创建时间:2007-04-23 */
/*程序功能:通过EDMA方式,将输入FIFO的数据读入到DSP的L2空间,以供主程序处理,采用 */
/*块输入模式。处理完毕后,采用EDMA方式将数据送到输出FIFO。为保证处理和数据的输入输*/
/*出不发生影响,采用Ping-Pong方式输入输出。由于在本次设计的硬件上输入和输出都连接*/
/*在EMIFB上,占有同一个总线(输入和输出FIFO都分配在CE3),所以数据传输方式为:触发*/
/*数据传输-inPing-outPing-触发数据处理-触发数据传输-inPong-outPong-触发数据*/
/*处理-触发数据传输-inPing-outPing-... */
/**********************************************************************************/
/*----------------------------------------------------------------------------*/
//传输原程序头文件区
#include <std.h>
#include <swi.h>
#include <log.h>
#include <clk.h>
#include <csl.h>
#include <csl_cache.h>
#include <csl_edma.h>
#include <csl_timer.h>
#include <csl_irq.h>
#include <stdio.h>
#include <csl_chip.h>
#include <csl_cache.h>
#include <csl_emifb.h>
#include <csl_gpio.h>
#include <string.h>
#include "sin_table.h"
/*----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------*/
//用户程序头文件区
#include "FilterTables.h"
#include <stdio.h>
#include "stdlib.h"
#include <math.h>
#include <float.h>
/*----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------*/
//传输原程序变量区
#define BUFF_SZ 2048 /* 每次数据传输的数据块大小 */
#pragma DATA_SECTION(emifb_data,".off_fifo"); /*分配FIFO的地址*/
short emifb_data;
#define TCCINTNUM_in 4 /*EDMA传输结束检测字*/
#define TCCINTNUM_out 6
#define PING 0
#define PONG 1
#pragma DATA_ALIGN(ping,2048); /*定义输入缓存数据边界*/
#pragma DATA_ALIGN(pong,2048);
short ping[BUFF_SZ];
short pong[BUFF_SZ];
#pragma DATA_ALIGN(outping,2048);/*定义输出缓存数据边界*/
#pragma DATA_ALIGN(outpong,2048);
short outping[BUFF_SZ];
short outpong[BUFF_SZ];
short flag_ping=0,flag_pong=0,flag=0;
short num_ping=0,num_pong=0;
void processing(void); /*用户处理程序*/
static int pingpong = 0; /*ping-pong标志位*/
extern SWI_Obj processingSwi;
/*----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------*/
//用户程序变量区
struct complex_sh
{
short x;
short y;
};
struct complex_t
{
int x;
int y;
};
void CalcBPFilter(
short *pIn,
struct complex_sh *pOut
);
/*----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------*/
//配置区
/*GPIO配置,输入FIFO半满信号通过GPIO4输入到DSP中,触发传输*/
static Uint32 gpgc = GPIO_GPGC_RMK(
GPIO_GPGC_GP0M_GPIOMODE,
GPIO_GPGC_GPINT0M_DEFAULT,
GPIO_GPGC_GPINTPOL_DEFAULT,
GPIO_GPGC_LOGIC_DEFAULT,
GPIO_GPGC_GPINTDV_DEFAULT
);
static Uint32 gpen = GPIO_GPEN_OF(0x60d0); //14,13,7,6,4 GPIO
static Uint32 gpdir = GPIO_GPDIR_OF(0x6080);
static Uint32 gpval = GPIO_GPVAL_OF(0x60d0);
static Uint32 gphm = GPIO_GPHM_RMK(GPIO_GPHM_GPXHM_DEFAULT);
static Uint32 gplm = GPIO_GPLM_RMK(GPIO_GPLM_GPXLM_DEFAULT);
static Uint32 gppol = GPIO_GPPOL_RMK(GPIO_GPPOL_GPINTXPOL_DEFAULT);
/*EMIFB配置*/
static EMIFB_Config MyEmifbConfig =
{
EMIFB_GBLCTL_RMK
(
EMIFB_GBLCTL_EK2RATE_FULLCLK, //1 X EMIF input clock
EMIFB_GBLCTL_EK2HZ_CLK, //eclkout2 continue output during hold
EMIFB_GBLCTL_EK2EN_ENABLE, //eclkout2 enable output
EMIFB_GBLCTL_BRMODE_MRSTATUS, //bus request is memory access or refresh pending/in progress
EMIFB_GBLCTL_NOHOLD_ENABLE,
EMIFB_GBLCTL_EK1HZ_CLK, //eclkout1 continue output during hold
EMIFB_GBLCTL_EK1EN_ENABLE //eclkout1 enable output
),
0x1051c4B1,
0x1051c4B1,
0x1051c4B1,
0x1051c4B1,//用到CE3
EMIFB_SDCTL_DEFAULT,
EMIFB_SDTIM_DEFAULT,
EMIFB_SDEXT_DEFAULT,
0x00000031,
0x00000031,
0x00000031,
0x00000031 //用到CE3
};
/*定义EDMA输入句柄*/
EDMA_Handle hEdma;
EDMA_Handle hEdmaping;/*ping*/
EDMA_Handle hEdmapong;/*pong*/
EDMA_Config cfgEdma;/*定义输入主配置*/
/*定义EDMA输入句柄*/
EDMA_Handle hEdmaxmt;
EDMA_Handle hEdmaxmtping;
EDMA_Handle hEdmaxmtpong;
EDMA_Config cfgEdmaxmt;/*定义输入主配置*/
/*输入ping配置*/
EDMA_Config cfgEdmaping={
/* OPT Setup */
EDMA_OPT_RMK(
EDMA_OPT_PRI_LOW, /* 011 */
EDMA_OPT_ESIZE_16BIT, /* 01 */
EDMA_OPT_2DS_NO, /* 0 */
EDMA_OPT_SUM_NONE, /* 00 */
EDMA_OPT_2DD_YES, /* 1 */
EDMA_OPT_DUM_INC, /* 01 */
EDMA_OPT_TCINT_YES, /* 1 */
EDMA_OPT_TCC_OF(TCCINTNUM_in), /* 4 */
EDMA_OPT_TCCM_DEFAULT, /* 0 */
EDMA_OPT_ATCINT_DEFAULT,/* 0 */
EDMA_OPT_ATCC_DEFAULT, /* 0 */
EDMA_OPT_PDTS_DEFAULT, /* 0 */
EDMA_OPT_PDTD_DEFAULT, /* 0 */
EDMA_OPT_LINK_YES, /* 1 */
EDMA_OPT_FS_YES /* 1 */
),
EDMA_SRC_OF(&emifb_data), /* 传输源地址 */
EDMA_CNT_OF(0x08000001), /* 每次传输1帧,每帧2048个元素 */
EDMA_DST_OF(ping), /* 传输目的地址 */
EDMA_IDX_OF(0x00000000),
EDMA_RLD_OF(0x00000000)
};
/*输入pong配置*/
EDMA_Config cfgEdmapong={
EDMA_OPT_RMK(
EDMA_OPT_PRI_LOW, /* 011 */
EDMA_OPT_ESIZE_16BIT, /* 01 */
EDMA_OPT_2DS_NO, /* 0 */
EDMA_OPT_SUM_NONE, /* 00 */
EDMA_OPT_2DD_YES, /* 1 */
EDMA_OPT_DUM_INC, /* 01 */
EDMA_OPT_TCINT_YES, /* 1 */
EDMA_OPT_TCC_OF(TCCINTNUM_in), /* 4 */
EDMA_OPT_TCCM_DEFAULT, /* 0 */
EDMA_OPT_ATCINT_DEFAULT,/* 0 */
EDMA_OPT_ATCC_DEFAULT, /* 0 */
EDMA_OPT_PDTS_DEFAULT, /* 0 */
EDMA_OPT_PDTD_DEFAULT, /* 0 */
EDMA_OPT_LINK_YES, /* 1 */
EDMA_OPT_FS_YES /* 1 */
),
EDMA_SRC_OF(&emifb_data),
EDMA_CNT_OF(0x08000001),
EDMA_DST_OF(pong),
EDMA_IDX_OF(0x00000000),
EDMA_RLD_OF(0x00000000)
};
/*输出ping配置*/
EDMA_Config cfgEdmaxmtping={
EDMA_OPT_RMK(
EDMA_OPT_PRI_LOW, /* 011 */
EDMA_OPT_ESIZE_16BIT, /* 01 */
EDMA_OPT_2DS_YES, /* 1 */
EDMA_OPT_SUM_INC, /* 01 */
EDMA_OPT_2DD_NO, /* 0 */
EDMA_OPT_DUM_NONE, /* 00 */
EDMA_OPT_TCINT_YES, /* 1 */
EDMA_OPT_TCC_OF(TCCINTNUM_out), /* 6 */
EDMA_OPT_TCCM_DEFAULT, /* 0 */
EDMA_OPT_ATCINT_DEFAULT,/* 0 */
EDMA_OPT_ATCC_DEFAULT, /* 0 */
EDMA_OPT_PDTS_DEFAULT, /* 0 */
EDMA_OPT_PDTD_DEFAULT, /* 0 */
EDMA_OPT_LINK_YES, /* 1 */
EDMA_OPT_FS_YES /* 1 */
),
EDMA_SRC_OF(outping), /* 传输源地址 */
EDMA_CNT_OF(0x08000001),
EDMA_DST_OF(&emifb_data),
EDMA_IDX_OF(0x00000000),
EDMA_RLD_OF(0x00000000)
};
EDMA_Config cfgEdmaxmtpong={
EDMA_OPT_RMK(
EDMA_OPT_PRI_LOW, /* 011 */
EDMA_OPT_ESIZE_16BIT, /* 01 */
EDMA_OPT_2DS_YES, /* 1 */
EDMA_OPT_SUM_INC, /* 01 */
EDMA_OPT_2DD_NO, /* 0 */
EDMA_OPT_DUM_NONE, /* 00 */
EDMA_OPT_TCINT_YES, /* 1 */
EDMA_OPT_TCC_OF(TCCINTNUM_out), /* 6 */
EDMA_OPT_TCCM_DEFAULT, /* 0 */
EDMA_OPT_ATCINT_DEFAULT,/* 0 */
EDMA_OPT_ATCC_DEFAULT, /* 0 */
EDMA_OPT_PDTS_DEFAULT, /* 0 */
EDMA_OPT_PDTD_DEFAULT, /* 0 */
EDMA_OPT_LINK_YES, /* 1 */
EDMA_OPT_FS_YES /* 1 */
),
EDMA_SRC_OF(outpong), /* 传输源地址 */
EDMA_CNT_OF(0x08000001),
EDMA_DST_OF(&emifb_data),
EDMA_IDX_OF(0x00000000),
EDMA_RLD_OF(0x00000000)
};
//配置结束
/*----------------------------------------------------------------------------*/
GPIO_Handle hGpio;
void main()
{
/* 初始化芯片支持库(CSL) */
CSL_init();
//配置EMIFB
EMIFB_config(&MyEmifbConfig);
//打开GPIO句柄
hGpio = GPIO_open(GPIO_DEV0,GPIO_OPEN_RESET);
GPIO_configArgs(hGpio,gpgc,gpen,gpdir,gpval,gphm,gplm,gppol);
IRQ_reset(IRQ_EVT_EDMAINT); /*重置EDMA传输结束中断*/
EDMA_intDisable(TCCINTNUM_in); /*清除中断控制字*/
EDMA_intDisable(TCCINTNUM_out);
EDMA_clearPram(0x00000000); /*清除EDMA的RAM组*/
/* 打开EDMA句柄 */
hEdma = EDMA_open(EDMA_CHA_EXTINT4, EDMA_OPEN_RESET);
hEdmaxmt = EDMA_open(EDMA_CHA_EXTINT6, EDMA_OPEN_RESET);
/* 分配EDMA重载地址 */
hEdmaping = EDMA_allocTable(-1);
hEdmapong = EDMA_allocTable(-1);
hEdmaxmtping = EDMA_allocTable(-1);
hEdmaxmtpong = EDMA_allocTable(-1);
/*设置传输主配置*/
cfgEdma = cfgEdmaping;
cfgEdmaxmt = cfgEdmaxmtpong;
/*传输主配置*/
EDMA_config(hEdma, &cfgEdma);
EDMA_config(hEdmaxmt, &cfgEdmaxmt);
/*传输pingpong配置*/
EDMA_config(hEdmaping, &cfgEdmaping);
EDMA_config(hEdmapong, &cfgEdmapong);
EDMA_config(hEdmaxmtping, &cfgEdmaxmtping);
EDMA_config(hEdmaxmtpong, &cfgEdmaxmtpong);
EDMA_RSET(EPRL,0x00000010); /*设置GPIO4为下跳沿触发*/
EDMA_RSET(EERL,0x00000040); /*使能EDMA通道6的CPU触发*/
EDMA_link(hEdma,hEdmaping); /*输入链接*/
EDMA_link(hEdmaping,hEdmapong);
EDMA_link(hEdmapong,hEdmaping);
EDMA_link(hEdmaxmt,hEdmaxmtping);/*输出链接*/
EDMA_link(hEdmaxmtping,hEdmaxmtpong);
EDMA_link(hEdmaxmtpong,hEdmaxmtping);
EDMA_intClear(TCCINTNUM_in); /*清除EDMA中断控制字*/
EDMA_intClear(TCCINTNUM_out);
EDMA_intEnable(TCCINTNUM_in); /*使EDMA中断控制字能*/
EDMA_intEnable(TCCINTNUM_out);
EDMA_enableChannel(hEdma); /*使能EDMA传输*/
EDMA_enableChannel(hEdmaxmt);
IRQ_enable(IRQ_EVT_EDMAINT); /*使能EDMA中断*/
IRQ_globalEnable(); /*使能全局中断*/
EDMA_RSET(ESRL,0x00000040);
while(1);
/*等待EDMA传输结束中断*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -