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