DSP

DSP整理

2019-07-13 11:04发布

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滤波器程序实现 – 先进先出队列的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>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()