?? dsk_app.c
字號:
/* ------------------------函數代碼 ----------------------------- */
/*
* initMcbsp()
* 使用前面定義的McBSP結構配置初始化McBSP
*/
void initMcbsp()
{
/* 打開McBSP1*/
hMcbsp1 = MCBSP_open(MCBSP_DEV1, MCBSP_OPEN_RESET);
/* 配置McBSP1 */
MCBSP_config(hMcbsp1, &mcbspCfg1);
/* 啟動McBSP */
MCBSP_start(hMcbsp1, MCBSP_XMIT_START | MCBSP_RCV_START |
MCBSP_SRGR_START | MCBSP_SRGR_FRAMESYNC, 220);
MCBSP_start(hMcbsp0, MCBSP_XMIT_START | MCBSP_RCV_START |
MCBSP_SRGR_START | MCBSP_SRGR_FRAMESYNC, 220);
}
/*
* initIrq()
* 使用芯片支持庫初始化、使能DMA接收中斷
* 該中斷的中斷服務例程是edmaHwi().
*/
void initIrq(void)
{
/* CPU使能 EDMA 中斷 */
IRQ_clear(IRQ_EVT_EDMAINT); // 清除掛起的 EDMA 中斷
IRQ_enable(IRQ_EVT_EDMAINT); // 使能EDMA中斷
}
/*
* initEdma()
* 初始化EDMA控制器
* 使用連接地址傳輸,自動在PING、PONG緩沖區間交互傳輸
*/
void initEdma(void)
{
/* 配置接收通道 */
hEdmaRcv = EDMA_open(EDMA_CHA_REVT1, EDMA_OPEN_RESET); // 獲得 hEdmaRcv 句柄、復位通道
hEdmaReloadRcvPing = EDMA_allocTable(-1); // 獲得 hEdmaReloadRcvPing 句柄
hEdmaReloadRcvPong = EDMA_allocTable(-1); // 獲得 hEdmaReloadRcvPong 句柄
gEdmaConfigRcv.src = MCBSP_getRcvAddr(hMcbsp1); // 設置EDMA傳輸的源地址是 McBSP1 數據接收寄存器
gRcvChan = EDMA_intAlloc(-1); // 獲得一個傳輸結束代碼
gEdmaConfigRcv.opt |= EDMA_FMK(OPT,TCC,gRcvChan); // 設置傳輸結束代碼給 gRcvChan
EDMA_config(hEdmaRcv, &gEdmaConfigRcv); // 配置寄存器
EDMA_config(hEdmaReloadRcvPing, &gEdmaConfigRcv); // Ping重新加載
gEdmaConfigRcv.dst = EDMA_DST_OF(gBufferRcvPong); //改變EDMA配置的目的地址為Pong
EDMA_config(hEdmaReloadRcvPong, &gEdmaConfigRcv); // 重新加載Pong
EDMA_link(hEdmaRcv,hEdmaReloadRcvPong); // 連接寄存器 Pong
EDMA_link(hEdmaReloadRcvPong,hEdmaReloadRcvPing); // 連接地址 Pong 到 Ping
EDMA_link(hEdmaReloadRcvPing,hEdmaReloadRcvPong); // 連接地址 Ping 到 Pong
/* EDMA 控制器使能中斷 */
EDMA_intClear(gRcvChan); // 清除任何可能的偽中斷
EDMA_intEnable(gRcvChan); // 使能EDMA 中斷 (CIER)
EDMA_enableChannel(hEdmaRcv); // 使能 EDMA 通道
/* 通過Mcbsp寫的偽操作產生第一個 McBSP 傳輸事件 */
MCBSP_write(hMcbsp1, 0);
}
/* ---------------------- 中斷服務例程 ----------------------- */
/*
* edmaHwi()
* EDMA 傳輸中斷服務例程
* 當一個完整的EDMA接收幀傳輸結束時觸發
* 通過在DSP/BIOS中配置
* Scheduling --> HWI --> HWI_INT8.
* 在編譯時edmaHwi()中斷服務例程 插入中斷向量表
* edmaHwi() 使用 DSP/BIOS Dispatcher發報機
* 保存寄存器狀態、確定中斷服務例程和其它DSP/BIOS 函數并存
*/
void edmaHwi(void)
{
static Int16 rcvdone = 0;//定義局部變量rcvdone
static Uint32 pingOrPong = PING; // 定義局部變量pingOrPong,指示PING、PONG緩沖區
if (EDMA_intTest(gRcvChan))//通道gRcvChan接收傳輸完成中斷
{
EDMA_intClear(gRcvChan);//清楚通道gRcvChan傳輸完成標志
rcvdone = 1;//傳輸完成標志變量置1
}
/* 如果傳輸結束, 將處理軟件中斷 processBufferSwi */
if (rcvdone)//傳輸完成
{
if (pingOrPong==PING)//當前是PING緩沖區
{
SWI_or(&processBufferSwi, PING);//啟動軟件中斷processBufferSwi
//向mailbox 發送PING=0
pingOrPong = PONG;//緩沖區狀態賦值PONG
} else
{
SWI_or(&processBufferSwi, PONG);//啟動軟件中斷processBufferSwi
//向mailbox 發送PONG=1
pingOrPong = PING;//緩沖區狀態賦值PING
}
rcvdone = 0;//傳輸完成標志變量清零
}
}
/* ------------------------------- 線程 ------------------------------ */
/*
* demodulateAM()
* AM信號解調程序
* 將一個緩沖區(inBuf)中的數據(I、Q信號)解調算法處理
* 處理后數據存(outBuf)
*/
/*
* AM解調程序
* 程序中調用了函數庫fastrts67x.lib中
* 乘方匯編函數powsp(),開方匯編函數sqrtsp()
*/
/* inBuf存取I、Q信號緩沖區,16位,緩沖區大小1024 */
/*outBuf存取解調后數據緩沖區,32位,緩沖區大小512*/
void demodulateAM(INT16 *inBuf,Uint32 *outBuf,INT16 Length)
{
INT16 i;
Uint32 TempBuf;
for(i=0;i<=Length;i+2)
{
TempBuf=powsp(inBuf[i],2);
TempBuf=+powsp(inBuf[i+1],2);
*outBuf[i/2]=sqrtsp(TempBuf);
}
}
/*
* processBuffer()
* 軟件中斷processBufferSwi的線程
* 處理接收緩沖區gBufferRcvPing、gBufferRcvPong數據
*/
void processBuffer(void)
{
Uint32 pingPong;
/* 讀取mailbox中由edmaHwi()中斷發送的內容 */
pingPong = SWI_getmbox();
/*處理接收緩沖區gBufferRcvPing、gBufferRcvPong數據 */
if (pingPong == PING) //處理PING緩沖區中數據
{ /* 指示燈LED #3 閃爍 */
DSK6713_LED_toggle(3);
/* 處理PING 緩沖區數據 */
demodulateAM(gBufferRcvPing, gBufferXmtPing, BUFFSIZE);
}
else {//處理PONG緩沖區中數據
/* 指示燈LED #2 閃爍 */
DSK6713_LED_toggle(2);
/* 處理POING 緩沖區數據 */
demodulateAM(gBufferRcvPong, gBufferXmtPong, BUFFSIZE);
}
}
/*
* 周期性線程blinkLED()
* 當DIP 開關 #0 按下時 ,指示燈LED #0每500毫秒閃亮一次
* 該線程在DSP/BIOS中配置
* Scheduling -->PRD --> PRD_blinkLed.
*/
void blinkLED(void)
{
/* 如果DIP 開關 #0 按下,指示燈 LED #0閃亮 */
if (!DSK6713_DIP_get(0))
DSK6713_LED_toggle(0);
}
/*
* 周期性線程load()
* 當DIP開關switch #1按下時,該線程仿真給225MHz 6713 20-25%虛負荷
* 該線程在DSP/BIOS中配置
* Scheduling --> PRD-->PRD_load.
* 該線程1毫秒執行一次
*/
void load(void)
{
volatile Uint32 i;
/* 如果DIP 開關 #1 按下,CPU執行一個for循環 */
if (!DSK6713_DIP_get(1))
for (i = 0; i < 30000; i++);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -