DSP整理

1.目前市场上DSP生产商主要有哪几个?

答:TI公司,AD公司, AT&T公司, MOTOROLA公司

 

2TIDSP产品主要有哪几大系列?各自主要的应用场合?

答:TI公司常用的DSP芯片可以归纳为三大系列:

 • TMS320C2000系列:TMS320C2xx/C24x/C28x等;高速实时数字化工控领域。

 • TMS320C5000系列:TMS320C54x/C55x等;    主要应用于通信领域。

 • TMS320C6000系列:TMS320C62x/C67x/C64x。 主要面向数字通信和音频领域

 

3. 进行DSP开发时,需要哪些软硬件工具?

答:电脑、CCS集成开发环境软件、仿真器、开发板

 

4C55x C语言中,char 、 shortlongfloat等关键字定义的数据类型占用几个字节?

答:char2个字节16位,short2个字节16位,long4个字节32位,float4个字节32位。

 

C语言访问DSP内存:*unsigned int*0x1000=a/a的值写入数据空间1000h的地址   b=*unsigned int*0x1000/读出1000h地址赋予b

 

5. 将0x5555写入地址为0x400001的单元,该如何编写程序?

答:*unsigned int *0x400001 = 0x5555;

 

6. C55x C语言中,interrupt, IO port, volatile等关键字代表什么含义?.

答:interrupt放在函数前面,用来指定某个函数为中断函数;

IO port定义变量,用来支持I/O寻址模式;

Volatile定义变量时用来防止编译器对此变量引用的优化;

 

7. 一个典型的DSP最小系统主要有哪些组成部分?

答:包括DSP芯片、程序存储器、数据存储器、ADCDAC、抗混叠滤波器、平滑滤波器、逻辑控制电路(通常用CPLD 或 FPGA 实现)、电源变换电路、时钟电路和复位电路等。

 

 

 

 

 

 

 

ioport unsigned int *IODIR  = (unsigned int *)0x3400;

ioport unsigned int *IODATA  = (unsigned int *)0x3401;

 

*IODIR  =  0x00;    // 把端口方向设为输入

uTmp =  *IODATA;  //  把端口的数据读入

 

*IODIR  =  0xFF;    // 把端口方向设为输出

*IODATA = 0x00;    // 输出0,即低电平

.IVPDIVPHIER等寄存器配置

 

寄存器

功能

IVPD

指向DSP中断向量(IV0~IV15以及IV24~IV31)

IVPH

指向主机中断向量(IV16~IV23)

IFR0,IFR1

可屏蔽中断标志

IER0,IER1

使能或禁止可屏蔽中断

DBIER0,DBIER1

选择配置可屏蔽中断为时间重要中断

 

8. 要求能按照要求熟练编写程序:

a) 中断初始化程序                         b)中断服务程序

 

 

 

 

 

 

 

 

 

 

 

 

10. CLKMOD寄存器的配置及PLL初始化程序设计   公式:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

9. 定时器相关寄存器配置及初始化程序设计

• ADCCLKCTLADCCLKDIV寄存器的配置,AD初始化程序设计

• AD转换程序设计

 

PLL_Init(132);

void InitADC()

{

ADCCLKCTL=0x23; // 4MHz ADCLK

ADCCLKDIV=0x4f00;

}

for ( i=0;i<256;i++ )

 {

ADCCTL=0x8000; // 启动AD转换,通道0

do

{

uWork=ADCDATA;

} while ( uWork&0x8000 );

nADC0[i]=uWork&0x0fff;

}

for ( i=0;i<256;i++ )

{

ADCCTL=0x9000; // 启动AD转换,通道1

do

{

uWork=ADCDATA;

} while ( uWork&0x8000 );

nADC1[i]=uWork&0x0fff;

}

 

• 扩展存储空间的地址计算

字地址包含两个字节地址

一般程序用字节地址编址 数据用字地址编址

地址算法:起始地址+0x000002=等于下个地址

• 5509的存储空间结构

    书本P52 2-26329页图10-7

MEMORYSECTION指令的作用是什么?

答:MEMORY:用户声明的整个系统里的存储器资源,SECTION:物理存储器分配

 

• COFF目标文件通常包括哪些段?

• 基本部分

• .text——可执行代码

• .data——初始化数据

• .bss——未初始化的变量

• 常见部分

• .switch

• .const

• .cinit

• 用户自己定义部分

• .sect ".vectors"

• 理解cmd文件:

MEMORY

{

DARAM: org= 000100h, len = 8000h //org是起始地址,len是长度

SARAM: org= 010000h, len = 8000h

}

 

§ 1、只能是地址范围内的非保留的地址

Ø 如不能超过0x000000~0xFFFFFF,而且0x000001不能用

§ 2、不能有任何重叠

§ 3、必须与电路板的实际情况相结合

 

SECTIONS

{

vars :> DARAM

table: > SARAM

.text:> SARAM

}

例程:

MEMORY

{

 PAGE 0:

    PROG0(RWX)    : origin = 04000h   length = 08000h

    P_VECT(RIX)   : origin = 0FF80h   length = 00080h

 PAGE 1:

    DATA0(RW)     : origin = 0C000h   length = 04000h

 

SECTIONS

{

 

  .vectors              : { } > P_VECT      PAGE 0

  .text                 : { } > PROG0       PAGE 0

  .cinit                : { } > PROG0       PAGE 0   

  .csldata                      : { } > DATA0           PAGE 1

  .stack                : { } > DATA0       PAGE 1  

  .sysstack                             : { } > DATA0           PAGE 1

  .bss                  : { } > DATA0       PAGE 1   

  .cio                  : { } > DATA0       PAGE 1

  .const                : { } > DATA0       PAGE 1

  .sysmem               : { } > DATA0       PAGE 1  

  vecTable      align(512)   : { } > PROG0       PAGE 

 

• AIC23的主要功能?有哪些典型应用?

TI公司生产的一款高性能立体声音频编解码器

作为声卡芯片

• C55x 有哪几种引导方式?通过什么方法选择?

选择方法:

• 5509上电复位后从0xffff00开始执行程序(因为复位后IVPD的值是0xffff),

• 在0xffff00处是指令:.ivec 0xff8000,程序转入0xff8000处执行,

• 从0xff8000处开始就是5509内部固化的bootloader程序,

• 在这段程序里通过读取GPIO口的状态来转入不同的boot方式。 

引导方式:

1、直接从外部异步存储器执行

2EMIF并行引导模式

3EHPI引导模式

4、标准串行引导模式

5SPI EEPROM引导模式

6I2C EEPROM 引导模式

7USB引导模式

• 引导表结构及其具体含义

32-入口地址

计数寄存器配置

16-寄存器地址

16-寄存器内容

16-延迟标志

16-延迟长度

32-段长度

32-段起始地址

数据

数据

数据

数据

数据

数据

数据

数据

32-全零(引导表结束标志)

 

 

• IIR滤波器程序实现

– 二阶IIR滤波器程序

#include"math.h"

 

#define IIRNUMBER 2

#define SIGNAL1F 1000

#define SIGNAL2F 4500

#define SAMPLEF  10000

#define PI 3.1415926

 

float InputWave();

float IIR();

 

float fBn[IIRNUMBER]={ 0.0,0.7757 };

float fAn[IIRNUMBER]={ 0.1122,0.1122 };

float fXn[IIRNUMBER]={ 0.0 };

float fYn[IIRNUMBER]={ 0.0 };

float fInput,fOutput;

float fSignal1,fSignal2;

float fStepSignal1,fStepSignal2;

float f2PI;

int i;

float fIn[256],fOut[256];

int nIn,nOut;

 

main()

{

nIn=0; nOut=0;

fInput=fOutput=0;

f2PI=2*PI;

fSignal1=0.0;

fSignal2=PI*0.1;

// fStepSignal1=2*PI/30;

// fStepSignal2=2*PI*1.4;

fStepSignal1=2*PI/50;

fStepSignal2=2*PI/2.5;

while ( 1 )

{

fInput=InputWave();

fIn[nIn]=fInput;

nIn++; nIn%=256;

fOutput=IIR();

fOut[nOut]=fOutput;

nOut++; // break point

if ( nOut>=256 )

{

nOut=0;

}

}

}

 

float InputWave()

{

for ( i=IIRNUMBER-1;i>0;i-- )

{

fXn[i]=fXn[i-1];

fYn[i]=fYn[i-1];

}

fXn[0]=sin((double)fSignal1)+cos((double)fSignal2)/6.0;

fYn[0]=0.0;

fSignal1+=fStepSignal1; 

if ( fSignal1>=f2PI ) fSignal1-=f2PI;

fSignal2+=fStepSignal2;

if ( fSignal2>=f2PI ) fSignal2-=f2PI;

return(fXn[0]);

}

 

float IIR()

{

float fSum;

fSum=0.0;

for ( i=0;i

{

fSum+=(fXn[i]*fAn[i]);

fSum+=(fYn[i]*fBn[i]);

}

return(fSum);

}

• FIR滤波器程序实现

– 先进先出队列的C语言实现

– 求加权平均值

先进先出://移位

for( i=3; i > 0; i--)

{

x[i] = x[i-1];

}

 

//赋值

x[0] = x_in;

求加权平均值:

x_avr = 0;

float b[4]={0.1;0.2;0.3;0.4};

for( i = 0; i < 4; i++)

{

 x_avr += x[i]*b[i];

}

x_avr /= 4; 

 

• FFT程序实现

– 倒位序的程序实现

– 基本蝶形的程序实现

– 信号流图的程序实现

 

 

 

 

 

倒位序:

 

 

 

 

 

 

 

 

 

 

 

设一3位二进制数为 b2b1b0,则隐含的意思是:

(1) 这个二进制数等于

            b2 × 22 + b1 × 21 + b0 × 20

          如110 = 1 × 22 + 1 × 21 + 0 × 20

(2) b2的权为 22,b1的权为21,b0的权为20

倒位序就是将b2的权变成20,b1的权为21,b0的权为22

            b0 × 22 + b1 × 21 + b2 × 20

如110 变成011,只需获得1,1,0,再修改各位权值

void bit_rev(complex * X)

{

int b0 , b1, b2;

int invet_pos;

complex temp;

 

for( i = 1; i < 8;i++)

{

//求出下标的二进制数值

b0 = i & 0x01;

b1 = (i/2) & 0x01; 

b2 = (i/4) & 0x01;

 

//计算倒位序

invet_pos = b0*4 + b1*2 + b0*1;

 

//交换

if( i < invet_pos)

{

temp = X[i];

X[i] = X[invet_pos];

X[invet_pos] = temp

}

}

 

 

复数结构定义头文件:fcomplex.h

struct cmpx

{

float re;

float im;

};

typedef struct cmpx complex;

 

temp.re = X[id].re * U.re - X[id].im * U.im;  

temp.im = X[id].im * U.re + X[id].re * U.im;

//U就是WNr

X[id].re = X[i].re * scale - temp.re;

X[id].im = X[i].im * scale - temp.im;

 

X[i].re = X[i].re * scale + temp.re;

X[i].im = X[i].im * scale + temp.im;

 

信号流图

 

for(L=1;L<=3;L++) 

{

LE = 1 << L;   

LE1 = 1 << (L-1) ; 

U.re = 1.0;

         U.im = 0.;

for(j=0;j

         {

for(i=j;i<8;i+=LE) /*进行蝶形计算*/

             {

                      id=i+LE1;                 

                      temp.re = X[id].re * U.re - X[id].im * U.im;  

                      temp.im = X[id].im * U.re + X[id].re * U.im;

                      X[id].re = X[i].re * scale - temp.re;

                      X[id].im = X[i].im * scale - temp.im;

                      X[i].re = X[i].re * scale + temp.re;

                      X[i].im = X[i].im * scale + temp.im;

             }

             /*递推计算W^k*/

             temp.re = U.re*W[L-1].re - U.im*W[L-1].im;

             U.im = U.re*W[L-1].im + U.im*W[L-1].re;

             U.re = temp.re;

        }

}

/*  产生旋转因子表 */

    for (L=1; L<=M; L++)     

    {

        LE=1<

        LE1=LE>>1;        /* 子FFT中的蝶形运算数目*/

        W[L-1].re = cos(PI/LE1);

        W[L-1].im = -sin(PI/LE1);

    }    

 

• GEL语言程序设计

– CCS启动后,自动加载程序

– 利用GEL控制局部变量

1.GEL文件创建,保存,加载,移除

创建:

File菜单中,执行NewSource File

保存

File菜单中,执行Save AS

加载

File菜单中,执行Load GEL

移除

右键点击文件,执行Remove

2.如何将GEL函数加载到CCSGEL菜单 

hotmenu关键词

/*添加一级菜单*/

menuitem “GEL Welcome Tool" hotmenu 

/*添加二级菜单*/ 

hotmenu Welcome_Function() 

{
GEL_TextOut(“Welcome to GEL”);

}

dialog关键词 

menuitem "Set MyData Value"

dialog Set_MyData(MyDataVal "Load")

{

MyData = MyDataVal;

}

3. GEL函数

Debug(调试)

GEL_Animate() 开始动画执行DSP程序

GEL_Go(Address) 执行DSP程序到指定地址

GEL_Run(condition)开始执行DSP程序

GEL_Halt()停止正在执行的程序

GEL_RunF()——Run free

GEL_Restart()复位

 

Breakpoint(断点)

GEL_BreakPtAdd(address,”Condition”)

GEL_BreakPtDel(address)

 

程序加载类

GEL_Load();

GEL_SymbolLoad()加载制定目标文件的符号信息

 

Windows(窗口)

GEL_OpenWindow()

GEL_CloseWindw()

GEL_TextOut()

GEL_TargetTextOut()

GEL_Exit()

 

存储器类

GEL_MapAdd()

GEL_mapDelete();

GEL_MapOn()

GEL_MapOff();

GEL_MemoryRest()

GEL_MemoryFill()

GEL_MemoryLoad()

GEL_Memorysave()


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部