数字信号处理资料_第1页
数字信号处理资料_第2页
数字信号处理资料_第3页
数字信号处理资料_第4页
数字信号处理资料_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、一. DSP结构TMS320C55X的硬件结构CPU结构图P22C55x有1条32位的程序数据总线(PB), 5条16位数据总线 (BB、CB、DB、EB、FB)和1条24位的程序地址总线及5条23 位的数据地址总线,12条独立总线,这些总线分别与CPU相连。总 线通过存储器接口单元(M)与外部程序总线和数据总线相连,实现 CPU对外部存储器的访问。这种并行的多总线结构,使CPU能在一 个CPU周期内完成1次32位程序代码读、3次16位数据读和两次16 位数据写。C55x根据功能的不同将CPU分为4个单元,即指令缓冲 单元(I)、程序流程单元(P)、地址流程单元(A)和数据计算单元 (D)o

2、C55x的CPU组成1)指令缓冲单元(I单元):书上P23图22 组成:32x16位指令缓冲队列;指令译码器。功能:接收程序代码并放入指令缓冲队列;由指令译码器解 释指令,再把指令流传给其它的工作单元.指令缓冲队列:每个机器周期,PB从程序空间传送32位的程序代码至I 单元的指令缓冲队列;最大可以存放64个字节的待译码指令,可以执 行块循环指令,具有对于分支、调用和返回指令的随机处理能力。.指令解码器:当CPU准备译码时,6个字节的代码从队列发送到I单 元的指令译码器;能够识别指令边界,译码8、16、24、32、40和48位 的指令,决定2条指令是否并行执行,将译码结果和立即数送至P单 元、A

3、单元、D单元2)程序流单元(P单元)组成:程序地址发生器;程序控制逻辑功能:产生所有程序空间地址,并送到PAB总线1. P单元:产生程序空间地址,并加载地址到PAB;控制指令流顺序 2.程序地址产生逻辑:产生24位的程序空间取指的地址;可产生顺序地址;也 可以I单元的立即数或D单元的寄存器值作为地址3.程序控制逻辑:接收来自1单元的立即数,并测试来自A单元或D单 元的结果从而执行如下动作:测试条件执行指令的条件是否成立,把 测试结果送程序地址发生器;当中断被请求或使能时,初始化中断服 务程序;控制单一指令重复或块指令重复;管理并行执行的指令3)地址-数据流单元(A单元):图24组成:数据地址产

4、生电路 AGEN);附加16位ALU和1 组寄存器功能:产生读/写数据空间地址,并送到BAB、CAB. DAB 总线LA单元算术逻辑电路:ALU可接收来自I单元的立即数或与存储器、I/O空间、 A单元寄存器、D单元寄存器和P单元寄存器进行双向通信。可完成 如下动作:加法、减法、比拟、布尔逻辑、符号移位、逻辑移位和绝 对值计算;测试、设置、清空、求补A单元寄存器位或存储器位域; 改变或转移寄存器值,循环移位寄存器值,从移位器向一个A单元寄 存器送特定值。2.数据地址产生器单元:DAGEN产生所有读写数据空间的地址。可接收来自I单元的 立即数或来自A单元的寄存器值;根据P单元指示,对间接寻址方式

5、时选择使用线性寻址还是循环寻址。4)数据运算单元(D单元)组成:1个40位的筒形移位寄存器(barrel shifter);2个乘加单元(MAC) ;1个40位的ALU;假设干寄存器。功能:CPU中最主要的局部,是主要的数据处理部件.存储器接口单元(M单元):是CPU和数据空间或I/O 空间.移位器:图25接收来自I单元的立即数,与存储器、I/O空间、D单元寄 存器、P单元寄存器、A单元寄存器进行双向通信;把移位结果送至D 单元的ALU或A单元的ALU;实现40位累加器值最大左移31位或最大右移32位;实现16 位寄存器、存储器或I/O空间数据最大左移31位或最大右移32位;实 现16位立即数

6、最大左移15位;提取或扩张位域,执行位计数;对 寄存器值进行循环移位;在累加器的值存入数据空间之前,对它们进行 取整/饱和处理。. D 单元 ALU:可从I单元接收立即数,或与存储器、I/O空间、D单元寄 存器、P单元寄存器、A单元寄存器进行双向通信,还可接收移位器的 结果;加法、减法、比拟、取整、饱和、布尔逻辑以及绝对值运算;在 执行一条双16位算术指令时,同时进行两个算术操作;测试、设置、 清除以及求D单元寄存器的补码;对寄存器的值进行移动。.两个MAC:可支持乘法和加/减法。在单个机器周期内,每个MAC可以进 行一次17x17位小数或整数乘法运算和一次带有可选的32或40位饱 和处理的4

7、0位加/减法运算。MAC的结果送累加器;MAC接收来自 I单元的立即数,或来自存储器、I/O空间、A单元寄存器的数据,和D单元寄存器、P单元寄存器进行双向通信;MAC的操作会影响P单 元状态寄存器的某些位。 指令流水线:见书本P25页DSP器件的六个特点:哈佛结构,多总线结构,流水线技术, 硬件乘法器,多处理单元结构,嵌入式功能。冯诺依曼结构:程序和数据共用同一套总线,对程序和数据需要分时读写, 执行速度慢,数据吞吐量低,计算机结构简单,不适于进行高速度的 数字信号处理。哈佛结构:程序、数据具有独立的存储空间,有独立的程序总线和数据 总线,可同时对程序和数据进行寻址和读写访问,执行速度高,数据

8、 吞吐量大,计算机结构复杂,非常适于进行高速的数字信号处理。流水线技术,4级流水线分别为:取指令,译码,取数,执行。DSP复位后程序指针指向FF8000H放置着bootloader (引导程序)数据空间为128页每页64k在DSP中有符号,无符号,短整型,整型都是16位。loport类型的指针只有16位CJntOO为C/C+的程序入口地址中断物理地址模型:IVPD(16位):ISP(5位):000(保存)IVPD(16位):中断指针地址+ISP(5位):中断序列号(32个中断) 复位后IVPD(16位户FFFF00H32个中断分为:不可屏蔽中断如:软件中断(指令),硬件中 断(NMLRESET

9、)可屏蔽中断INIM全局中断位IER局部中断位 ISR中断服务程序;IFR中断标志程序CPU中有96个寄存器C55x的存储(数据/程序)空间统一编址,CPU读取程序 代码时,使用24位地址访问相关字节,CPU读写数据时,使 用23位地址访问相关字,两种情况下地址总线上均为24位, 只是数据寻址时地址总线上的最低位强制填充0C55x存储空间(总共为16M字节或8M字)的划分:128个 主页面(0127),每个主页面为64K字,主页面0的前192 个字节或96个字(00 0000hOOOOBFh)被MMR所占用 CPU使用字地址访问数据空间字地址为23位的,寻址16位的数据,地址线为24位的, 当

10、CPU读/写数据空间时,23位的字地址最低位补一个0成为 总地址。例:字地址:00000000000000100000010地址线:()00000000000001000000100I/O空间和程序/数据空间是分开的,只能用来访问DSP外 设上的寄存器I/O空间里的字地址宽度是16位,可以访问64K个地址 对于I/O空间的读写是通过数据读总线DAB和数据写总线 EAB进行的,读写时要在16位地址前补0例。设一条指令从16位地址。102h处读取一个字,那么 DAB传输的24位地址为()0 0102h。汇编语言的设计COFF目标文件通常包括3个默认段,即.text段,通常包含可执行代码.data段

11、,通常包含初始化数据.bss段,通常为未初始化变量保存存储空间汇编器通过段伪指令自动识别各个段,并将段名相同的 语句汇编在一起;汇编器有5条伪指令可以识别汇编语言程序 的各个不同段.text、.data、.sect创立初始化段.bss和.usect创立未初始化段.sect与.usect创立自定义段和子段C编译器生成的段C编译器生成的段有两种基本的类型:初始化段和未初始化段 初始化段有:.cinit段:包含初始化数据表格和常数.pinit段:包含实时运行时调用的数据表格.const段:包含用const定义(不能同时被volatile定义)的 字符串常量和数据.switch段:包含switch语句

12、所用表.text段:包含所有可执行代码未初始化段保存了存储器空间,一段程序可以在运行期间使用 这个空间来生成和存储变量:.bss段:为全局和静态变量保存了空间。在启动和装载的时候, C启动程序或装载程序从.cinit段(通常在ROM中)复制数 据并用这些数据来初始化.bss段中的变量.stack段:为C系统堆栈分配存储地址。这个存储地址用来传 递变量和局部存储.sysmcm段:为动态存储分配保存空间。这个空间被malloc、 calloc和realloc函数调用。如果C程序不使用这些函数,编 译器就不会创立.sysmem段.cio段:支持C I/Oo这个空间用来作为标签为_CIOBUF_ 缓冲

13、区。当任何类型的C I/O被执行(如printf和scant),就);extern void Mcbsp_Config(MCBSP_Handle handle) (MCBSP_config(handle,&McbsplConfig);MCBSP_start( handle,MCBSP_RCV_START |MCBSP_XMIT_START,O); )4) I2C.c#include I2C_Setup Setup = 0, 7 bit地址模式0 x0000,自己的地址60,输出频率MHZ400, 10400之间的数字0,/ 8 bits/byte 传输0,DLB窥式关闭0 FREE模式关闭);

14、void MyI2C_setup(I2C_Setup *Init) int old_intni;Uintl6IPSC_calc;oldjntm = IRQ_gIobalDisahle();/*蒋下面的irs域作了修改,让nc模块处于复位状态,然后进行时钟 的配置*/I2C_RSET(I2CMDR,I2C_I2CMDR_RMK(Init-free,0A0J,1Jnit-a ddrmode,OJnit-dIb,OAOJnit-bitbyte); /* 设置自己地址 */ I2C_RSET(I2COAR,Init-ownaddr); 如果是从机,需要确认自己地址 /*计算IPSC值为IPSC_cal

15、c = (Init-sysinclock)/12; /* 一定要是正确的值 */ I2C_RSET(I2CPSC,IPSC_calc);I2C_RSET(I2CCLKL,15); /* 计算 ICCLKL and ICCLKH 寄存器值*/ I2C_RSET(I2CCLKH,15);I2C_FSET(I2CMDRJRS,1); /* 使能 HC 模块 */ IRQ_globalRestore(old_intm);Int MyI2C_VVrite(Uintl6*data,intlength,intmaster,Ui nt 16slaveaddress J nt transfermode,int

16、timeout) intint oldjntm;Uintl6 temp=l;/oldjntm = IRQ_gIobalDisable();I2C_FSET(I2CMDR,TRX,1); /*设置传输模式 */ 12C_RSET(I2CCNT,length); /* 设置计数寄存器刃 if (master=l) (I2C_RSET(I2CSAR,slaveaddress); /* specify slave address */ I2C_FSET(I2CMDR,MST,1); /* turn master mode on */ if (transfermode=l)/* 设置传输模式*/* S-

17、A-D.(n).D-P mode */I2C_FSET(I2CMDR,RM,0); I2C_FSET(I2CMDR,STP,1); ) else if (transfermode=2) /* S-A-D.(n).D mode (repeat n times)*/I2C_FSET(I2CMDR,RM,0);I2C_FSET(I2CMDR,STP,0);)else if (transfermode=3)/* S-A-D-D-D . (repeat continuous) mode */I2C_FSET(I2CMDR,RM,1);I2C_FSET(I2CMDR,STP,0); else /* if

18、user specifies something else, go to idle mode */I2C_FSET(I2CMDR,RM,0);I2C_FSET(I2CMDR,STP,0);) 主机结束 else(I2C_FSET(I2CMDR,MST,0); /* if not master, set to slave */ ) oldjntm = IRQ_globalDisable();for (i=0;i=timeout)/* bus busy timeout error */IRQ_globalRestore(old_intni); return 1;)for (m=0; ni=ti m

19、eout)(/I RQ_globalRestore( oldjntm);return 2;/* time out for transmit DXR ready */)I2C_RSET(I2CDXR,*data+); /* put first data value in DXR*/I2C_FSET(I2CMDR,STT,1); /* generate start condition */ for (k=l;klength;k+) /* enter main loop for transmitting data */ for (i=0;i2000;i+)for(j=0;j10()0;j+)/* d

20、elay loop */ asm (M NOP );for (|=0;l=timeout)(/IRQ_globalRestore(old_intm);return 3; /* No acknowledge bit is set, NACK error */ )for (m=0;m=ti meout)(/I RQ_globalRestore( oldjntm);return 4;/* time out for transmit DXR ready */I2C_RSET(I2CDXR,*data+); /*put next data value in DXR */* 结束 loop */for (

21、j=();j10;j+) /* last delay loop for last data transferred*/for (i=0;i32000;i+) asm ( NOP”); )for (l=();l=timeout)(/I RQ_globaI Restore( old_i nt m);return 5;/* No acknowledge bit is set, NACK error */IRQ_globalRestore(old_intm);return 0; /* HC的写操作结束*/void 12C_cofig(void)(/ Initialize I2C, Using para

22、meters in I2C_Setup structure MyI2C_setup(&Setup);)int MyI2C_Read(Uintl6*data,intlength,int master,Uintl6slaveaddress,int transfermode,int timeout, int checkbus)(intint oldjntm;Uintl6 temp;/oldjntm = IRQ_globalDisable();/*饭置接收模式,/I2C_FSET(I2CMDR,TRX,0);if (master=l)(I2C_RSET(I2CSAR,slaveaddress); /*

23、 specify slave address */I2C_FSET(I2CMDR,MST,1); /* turn master mode on */ if (transfermode=l) /* 设置传输模式 */ /* S-A-D.(n).D-P mode */I2C_FSET(I2CMDR,RM,0);I2C_FSET(I2CMDR,STP,1);I2C_RSET(I2CCNT,length);/ICCNT 寄存器设置计数值)else if (transfermode=2)/* S-A-D.(n).D mode (repeat n times)*/I2C_FSET(I2CMDR,RM,0)

24、;I2C_FSET(I2CMDR,STP,0);else if (transfermode=3)/* S-A-D-D-D . (repeat continuous) mode */I2C_FSET(I2CMDR,RM,1);I2C_FSET(I2CMDR,STR,0);)else /* if user specifies something else, go to idle mode */I2C_FSET(I2CMDR,RM,0);I2C_FSET(I2CMDR,STP,0);) /*主机模式*/else(I2C_FSET(I2CMDR,MST,0); /* 非主机,设置为从机 */ /*建立

25、结束*/if (checkbus=l)(old_intm = IRQ_globalDisable();for (i=0;i=tinieout) /*线路忙超时准备*/return 1; /*线路忙结束*/I2C_FSET(I2CMDR,STT,1);for (i=0;i32000;i+) /* 延时 loop 接收数据 */ asm (* NOP); for (j=0;j=tinieout)return 2;/* DRR传输超时准备*/*data+ = I2C_RGET(I2CDRR); 将第一个数据放在 DXR 中 for (k=l;kiength;k+) /进入主循环接收数据*/ (for

26、 (i=0;i32000;i+) asm (* NOP); for (m=0;m=timeout)return 4;/* DRR传输超时准备*/*data+ = I2C_RGET(I2CDRR); /* 将下一个数据放 在 DXR */ /* 结束 loop */for (i=0;i32000;i+)/* loop 最后延时 */ asm (* NOP); /IRQ_globalRestore(old_intm);return 0; /*结束12读操作,/void Set_WorkMode(int Master, Uintl6 SlaveAddress, int Transfer Mode )

27、/* set in transmit mode */I2C_FSET(I2CMDR,TRX,1);I2C_RSET(I2CCNT,4); 设置 count register 长度设置为 4 */ if (Master = 1)(I2C_RSET(I2CSAR,SlaveAddress); /* 确认从机地址 */I2C_FSET(I2CMDR,MST,1); /* 开主机模式列if (TransferMode = 1)/* 设置传输模式 */* S-A-D.(n).D-P mode */I2C_FSET(I2CMDR,RM,0);I2C_FSET(I2CM D R,STP,1);)else i

28、f (TransferMode = 2)/* S-A-D.(n).D mode (repeat n times)*/I2C_FSET(I2CMDR,RM,0);I2C_FSET(I2CMDR,STP,0);)else if (TransferMode = 3)/* S-A-D-D-I) . (repeat continuous) mode */I2C_FSET(I2CMDR,RM,1);I2C_FSET(I2CMDR,STP,0);Ielse/*用户在做某事时候,设置为线路空闲*/I2C_FSET(I2CMDR,RM,0);I2C_FSET(I2CMDR,STP,0);)/* end if m

29、aster */else(I2C_FSET(I2CMDR,MST,0); /*非主机,那么设置为从机*/* end set up */int Judge_I2cStatus(int TimeOut)(unsigned int i, m;int old_intm;Uintl6 Temp = 1;oldjntm = I RQ_globalDisable();for (i = 0; i = TimeOut)/*线路忙超时错误*/IRQ_globalRestore(old_intm);return 1;)for (m = 0; m = TimeOut) (/IRQ_globalRestore(o!d_

30、intm);return 2;/* DXR传输超时准备*/ return 0;)int VVriteSigVVord_Dcal(int TimeOut) unsigned int i, j, 1, in;Uintl6 Temp = 1;for (i=0;i2000;i+) For(j=0;j1000;j+) /* loop 延时 */ asm(M NOP); for (l=0;l=TimeOut) (/IRQ_globalRestore(old_intm);return 3; /* No acknowledge bit is set, NACK error */ ) for (m=0;m=Ti

31、meOut)(/IRQ_globalRestore(oldJntm);return 4;/*传输DXR超时准备*/)return 0;) int LastBvte_Deal(int TimeOut) (int ij,l;Uintl6 Temp = 1;for(j=0;j10;j+)尸最后一个对传输字节loop延时*/ for (i = 0; i 32000; i+) asm (“ NOP); )for (l=0;l= TimeOut)(/IRQ_globalRestore(old_intin);return 5;/* 无确认,NACK 错误 */ return 0;)int MyI2C_Wri

32、teSigVVord(unsigned int OwnAdd, unsigned int data, int master, Uintl6 slaveaddress, int transfermode, int timeout) (unsigned int HighAdd, LowAdd;unsigned int HighByte, LowByte;int RetValue;HighAdd = (OwnAdd & 0 xFF()()8;Low Add = OwnAdd & OxOOFF;HighByte = (data & 0 xFF00)8;LowByte = data & OxOOFF;S

33、et_VVorkMode(master, slaveaddress, transfermode); 设置 I2C工作最/old_intm = IRQ_globalDisable();Ret Value = Judge_I2cStatus(timeout);if( Ret Value != 0)return( Ret Value);I2C_RSET(I2CDXR,HighAdd); /* 将第一个数据放在 DXR */I2C_FSET(I2CMDR,STT,1); /*产生开始环境刃Ret Value = VVriteSigWord_Deal(timeout);if(RetValue != 0)

34、return( Ret Value);I2C_RSET(I2CDXR,LowAdd); /* 将下一个数据放在 DXR */RetValue = VVriteSigWord_Deal(timeout);if( Ret Value != 0)return(RetValue);I2C_RSET(I2CDXR,HighByte); /*将下一个数据放在 DXR */RetValue = W riteSig Word_Deal(ti meout);if(RetValue != 0)return(RetValue);I2C_RSET(I2CDXR,LowByte);/*将下一个数据放在 DXR /Ret

35、Value = LastByte_Deal(timeout);if(RetValue != 0)return( RetValue);return 0;5) DEC5502_CODEC.c#include #include #include #include #include #include #include #include include ,5502_FLASH.hMinclude E2PROM_Function.h”include CODEC.h#undef CODEC.ADDR#defme CODEC_ADDR 0 x1 AUintl6 SourDatal65536=0;Uintl6

36、SourData2655361=0;Uintl6 SourData365536=0;Uintl6 OutDatal65536=0;Uintl6 OutData265536=0;Uintl6 OutData365536=0;#pragma DATA_SECTION (SourDatal J.AudioJn_data);#pragma DATA_SECTION (SourData2,”.Audio_in_data2);#pragnia DATA_SECTION (SourData3J.Aiidio_iii_data3”);#pragnia DATA_SECTION (OutDatal,M.Audi

37、o_out_datar,);#pragma DATA_SECTION (OutData2J.Audio_out_data2);#pragma DATA_SECTION (OutData3J.Audio_out_data3);#define AUDIOTRYOxAAOA/音频试访#define AUDIOCOPY0 xAA07音频存贮并回放#define TESTCOMMAND 2操作命令选择MCBSP_Handle hMcbsp; / 定义 McBSP 的句柄 void main(void) (Uintl6 DataTempLefl = 0; 暂存采样数据Uintl6 DataTempRigh

38、t = 0;Uintl6 i;Uintl6 TempData;Uintl6 TestComniand =0;CSL_init();初始化库#if TESTCOMMAND=1TestComniand =AUDIOTRY; 试听#endif#if TESTCOMMAND=2TestCommand =AUDIOCOPY; 录音并回放#endif/该频率是为了设置IIC模块的需要设置的,为了使用I2C_setup函数, 系统主频是240MHZPLL_setFreq(l, OxC, 0, 1, 3, 3, 0);Emif_Config();/EMIF 初始化hMcbsp=CBSP_open(MCBSP_

39、PORTl,MCBSP_OPEN_RESET);初始化McBSP端口 1,得到McBSP句柄Mcbsp_Config(hMcbsp); 初始化 McBSP 端口 1I2C_cofig();/IIC 的初始化 inti_AIC();/CODEC寄存器初始化 while(l) (switch(TestCommand)/*音频试听*/case AUDIOTRY: wliikf(!MCBSP_rr山(hMcbsp)。;/* 左通路数据以DataTempLeft = MCBSP_readl6(hMcbsp);while(!MCBSP_rrdy(hMcbsp);/* 右通路数据 */DataTempRig

40、ht = MCBSP_readl6(hMcbsp);while(!MCBSP_xrdy(hMcbsp) ;/*左声道耳机输出 */MCBSP_writel6(hMcbsp,DataTempLeft);while(!MCBSP_xrdy(hMcbsp) ;/*右声道耳机输出 */MCBSP_writel6(hMcbsp,DataTempRight);break;case AUDIOCOPY: /*音频存贮并回放*/ for(i=0;i65535;i+)/SourDatai = M CBSP_read 16( h Mcbsp);TempData=MCBSP_readl6(hMcbsp); Sour

41、Datal(i!=TenipData;for(i=0;i65535;i+)(while(!MCBSP_rrdy(hMcbsp);/SourDatai = MCBSP_readl6(hMcbsp);TempData=MCBSP_readl6(hMcbsp); SourData2i=TenipData;)for(i=0;i65535;i+)(while(!MCBSP_rrdy(hMcbsp);/SourDatai = MCBSP_readl6(hMcbsp);TempI)ata=MCBSP_readl6(hMcbsp); SourData3i=TempData;)for(i=0;i65535;i+

42、) OutDatali = SourDatali; for(i=0;i65535;i+) OutData2i = SourData2i; for(i=0;i65535;i+) OutData3i = SourData3iJ; for(i=0;i65535;i+)(while(!MCBSP_xrdy(hMcbsp) ;MCBSP_writel6(hMcbsp,OutDatali);)for(i=0;i65535;i+)(while(!MCBSP_xrdy(hMcbsp) ;MCBSPlwritel6(hMcbsp,OutData2i);)for(i=0;i65535;i+)(while(!MCB

43、SP_xrdy(hMcbsp) ;MCBSP_writel6(hMcbsp,OutData3i);)break;default:break;)AIC23结构图:VADC10XVDACVMID1.0XVMK)1.0XAGND1.5XDSPcodecTLV320AIC23B5HPVDO-*HPGND-*RHPOUTROUTLOUT1LHPOUTHVMCLKXTOCLKOUTDigital FiltersLine MuteControl InterfaceDigital Audio InterfaceLine MuteCLKK Divider (1x. 1/2x)CLKOUT Divider (仅他

44、x)12 to-34.5 dB.1.5 dB Steps412 to-34 dB.1.5 dB StepsHeadphone6 to -73 dB.Driver1 dB StepsRLINEMLLINEINI Bypass Mute. Mute o dB. 20 dBVADC-fSDINSCLKwhile(!MCBSP_rrdy(hMcbsp) ;一 DVDD-BVDDSide Tone Muteit-DGNDHeadphone6 to -73 dB.Driver1 dB StepsDINLRCOUTmain()IIC原理图:MeBSP原理图:FIR滤波:#include #deflne FI

45、RNUMBER 25#define SIGNAL1F 1OOO#deflne SIGNAL2F 4500#define SAMPLEF 10000#deHne PI 3.1415926float InputWaveO;float FIR();float fHnFIRNUMBER= 0.0,0.0,0.001,-0.002,-0.002,0.01,-0.009, -0.018,0.049,-0.02,0.11,0.28,0.64,0.28, -0.11,-0.02,0.049,-0.018,-0.009,0.01, -0.002,-0.002,0.001,0.0,0.0);float fXnFI

46、RNUMBERl= 0.0 ;float (Input,fOutput;float fSignall,fSignal2;float fStepSignall,fStepSignal2;float f2PI;int i;tloat nn256,f()ut256J;int nIn,nOut;nIn=0; nOut=0;f2PI=2*PI;(Signal 1=0.0;fSignal2=PI*0.1;fStepSignall=2*PI/30;fStepSignal2=2*PI*1.4;while ( 1 )(fInput=InputWave();nnnln=flnput;nln+; nln%=256;

47、fOutput=FIR();fOutnOut=fOutput;nOut+; /* break point */if(nOut=256)(nOut=0;)float InputWaveO(for (i=FlRNUMBER-l;i0;i-)fXni=fXni-l;fXn0=sin(douhle)fSignal1)+cos(double)f,Signal2)/6.0;fSignail +=fStepSignall;if (Signall=f2PI) fSignail-=f2PI;fSigna12+=fStepSignal2;if ( fSigna12=f2PI ) fSignal2-=f2PI;re

48、turn(fXn0);)float FIR()(float tSum;fSum=0;for (i=0;iFIRNUMBER;i+ )fSum+=(fXnliJ*fHnliJ);)return(fSuin);FFT:#include #deflne PI 3.1415926#define SAMPLENUMBER 128void InitForFFTO;void MakeWaveO;void FFT();int INPUTSAMPLENUMBER,DATASAMPLENUMBERJ;floatfVaveRSAMPLENUMBER,fVVaveISAMPLENUMBER,wSAMPL ENUMBE

49、R;float sin_tabSAMPLENUMBERJ,cos_tabSAMPLENUMBERJ;main()(int i;ImtForFFTO;MakeVVaveO;for( i=0;iSAMPLENUMBER;i+ ) (nVaveRil=INPUTil;fWaveIi=0.0f;wi=0.0f;FFT(fVVaveR,nVaveI);for( i=0;iSAMPLENUMBER;i+ )(DATAil=wil;while ( 1 );/ break point)voidFFT(floatdataRSAMPLENUMBERl,floatdatalfSAMPLENUMBER)int x0,

50、xl,x2,x3,x4,x5,x6,xx;int iJ,k,b,p,L;float TR,TI,tenip;/* following code invert sequence */for (i=0;iSAMPLENUMBER;i+ ) (x0=xl=x2=x3=x4=x5=x6=0;x0=i&0 x01;xl=(i/2)&0 x01;x2=(i/4)&0 x01;x3=(i/8)&0 x01;x4=(i/16)&0 x01;x5=(i/32)&0 x()l; x6=(i/64)&0 x01;xx=x0*64+x 1 *32+x2* 16+x3*8+x4*4+x5*2+x6;dataIxx=da

51、taRi;for (i=();iSAMPLENUMBER;i+ )(dataRi=dataIi; dataIi=0;)/* following code FFT */ for ( L=1;L0)(b=b*2; i;/* b= 2A(L-1) */for (j=O;j0 ) /* p=pow(2,7-L)*j; */(p=p*2; i-;P=P*j; for ( k=j;k128;k=k+2*b ) /* for (3) */ (TR=dataRk; TI=dataIk; temp=dataRk+b; dataRk=dataRk+dataRk+b*cos_tabp+dataIk+b*sin_ta

52、bp; dataIk=datalk-dataRk+b*sin_tabp+dataIk+b*cos_tabpJ;dataRk+b=TR-dataRk+b*cos_tabp-dataIk+b*sin_tabp; dataIk+b=TI+temp*sin_tabp-dataIk+b*cos_tabp; /* END for (3) */ /* END for (2) */* END for (1)*/for( i=0;iSAMPLENUMBER/2;i+ ) (wi=sqrt(dataRi*dataRi+dataI(i*dataIi);) /* END FFT */void InitForFFTO(

53、int i;for (i=O;iSAMPLENUMBER;i+ )(sin_tabi=sin(PI*2*i/SAMPLENUMBER);cos_tabi=cos(PI*2*i/SAMPLENUMBER);void MakeVVave()int i;for (i=O;ii,i=TORET;访问.bss段或.usect段中没有初始化的变量:使用.bss或.usect指令来定义变量使用.global指令来定义为外部变量在汇编语言中的变量前加下划线在C代码中声明变量为外部变量并正常地访问它从C程序中访问定义在.bss段的变量(a) C程序:在c代码中访问汇编变量extern int var ; var

54、 = 1;(b)汇编语言程序: .bss _vai;l .gloabal _bar/*外部变量*/*使用变量*/;定义变量;声明变量为外部变量当变量不是被存放在.bss段时,比方用汇编语言定义的查找表并不希望放在RAM中,这时应该定义一个指向该变量的指针并从C语言中对其间接访问。首先,要定义变量其次,声明一个指向该变量起始地址的全局指针,这个变量就 可以被链接到存储空间的任何地方Fieldl FieW2Field3Fseld42* * *3在.data段中汇编初始化表-45 000000.data6 0000000011 coeff.word 011h,022h,033h00000100220

55、0000200337*8*在.bss段中为变量保存空间-9*10 000000bss buffer, 1011*12*仍然在.data段中*1314 0000030123 ptr.word 0123h1516*在戊Xt肿炼解*1718 000000.text19 000000 A01E add:MOV OPh,ACO20 000002 4210 aloopSUB |lrAC021 000004 0450BCCaloop,ACO=IO000006 F3最后,在C程序中访问时,必须先声明该对象为extern型,并/*这就是对象,/*声明指针指向它*/*正常访问该对象*/,data.word OAA

56、h, OBBh, OCCh且不能在其名称前面加下划线,然后就可以正常访问它了在C代码中访问没有在.bss段中声明的变量。(a) C程序:在C代码中访问汇编语言常数extern float sine; float *sine_p=sine; f=sine_p2;(b)汇编程序:.global _sine;声明变量为外部变量.sect sine_tab” ;创立单独的段_sine:;表从此开始.float 0.0.float 0.015987.float 0.022145(a) C语言程序:extern int table_size;/*声明table_size为外部参数*/#defme TABL

57、E-SIZE (int)(&table_size)For(i=0;iTABLE_SIZE;+i)/*象使用普通符号一样使用该常数刃(b)汇编语言程序:嵌入汇编语言_table_size .set 10000 ;定义常量.global _table_size;定义该常量为全局常量#pragniaCODE_SECTION(func_name, section name”)作用:把C函数func_name的代码配置到由section_name定 义的程序段中#pragma DATA_SECTION(var_nameJsection_name) 作用:var_name是包含在C函数内的变量名称,该指令

58、 将数据var_name配置到由section_name定义的数据段。22*m*qm*m*Hm*23在.data段中定乂另一个郎就耒”24*“*“*“*“*“*“*“*25 00000426 000004 OOAA ivals000005 00BB000006 00CC*被轴受艇爆搬”*“*“*“*“*000000var2 .usect ffnewvarsffr 1000001inbuf .usect tfnewvarsw/ 7IV.INTM 位*如果INTM = 0, C55x使能所有可屏蔽中断*如果INTM=L C55x禁止所有可屏蔽中断东使用INTM位需要注意的要点:INTM位能够全局使

59、能或禁止可屏蔽中断,但是它对不可屏蔽中 断无效。在使用INTM位时,要使用状态位清零和置位指令来修改 INTM位。其它能影响INTM位的,只有软件中断指令和软件置位指 令。* CPU响应中断请求时,自动保存INTM位。特别地,CPU 把ST1_55保存到数据堆栈时,INTM位也被保存起来。执行中断服务子程序(ISR)之前,CPU自动置位INTM位, 禁止所有的可屏蔽中断。ISR可以通过清零1NTM位,来重新开放可 屏蔽中断。中断返回指令,从数据堆栈恢复INTM位的值。在调试器实时仿真模式下,CPU暂停时,忽略INTM位,CPU 只处理临界时间中断。sssc 6 G6 日 ear NN2ri f

60、 sro-xo-l E -CN 1 O04 3O.B*1 EOA047.irooJO0000000TIMOTIM1nmT/wdtoutCHIP_FSET(STI_55,XF,1);delay(2000);CHIP_FSET(STI_55,XF,0); delay(2000);snq -BJaqduad二.LED闪烁(延时函数显示)#include#include#include#includevoid delay(void);main()CSLJnitO;PLL_setFreq(l,0 xf,0,l,33,0); GPIO_RSET(IODIR,OXFO);for(;)void deIay(U

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论