?? 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 + -