DSP整理
1.目前市场上DSP生产商主要有哪几个?
答:TI公司,AD公司, AT&T公司, MOTOROLA公司
2.TI的DSP产品主要有哪几大系列?各自主要的应用场合?
答:TI公司常用的DSP芯片可以归纳为三大系列:
• TMS320C2000系列:TMS320C2xx/C24x/C28x等;高速实时数字化工控领域。
• TMS320C5000系列:TMS320C54x/C55x等; 主要应用于通信领域。
• TMS320C6000系列:TMS320C62x/C67x/C64x。 主要面向数字通信和音频领域
3. 进行DSP开发时,需要哪些软硬件工具?
答:电脑、CCS集成开发环境软件、仿真器、开发板
4.C55x C语言中,char 、 short、long、float等关键字定义的数据类型占用几个字节?
答:char是2个字节16位,short是2个字节16位,long是4个字节32位,float是4个字节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芯片、程序存储器、数据存储器、ADC、DAC、抗混叠滤波器、平滑滤波器、逻辑控制电路(通常用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,即低电平
.IVPD、IVPH、IER等寄存器配置
寄存器 | 功能 |
IVPD | 指向DSP中断向量(IV0~IV15以及IV24~IV31) |
IVPH | 指向主机中断向量(IV16~IV23) |
IFR0,IFR1 | 可屏蔽中断标志 |
IER0,IER1 | 使能或禁止可屏蔽中断 |
DBIER0,DBIER1 | 选择配置可屏蔽中断为时间重要中断 |
8. 要求能按照要求熟练编写程序:
a) 中断初始化程序 b)中断服务程序
10. CLKMOD寄存器的配置及PLL初始化程序设计 公式:
9. 定时器相关寄存器配置及初始化程序设计
• ADCCLKCTL和ADCCLKDIV寄存器的配置,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-26或329页图10-7
MEMORY和SECTION指令的作用是什么?
答: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、直接从外部异步存储器执行
2、EMIF并行引导模式
3、EHPI引导模式
4、标准串行引导模式
5、SPI EEPROM引导模式
6、I2C EEPROM 引导模式
7、USB引导模式
• 引导表结构及其具体含义
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菜单中,执行New→Source File 保存 在File菜单中,执行Save AS 加载 在File菜单中,执行Load GEL 移除 右键点击文件,执行Remove 2.如何将GEL函数加载到CCS的GEL菜单 hotmenu关键词 menuitem “GEL Welcome Tool" hotmenu /*添加二级菜单*/ hotmenu Welcome_Function() { } 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()
/*添加一级菜单*/
GEL_TextOut(“Welcome to GEL”);
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!