主题中讨论的其他部件: C2000WARE
工具/软件:Code Composer Studio
你好
我在尝试达到全局优化级别时遇到一些问题。 我正在开发一个音频应用程序,需要实时过滤和处理音频信号。 我在检查了本地优化功能是否正常后尝试了优化级别2,但它不起作用,因此我决定开始使用更少的代码进行优化。 我将所有内容都移动到一个脚本中,该脚本只会接收音频数据并将其发回,而不会进行处理,但我也无法达到全局优化级别。 我该怎么办? 这甚至是容易的吗? :P
我正在将外设浏览器套件与TMS320F2.8335万一起使用。 代码如下所示。
提前感谢
/////////////////////////////////////////////////////////////////////////////////////////////////
#include "PeripheralHeaderIncludes.h"
包含"Codec.h"
#include "DSP2833x_Device.h"
//音频数据传输
// AIC23_DSP_SPI_CONTING.c外部函数原型
void SPIA_init(void);
废除AIC23_INIT();
void SPIA_xmit (Int16 spiaTxData);
void InitMcbspGpio(void);
Int16 I;
extern void InitSysCtrl();
extern void InitPieCtrl();
void delay_loop();
//本文件中找到的函数的prototype语句。
void init_dma(void);
void init_mcbspa(void);
中断void local_D_INTCH1_ISR(void);//通道1 Rx ISR
中断void local_D_INTCH2_ISR(void);//通道2 Tx ISR
#pragma data_section(ping_buffer,"DMARAML5");//在DMA RAM L5.
#pragma data_section (pong_buffer,"DMARAML5");
UINT32 ping_buffer[1024];// 请注意,使用的是UINT32,而不是UINT16
UINT32 PONG_BUFFER[1024];
UINT32 * L_CHANNEL =&PING_BUFFER[0]; //此指针指向任一缓冲区中L-C数据的开头
UINT32 * R_CHANNEL =&PING_BUFFER[512];// 此指针指向任一缓冲区中R-C数据的开头
UINT32 ping_buffer_offset =(UINT32)&ping_buffer [0];
UINT32 pong_buffer_offset =(UINT32)&pong_buffer [0];
UINT16 FIRST_INTERRUPT = 1; // 1表示第一个中断
UINT32 K2 = 0;
Void主(void)
{
EALLOW;
//步骤1. 初始化系统控制:
// PLL,看门狗,启用外设时钟
InitSysCtrl();
//步骤2. 初始化GPIO:
//在此示例中,为McBSP操作启用GPIO引脚。
InitMcbspGpio();
ffor (k2=0;k2<1024;k2++){ ping_buffer[k2]= 0xDEADDEADDEAD;}
对于(K2=0;K2<1024;K2+){ pong_buffer[K2]= 0xDEADDEADDEAD;}
//步骤3. 清除所有中断并初始化PIE矢量表:
//禁用CPU中断
色调;
//将PIE控制寄存器初始化到其默认状态。
//默认状态是禁用所有PIE中断和标志
//被清除。
//此函数位于DSP2833x_PIECTRL.c文件中。
InitPieCtrl();
EALLOW;
dint; //再次禁用中断(目前)
//禁用CPU中断并清除所有CPU中断标志:
IER = 0x0000;
IFR = 0x0000;
//步骤4. 初始化外围设备
ping_bufer_offset++; //从位置1开始(从位置1开始的32位r/w,然后是0)
pong_bufer_offset++; //从位置1开始(从位置1开始的32位r/w,然后0)
SPIA_INIT();// 初始化
AIC23_init();// 设置AIC23
init_dma();// 在McBSP之前初始化DMA,以便DMA可以传输McBSP数据
init_mcbspa(); //初始化McBBSP-a
delay_loop();
EALLOW;
DmaRegs.CH1.control.bit.run = 1;//在信道1上启动Rx
PieVectorTable.DINTCH1 =&LOCAL_D_INTCH1_ISR;
PieVectorTable.DINTCH2 =&LOCALE_D_INTCH2_ISR;
PieCtrlRegs.PIECTRL.bit.ENPIE =1;// 从PIE块中启用矢量提取
PieCtrlRegs.PIEACK.ALL = 0xFF; //启用PIE将脉冲驱动到CPU
//可以在以下中断行中断言中断
PieCtrlRegs.PIEIER7.bit.INTx1 = 1; //启用INT7的INT.1 (DMA通道1)
PieCtrlRegs.PIEIER7.bit.INTx2 = 1; //启用INT7的INT.2 (DMA通道2)
IER || 0x0040; //启用 INT7
EINT; //中断的全局启用
EDIS;
而(1){
}// 代码始终在此处循环
}
//===========================================================================================================================================
// main()结束
//===========================================================================================================================================
/ 7.1 -
中断void local_D_INTCH1_ISR(void) // DMA通道1 - McBSPA-A Rx
{
EALLOW;
IF (FIRST_INTERRUPT = 1)//不需要处理(发生B/c中断)
{// 在DMA传输到ping缓冲区开始时-尚未收到数据)
first_interrupT=0;//关闭标志并退出中断
}否则
{
//在此处对缓冲数据执行任何所需的处理
//完成后,切换到另一个缓冲区
DmaRegs.CH2.control.bit.run = 1;//在CH1完成ping缓冲后在CH2上启动TX
}
//当DMA开始在ping缓冲区上工作时,设置阴影寄存器
// 下一次在pong缓冲区开始,反之亦然
IF (DmaRegs.CH1.DST_ADDR_shadow == ping_bufer_offset)
{
DmaRegs.CH1.DST_ADDR_shadow = pong_buy_offset;
DmaRegs.CH1.DST_beG_ADDR_shadow = pong_buy_offset;
}
否则
{
DmaRegs.CH1.DST_ADDR_shadow = ping_bufer_offset;
DmaRegs.CH1.DST_beG_ADDR_shadow = ping_buy_offset;
}
//要从此PIE组接收更多中断,请确认此中断
PieCtrlRegs.PIEACK.ALL = PIEACK_group7;
EDIS;
}
/ 7.2
中断void local_D_INTCH2_ISR(void) // DMA通道2 - McBSPA-A Tx
{
EALLOW;
//当DMA开始在ping缓冲区上工作时,设置阴影寄存器
// 下一次在pong缓冲区开始,反之亦然
IF (DmaRegs.CH2.SRC_ADDR_shadow == ping_bufer_offset)
{
DmaRegs.CH2.SRC_ADDR_shadow = pong_buy_offset;
DmaRegs.CH2.SRC_beG_ADDR_shadow = pong_buy_offset;
}
否则
{
DmaRegs.CH2.SRC_ADDR_shadow = ping_bufer_offset;
DmaRegs.CH2.SRC_beG_ADDR_shadow = ping_bufer_offset;
}
PieCtrlRegs.PIEACK.ALL = PIEACK_group7;//要接收来自此PIE组的更多中断,请确认此中断
EDIS;
}
void init_dma()
{
EALLOW;
DmaRegs.DMACTRL.bit.hardreset = 1;
ASM (" NOP");
DMARegs.PRIORITYCTRL1.bit.CH1PRIORITY = 0;
DmaRegs.CH1.burst_size.all = 1; // 2 16位字/连字符(每个RRDY 1个32位字)-内存地址内部被1碰撞
DmaRegs.CH1.SRC_burst_step = 1; //必须先读取DRR2,然后再读取DRR1。 增量为1。 因此,值为+1。 (这是2的C #)
DmaRegs.CH1.DST_STUST_STEP =-1; //将DRR2数据复制到地址N+1,将DRR1数据复制到N Hence -1 (32位读取=将addr N+1读取为MSB,然后将N读取为LSB)
DmaRegs.CH1.transfer_size =1023; //每1024 (n+1)个脉冲中断一次。 McBSP仅处理16位数据(DRR2和DRR1是16位寄存器)
DmaRegs.CH1.SRC_TRANSFER_STEP =-1;//在处理完突发数据后,将源地址从DRR1重新减至DRR2
DmaRegs.CH1.DST_TRANSFER_STEP =1025;//复制L-C数据后,在给定缓冲区中向下移动到R-C数据
DmaRegs.CH1.SRC_ADDR_shadow =(UINT32)&McbspaRegs.DR2.all; //首先从DRR2读取
DmaRegs.CH1.SRC_beG_ADDR_shadow =(UINT32)&McbspaRegs.DR2.all;
DmaRegs.CH1.DST_ADDR_shadow = ping_buffer_offset; //首先写入ping_buffer[1]
DmaRegs.CH1.DST_beG_ADDR_shadow = ping_buy_offset;
DmaRegs.CH1.dst_wrap_size = 1; //左(1)后,然后右(2)后,返回到左缓冲区
DmaRegs.CH1.SRC_wrap_size = 0xffffff;//垂体大值。 我们永远不会来这里…
DmaRegs.CH1.dst_wrap_step =2;// 从起始地址下移2个16位地址以写入nxt 32位字
DmaRegs.CH1.control.bit.PERINTCLR = 1; //清除外设中断,同步和sycn错误标志
DmaRegs.CH1.control.bit.SYNCCLR = 1;
DmaRegs.CH1.control.bit.ERRCLR = 1;
DmaRegs.CH1.mode.bit.CHINTE =1; //通道中断启用
DmaRegs.CH1.MODE.bit.CHINTMODE =0; //在传输开始时生成中断
DmaRegs.CH1.mode.bit.PERINTE =1; //启用外设中断
DMARegs.CH1.MODE.Bit.PERINTSEL = 15; // McBSP MREVTA
DmaRegs.CH1.mode.bit.continuous = 1; //连续模式
DmaRegs.CH2.burst_size.all = 1; // 2 16位字/连字符(每个XRDY 1个32位字)-值内部被1递增
DmaRegs.CH2.SRC_burst_step =-1; //首先将地址N+1处的数据复制到DXR2,然后将地址N处的数据复制到DXR1。 因此-1
DmaRegs.CH2.DST_STUST_STEP = 1; // DXR2必须先写入,然后写入DXR1。 增量为1。 因此,值为+1。 (这是2的C #)
DmaRegs.CH2.transfer_size =1023; //每1024 (n+1)个16位字中断一次。 McBSP仍然只处理寄存器中的16位数据
DmaRegs.CH2.SRC_TRANSFER_STEP =1025;//复制L-C数据后,向下移动到给定缓冲区中的R-C数据
DMARegs.CH2.DST_TRANSFER_STEP =-1; //在处理完突发数据后,以1表示目标地址(DXR1返回DXR2)
DmaRegs.CH2.SRC_ADDR_shadow = ping_buffer_offset; //从ping_buffer[1]中首次读取
DmaRegs.CH2.SRC_beG_ADDR_shadow = ping_bufer_offset;
DmaRegs.CH2.DST_ADDR_shadow =(UINT32)&McbspaRegs.DXR2.all; //首先写入DXR2
DmaRegs.CH2.dst_beg_ADDR_shadow =(UINT32)&McbspaRegs.DXR2.all;
DmaRegs.CH2.SRC_wrap_size = 1; //左(1)后,右(2)后,返回到左缓冲区
DmaRegs.CH2.dst_wrap_size = 0xffffff; //垂体大值。 我们永远不会来这里…
DmaRegs.CH2.SRC_Wrap步骤=2;// 从起始地址下移2个16位地址,读取下一个32位字
DmaRegs.CH2.control.bit.PERINTCLR = 1; //清除外设中断,同步和同步错误标志
DmaRegs.CH2.control.bit.SYNCCLR = 1;
DmaRegs.CH2.control.bit.ERRCLR = 1;
DmaRegs.CH2.mode.bit.CHINTE =1; //通道中断启用
DmaRegs.CH2.mode.bit.CHINTMODE =0; //在传输开始时生成中断
DmaRegs.CH2.mode.bit.PERINTE =1; //启用外设中断
DmaRegs.CH2.mode.bit.PERINTSEL = 14; // McBSP MXEVTA
DmaRegs.CH2.mode.bit.continuous = 1; //连续模式
EDIS;
EALLOW;
DmaRegs.CH1.control.bit.run = 1; //启动通道1
EDIS;
}
void init_mcbspa()
{
EALLOW;
McbspaRegs.SPR2.all=0x0000; //重置FS生成器,采样率生成器和发送器
McbspaRegs.SPCR1.all=0x0000; //重置接收器,右对齐单词
McbspaRegs.SPCR1.bit.RJUST = 2; // DRR中左对齐单词和零填充LSB
McbspaRegs.MFFINT.all=0x0; //禁用所有中断
McbspaRegs.SPCR1.bit.RINTM =0; //配置McBSP中断
McbspaRegs.SPR2.bit.XINTM = 0;
McbspaRegs.RCR2.all=0x0; //单相帧,1字/帧,无压扩 (接收)
McbspaRegs.RCR1.all=0x0;
McbspaRegs.XCR2.all=0x0; //单相帧,1字/帧,无压扩 (传输)
McbspaRegs.XCR1.all=0x0;
McbspaRegs.RCR2.bit.RWDLEN2 = 5; // 32位操作
McbspaRegs.RCR1.bit.RWDLEN1 = 5;
McbspaRegs.XCR2.bit.XWDLEN2 = 5;
McbspaRegs.XCR1.bit.XWDLEN1 = 5;
McbspaRegs.RCR2.bit.RPHASE = 1; //双相帧
McbspaRegs.RCR2.bit.RFRLEN2 = 0; // Recv Frame length =第2阶段中的1个字
McbspaRegs.RCR1.bit.RFRLEN1 = 0; // Recv frame length =第1阶段中的1个单词
McbspaRegs.XCR2.bit.XPhase = 1; //双相帧
McbspaRegs.XCR2.bit.XFRLEN2 = 0; // Xmit帧长度=第2阶段中的1个字
McbspaRegs.XCR1.bit.XFRLEN1 = 0; // Xmit帧长度=第1阶段中的1个字
McbspaRegs.RCR2.bit.RDATDLY =1;// n = n位数据延迟(最大2)关键参数!!!
McbspaRegs.XCR2.bit.XDATDLY = 1; //如果LRP (AIC23)= 0,X/RDATDLY=0,如果LRP=1,X/RDATDLY=1
McbspaRegs.SRGR2.bit.FPER = 0x0002; //无关紧要
McbspaRegs.SRGR1.all=0x0001; //帧宽度= 1 CLKG周期,CLKGDV必须为1作为从属设备!!
// LSPCLK为SRG计时- SRG时钟必须至少为2倍外部数据转换时钟
McbspaRegs.pcr.all=0x0000; //外部生成帧同步,CLKX/CLKR驱动
McbspaRegs.pcr.bit.FSXM = 0; // FSX始终是一个I/p信号
McbspaRegs.pcr.bit.fSRM = 0; // FSR始终是一个I/p信号
McbspaRegs.pcr.bit.SCLKME = 0;
McbspaRegs.pcr.bit.fSRP = 0; // 1-FSRP处于活动状态低0-FSRP处于活动状态高
McbspaRegs.pcr.bit.fsXP = 0; // 0-FSXP处于活动低电平状态
McbspaRegs.pcr.bit.CLKRP = 1; //在CLKR上升沿采样的1-Rcvd数据
McbspaRegs.pcr.bit.CLKXP = 0; // 0-在CLKX的下降边缘采样Tx数据
McbspaRegs.SRGR2.bit.CLKSM = 1; // LSPCLK是SRG的时钟源
McbspaRegs.pcr.bit.CLKXM = 0; // 0-MCLKXA是由外部时钟驱动的I/p
McbspaRegs.pcr.bit.CLKRM = 0; // MCLKRA是一个I/p信号
McbspaRegs.SPR2.all |=0x00C0; //帧同步和采样率发生器已从重置中拉出
delay_loop();
McbspaRegs.SPR2.bit.XRST=1; //启用发射器
McbspaRegs.SPCR1.bit.RRST=1; //启用接收器
EDIS;
delay_loop();
}
void spia_init()
{
SpiaRegs.SPICCR.bit.SPISWRESET =0; //在复位时保持SPI
SpiaRegs.SPIFFTX.Bit.SPIRST =0; //在复位时保持两个FIFO
SpiaRegs.SPIFFRX.Bit.RXFIFORESET = 0; //在复位时保持RX FIFO
SpiaRegs.SPICCR.bit.SPICHAR = 15; // 16位字符
SpiaRegs.SPICCR.bit.CLKPOLARITY = 1; //下降沿输出
SpiaRegs.SPICCR.Bit.SPILBK = 0; //无环回
SpiaRegs.SPIBRR = 99; //波特率选择
SpiaRegs.SPICTL.bit.Master_slave = 1; //主模式
SpiaRegs.SPICTL.bit.CLK_PHASE =0; //无延迟
SpiaRegs.SPICTL.Bit.OVERRUNINTENA = 0; //禁用
SpiaRegs.SPICTL.Bit.Talk = 1; //启用TX
SpiaRegs.SPICTL.bit.SPIINTENA = 1; //启用中断请求
SpiaRegs.SPIPRI.Bit.free = 0; //设置为使brkpts不干扰xmission
SpiaRegs.SPIFFRX.Bit.RXFFIL = 1; //设置3字节后的标志rcv
SpiaRegs.SPIFFRX.Bit.RXFFINTCLR = 1; //清除任何虚假Int标志
SpiaRegs.SPIFFRX.Bit.RXFIFORESET =1; //从重置中释放RX FIFO
SpiaRegs.SPIFFTX.Bit.SPIRST =1; //从复位释放两个FIFO
SpiaRegs.SPIFFTX.Bit.SPIFFENA =0; //禁用FIFO功能
SpiaRegs.SPICCR.bit.SPISWRESET =1; //从重置释放SPI
}
void SPIA_xmit (Int16 spixData)
{
SpiaRegs.SPITXBUF = spiTxData;
而(SpiaRegs.SPISTS.bit.INT_flag !=1){}// 等待字符已转移
i = SpiaRegs.SPIRXBUF; //清除INT_FLAG
}
作废AIC23_INIT()
{
UINT16命令;
命令= reset();
SPIA_xmit (命令);
Command = softpowerdown (); //关闭除设备和时钟之外的所有设备
SPIA_xmit (命令);
命令= linput-volctl (LIV); //取消左行输入静音并保持默认音量
SPIA_xmit (命令);
命令= rinput_volctl (RIV); //取消右线路输入静音并保持默认音量
SPIA_xmit (命令);
Command = Lhp_volctl (LHV); //左耳机音量控制
SPIA_xmit (命令);
命令= rhp_volctl (RHV); //右侧耳机音量控制
SPIA_xmit (命令);
#IF MIC
命令= aaudpath();
#否则
命令= nomicaaudpath();// 打开DAC,静音麦克风
#endif
SPIA_xmit (命令);
命令= digaudiopath();// 禁用DAC静音
SPIA_xmit (命令);
命令= DSPdigaudinterface(); // AIC23主模式,DSP模式,32位数据,LRP=1与XDATADLY=1匹配
SPIA_xmit (命令);
Command =USBsampleratecontrol (SRUSB44_1);// 12 MHz USB时钟- 44.1 MHz采样率(USB模式)
SPIA_xmit (命令);
命令= digact();// 激活数字接口
SPIA_xmit (命令);
#IF MIC
命令= fullpowerup ();
#否则
Command = nomicpowerup (); //打开除Mic之外的所有功能。
#endif
SPIA_xmit (命令);
}
void InitMcbspGpio (void)
{
EALLOW;
GpioCtrlRegs.GPAMUX1.all = 0;// GPIO15... GPIO0 =一般性尸体I/O
GpioCtrlRegs.GPAMUX2.all = 0;// GPIO31... GPIO16 =通用I/O
gpioCtrlRegs.GPBMUX1.all = 0; // GPIO47... GPIO32 =通用I/O
gpioCtrlRegs.GPBMUX2.all = 0; // GPIO63... GPIO48 =通用I/O
GpioCtrlRegs.GPCMUX1.ALL =0;// GPIO79... GPIO64 =通用I/O
GpioCtrlRegs.GPCMUX2.all = 0;// GPIO87... GPIO80 =通用I/O
GpioCtrlRegs.GPAMUX2.bit.GPIO16 = 1; // AIC23的SPI-A SPISIMO "SDIN"
GpioCtrlRegs.GPAMUX2.bit.GPIO18 = 1; // AIC23的SPI-A SPICLK
GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 1; // AIC23的SPI-A SPISTE "/CS"
GpioCtrlRegs.GPAMUX2.bit.GPIO20 = 2; // McBBSP-A MDXA ,用于AIC23 "DIN"
GpioCtrlRegs.GPAQSEL2.bit.GPIO20 = 3; //仅异步
GpioCtrlRegs.GPAMUX2.bit.GPIO21 = 2; // McBBSP-A MDRA ,用于AIC23 "DOUT"
GpioCtrlRegs.GPAQSEL2.bit.GPIO21 = 3; //仅异步
GpioCtrlRegs.GPAMUX2.bit.GPIO22 = 2; // McBBSP-A MCLKXA for AIC23 "BCLK"
GpioCtrlRegs.GPAQSEL2.bit.GPIO22 = 3; //仅异步
GpioCtrlRegs.GPAMUX2.bit.GPIO23 = 2; // McBBSP-A MFSXA for AIC23 "LRCIN"
GpioCtrlRegs.GPAQSEL2.bit.GPIO23 = 3; //仅异步
gpioCtrlRegs.GPBMUX2.bit.GPIO58 = 1; // McBBSP-A MCLKRA,用于AIC23 "BCLK"
gpioCtrlRegs.GPBMUX2.bit.GPIO59 = 1; // McBBSP-A MFSRA,用于AIC23 "LRCOUT"
gpioCtrlRegs.gpadir.all = 0;
gpioCtrlRegs.GPADIR.bit.GPIO9 = 1; //外围设备浏览器:GPIO9的LED LD1
gpioCtrlRegs.GPADIR.bit.GPIO11 = 1; //外围设备浏览器:GPIO11的LED LD2
GpioCtrlRegs.GPBDIR.ALL = 0; // GPIO63-32作为输入
GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1; //外围设备浏览器:GPIO34的LED LD3
GpioCtrlRegs.GPBDIR.bit.GPIO49 = 1; //外围设备浏览器:GPIO49的LED LD4
GpioCtrlRegs.GPCDIR.ALL = 0; // GPIO87-64作为输入
EDIS;
}
void delay_loop (void)
{
注册信息 ;
对于(I =0;I < 8;I++),{}//McBSP初始化中的延迟必须至少为2个SRG周期
}
//===========================================================================================================================================
//文件结束。
//===========================================================================================================================================