DSP代码释义
- 格式:doc
- 大小:73.00 KB
- 文档页数:7
;************ GPIO.asm ***************.global _c_int0 ;定义全局变量 _c_int.global PHANTOM ;定义全局变量 PHANTOM.data ;data定义数据b0 .word 0fffEh ;turn-on GPIO0 ;b1 .word 0fffDh ;turn-on GPIO1b2 .word 0fffBh ;turn-on GPIO2b3 .word 0fff7h ;turn-on GPIO3b4 .word 0ffEFh ;turn-on GPIO0b5 .word 0ffDFh ;turn-on GPIO1b6 .word 0ffBFh ;turn-on GPIO2b7 .word 0ff7Fh ;turn-on GPIO3GPR0 .word 0.include f2407.h ;包含一个 f2407.h 文件KICK_DOG .macro ;看门狗控制寄存器LDP #00E0h ;DP-->7000h-707fh ;数据页指针将00E0赋给DP SPLK #05555h,WDKEY ;将05555h送给寄存器WDKEY SPLK #0aaaah,WDKEY ;同上LDP #0h ;DP-->0000h-007fh ;数据页指针将0赋给DP.end ;结束程序.text ;向下是个文本段_c_int0: ;开始执行程序LDP #0h ;数据页指针SETC I NTM ;关掉中断让程序正常运行SETC C NF ;B2程序存储器 0,数据 1,程序SPLK #0000h,IMR ;将0000送给寄存器中断屏蔽寄存器LACC IFR ;将中断标志寄存器IFR的值给了累加器SACL IFR ;将中断标志寄存器IFR的值LDP #00E0h ;数据页指针SPLK #0200h, SCSR1 ;将0200送给系统控制和状态寄存SPLK #006Fh,WDCR ;禁止看门狗复位KICK_DOG ;看门狗寄存器SPLK #0h,GPR0 ;将0送给等待寄存器GPR0OUT GPR0,WSGR ;将GPR0的值送给WSGRLDP #00E1h ;数据页指针SPLK #00000h,MCRA ;定义RA输入或输出SPLK #0FF00h,MCRB ;定义RB输入或输出SPLK #00000h,MCRC ;定义RC输入或输出SPLK #0FFFFh,PADATDIR ;端口A输出高电平SPLK #0FFFFh,PBDATDIRSPLK #0FFFFh,PCDATDIRSPLK #0FFFFh,PEDATDIRSPLK #0FFFFh,PFDATDIRMAIN: ;主程序LDP #0 ;数据页指针LOOP: ;循环LDP #00E1h ;数据页指针setc x f ;给xf高电平,使发光二极管发光SPLK #0FFFFh,PADATDIR ;端口A输出高电平SPLK #0FFFFh,PBDATDIRSPLK #0FFFFh,PCDATDIRSPLK #0FFFFh,PEDATDIRSPLK #0FFFFh,PFDATDIRCALL D ELAY ;调用延迟程序clrc x f ;清零SPLK #0FF00h,PADATDIR ;端口A数据和方向控制寄存器输出低电平SPLK #0FF00h,PBDATDIRSPLK #0FF00h,PCDATDIRSPLK #0FF00h,PEDATDIRSPLK #0FF00h,PFDATDIRB MAIN ;无条件跳转到主程序DELAY: ;延迟D_LOOP: ;RPT #0FFh ;重复0FF+1次NOP ;无动作RET ;跳转到 CALL DELAYPHANTOM: ; 假中断KICK_DOG ;看门狗寄存器B RET ;无条件跳转到 CALL DELAY。
•装载累加器–LACC:左移装载累加器•LACC dma [,shift]•LACC dma ,16•LACC ind [,shift[,ARn]]•LACC ind ,16[,ARn]•LACC #lk [,shift]–LACL:装载累加器低位并清累加器高位•LACL dma•LACL ind[,ARn]•LACL #k–LACT:按TREG规定左移后再转载入累加器•LACT dma•LACT ind[,ARn]–PAC:用乘积寄存器PREG装载累加器,移位方式由ST1中的PM确定•PAC•装载临时寄存器TREG–LT:将指定数据存储器的内容装入TREG。
常作乘法的准备工作。
•LT dma•LT ind[,ARn]–LTA:装载TREG同时累加前次乘积•LTA dma•LTA ind[,ARn]–LTD:装载TREG,累加前次乘积并移动数据•LTD dma•LTD ind[,ARn]–LTP:装载TREG,并将PREG值保存至累加器•LTP dma•LTP ind[,ARn]–LTS:装载TREG并减去前次乘积•LTS dma•LTS ind[,ARn]•装载辅助寄存器AR–LAR:装载辅助寄存器•LAR ARx,dma•LAR ARx,ind[,ARn]•LAR ARx,#k•LAR ARx,#lk–MAR:修改辅助寄存器•MAR dma•MAR ind[,ARn]•装载其它寄存器–LDP:装载数据页指针•LDP dma•LDP ind[,ARn]•LDP #k–LPH:装载乘积寄存器高位字•LPH dma•LPH ind[,ARn]–LST:装载状态寄存器•LST #m,dma•LST #m,ind[,ARn]存储寄存器值•保存AR值(SAR)–SAR ARx, dma–SAR ARx, ind[, ARn] •保存PREG高位字(SPH)–SPH dma–SPH ind[, ARn]•保存PREG低位字(SPL)–SPL dma–SPL ind[, ARn]•保存状态寄存器ST0和ST1(SST)–SST #m, dma–SAR #m, ind[, ARn]堆栈操作•出栈至ACC低位字(POP )–POP•ACC低位字入栈(PUSH )–PUSH•出栈至数据存储器(POPD )–POPD dma–POPD, ind[, ARn]•数据存储器值入栈(PSHD )–PSHD dma–PSHD ind[, ARn]读写数据或程序存储器•数据存储器至数据存储器的块移动(BLDD )–BLDD #lk,dma–BLDD #lk,ind[, ARn]–BLDD dma ,#lk–BLDD ind ,#lk[, ARn] •程序存储器至数据存储器的块移动(BLPD )–BLPD #pma, dma–BLPD #pma, ind[, ARn] •片内数据存储器中的数据传送(DMOV )–DMOV dma–DMOV ind[, ARn]•长立即数写入数据存储器(SPLK )–SPLK #lk, dma–SPLK #lk, ind[, ARn]•读程序存储器(表读)(TBLR )–TBLR dma–TBLR ind[, ARn]•写程序存储器(表写)(TBLW )–TBLW dma–TBLW ind[, ARn]读写I/O单元•读I/O单元(IN )–IN dma, PA–IN ind, PA[, ARn]•写I/O单元(OUT )–OUT dma, PA–OUT ind, PA[, ARn]加法•左移加至ACC(ADD)–ADD dma [,shift]–ADD dma ,16–ADD ind [,shift[,ARn]]–ADD ind ,16[,ARn]–ADD #k–ADD #lk [,shift]•带进位位加至ACC (ADDC)–ADDC dma–ADDC ind [,ARn]•抑制符号扩展加至ACC (ADDS)–ADDS dma–ADDS ind [,ARn]•按TREG低4位规定左移加至ACC (ADDT)–ADDT dma–ADDT ind [,ARn]•加短立即数至当前AR(ADRK)–ADRK #k减法•左移后从ACC中减去(SUB)–SUB dma [,shift]–SUB dma ,16–SUB ind [,shift[,ARn]]–SUB ind ,16[,ARn]–SUB #k–SUB #lk [,shift]•带借位从ACC中减去(SUBB)–SUBB ind [,ARn]•条件减(SUBC):常用来实现除法–SUBC dma–SUBC ind [,ARn]•抑制符号扩展减(SUBS)–SUBS dma–SUBS ind [,ARn]•按TREG低4位左移后从ACC中减去(SUBT)–SUBT dma–SUBT ind [,ARn]•当前AR减去短立即数(SBRK)–SBRK #k•ACC减去PREG(SPAC)–SPAC•SUBC实现16位数除法的步骤–被除数(必须为正)置于累加器低位字中,且最高位放在bit15中,累加器高位字清零;–除数(必须大于0)放入数据存储单元中;–执行SUBC指令16次;–除的结果:商在累加器低位字;余数在累加器高位字。
一、32 位加法//链接命令文件MEMORY{PAGE 0: ROM :origin=0080h,length=1000hROM :origin=0060h,length=10hPAGE 1: OTHER :origin=0400h,length=40h}SECTIONS{.text : { }>ROM PAGE 0.data :{ }>ROM PAGE 0.bss : { }>OTHER PAGE 1.stack : { }>OTHER PAGE 1}//汇编语言源代码.title "ADD32".mmregs.def start,_c_int00.bss xhi , 2,1,1.bss yhi , 2,1,1.bss zhi , 2,1, 1table .long 13578468H.long 1020B30AH.text_c_int00b startnopnopstart: LD #xhi ,DPSTM #xhi,AR1RPT #3MVPD table,*AR1+DLD xhi , ADADD yhi , ADST A ,zhiEND: B END.end二、64位加法/减法//链接命令文件/*ADDSUB64.cmd*/ADDSUB64.obj-m ADDSUB64.map-o ADDSUB64.outMEMORY{PAGE 0: ROM :origin=0080h,length=1000hROM :origin=0060h,length=10hPAGE 1: OTHER :origin=0400h,length=40h}SECTIONS{.text : { }>ROM PAGE 0.data :{ }>ROM PAGE 0.bss : { }>OTHER PAGE 1.stack : { }>OTHER PAGE 1}//汇编语言源代码.title "ADDSUB64".mmregs.def start,_c_int00.bss x1 , 2 ,1,1.bss x3 , 2 ,1,1.bss y1 , 2 ,1,1.bss y3 , 1.bss y2 , 1.bss z1 , 2 ,1,1.bss z3 , 1.bss z2 , 1.bss w1 , 2 ,1,1.bss w3 , 2 ,1,1table .long 12345678H ;x1x0.long 02468ACEH ;x3x2.long 22222222H ;y1y0.word 1357H,2468H ;y3,y2.long 44444444H ;z1z0.word 1020H,0B30AH ;z3,z2.text_c_int00b startnopnopstart: LD #x1 ,DPSTM #x1,AR1RPT #11MVPD table,*AR1+DLD x1,A ; A = X1 X0DADD y1,A ; A= X1 X0 + Y1 Y0,产生进位CDLD x3,B ; B = X3 X2ADDC y2,B ; B = X3 X2 + 00 Y2 + CADD y3,16,B ; B = X3 X2 + Y3 Y2 + CDSUB z1,A ; A= X1 X0 + Y1 Y0-Z1Z0,产生借位C'DST A,w1 ; W1W0= X1 X0 + Y1 Y0-Z1Z0SUBB z2,B ; B = X3 X2 + Y3 Y2 + C - 00 Z2-C'SUB z3,16,B ; B = X3 X2 + Y3 Y2 + C -Z3 Z2-C'DST B,w3 ; W3 W2= X3 X2 + Y3 Y2 + C - Z3 Z2-C' END: B END.end三、FIR滤波//链接命令文件fir.obj-m fir.map-o fir.outMEMORY{PAGE 0: ROM1(RIX) :ORIGIN=0080H,LENGTH=100HPAGE 1: INTRAM1(RW) :ORIGIN=2400H,LENGTH=0200HINTRAM2(RW) :ORIGIN=2600H,LENGTH=0100HINTRAM3(RW) :ORIGIN=2700H,LENGTH=0100HB2B(RW) :ORIGIN=0070H,LENGTH=10H}SECTIONS{.text : {}>ROM1 PAGE 0.data : {}>INTRAM1 PAGE 1FIR_COFF: {}>INTRAM2 PAGE 1FIR_BFR : {}>INTRAM3 PAGE 1.stack : {}>B2B PAGE 1}//汇编语言源代码;一个FIR滤波器源程序fir.asm.mmregs.global start.def start,_c_int00INDEX .set 1KS .set 256 ;模拟输入数据缓冲区大小N .set 17COFF_FIR .sect "COFF_FIR" ;FIR滤波器系数.word 0.word 158.word 264.word -290.word -1406.word -951.word 3187.word 9287.word 12272.word 9287.word 3187.word -951.word -1406.word -290.word 260.word 158.word 0.dataINPUT .copy "firin.inc" ;模拟输入在数据存储区0x2400 OUTPUT .space 1024 ;输出数据在数据区0x2500 ;FIR_DP .usect "FIR_V ARS",0;D_FIN .usect "FIR_V ARS",1;D_FOUT .usect "FIR_V ARS",1COFFTAB .usect "FIR_COFF",NDA TABUF .usect "FIR_BFR",NBOS .usect "STACK",0FhTOS .usect "STACK",1.text.asg AR0,INDEX_P.asg AR4,DA TA_P ;输入数据x(n)循环缓冲区指针.asg AR5,COFF_P ;FIR系数表指针.asg AR6,INBUF_P ;模拟输入数据指针.asg AR7,OUTBUF_P;FIR滤波器输出数据指针_c_int00b startnopnopstart: ssbx FRCTSTM #COFFTAB,COFF_PRPT #N-1 ;将FIR系数从程序存储器移动MVPD #COFF_FIR,*COFF_P+ ;到数据存储器STM #INDEX,INDEX_PSTM #DATABUF,DATA_PRPTZ A,#N-1STL A,*DATA_P+ ;将数据循环缓冲区清零STM #(DA TABUF+N-1),DATA_P ;数据缓冲区指针指向x[n-(N-1)]STM #COFFTAB,COFF_P ;FIR_TASK:STM #INPUT,INBUF_PSTM #OUTPUT,OUTBUF_PSTM #KS-1,BRCRPTBD LOOP-1STM #N,BK ;FIR循环缓冲区大小LD *INBUF_P+,A ;装载输入数据FIR_FILTER:STL A,*DATA_P+%RPTZ A,N-1MAC *DATA_P+0%,*COFF_P+0%,ASTH A,*OUTBUF_P+LOOP:EEND B EEND.end四、IIR滤波//链接命令文件MEMORY{PAGE 0:EPROM: org=0E00H, len=1000HVECS0: org=0FF80H, len=0080hPAGE 1:SPRAM: org=0060H, len=0020hDARAM: org=0080H, len=1380H}SECTIONS{.text :>EPROM PAGE 0.data :>EPROM PAGE 0X: align(8) {}>DARAM PAGE 1Y: align(8) {}>DARAM PAGE 1B: align(8) {}>DARAM PAGE 1A: align(8) {}>DARAM PAGE 1.vecs0:>VECS0, PAGE 0}//输入数据序列(512点)0x7fff0x00x0…0x0//汇编语言源代码.title "IIR.ASM".mmregs.def _c_int00X .usect "X", 5Y .usect "Y", 5B .usect "B", 5A .usect "A", 5PA0 .set 0PA1 .set 1.datatable: .word 0.word 0.word 0.word 0.word 0.word 0.word 0.word 0.word 3116.word -10286.word 14615.word -10286.word 3116.word -22082.word 31149.word -30484.word 28383.text_c_int00:SSBX FRCTSTM #X, AR1RPT #3MVPD #table, *AR1+STM #Y, AR1RPT #3MVPD #table+4, *AR1+STM #B, AR1RPT #4MVPD #table+8, *AR1+STM #A, AR1RPT #3MVPD #table+13, *AR1+STM #X+4, AR2STM #A+3, AR3STM #Y+3, AR4STM #B+4, AR5STM #5, BKSTM #-1, AR0STM #1000H, AR6STM #0200H-1, AR7loop:PORTR PA1, *AR2LD *AR2, ASTL A, -1, *AR2MPY *AR2+0%, *AR5+0%, AMAC *AR2+0%, *AR5+0%, AMAC *AR2+0%, *AR5+0%, AMAC *AR2+0%, *AR5+0%, AMAC *AR2, *AR5+0%, AMAC *AR4, *AR3, AMAC *AR4, *AR3, AMAC *AR4, *AR3, AMAC *AR4+0%, *AR3+0%, AMAC *AR4, *AR3, AMAC *AR4, *AR3, AMAC *AR4, *AR3, AMAC *AR4, *AR3, AMAC *AR4+0%, *AR3+0%, AMAC *AR4, *AR3, AMAC *AR4, *AR3, AMAC *AR4+0%, *AR3+0%, AMAC *AR4+0%, *AR3+0%, AMAR *AR3+0%STH A, *AR4PORTW *AR4, PA0STH A, *AR6+BANZ loop, *AR7-end: B end.end五、除法//链接命令文件/*chuf.cmd*/chuf.obj-m chuf.map-o chuf.outMEMORY{PAGE 0: ROM :origin=0080h,length=1000hROM :origin=0060h,length=10hPAGE 1: OTHER :origin=0400h,length=40h}SECTIONS{.text : {}>ROM PAGE 0.data :{}>ROM PAGE 0.stack : {}>OTHER PAGE 1.bss : {}>OTHER PAGE 1}//汇编语言源代码;*** 编制计算除法运算的程序段。
DSP代码2.main(){int i;unsigned int * px;unsigned int * py;unsigned int * pz;px=(unsigned int *)0x4080; // 字地址,字节地址为8100H py=(unsigned int *)0x4100; // 字地址,字节地址为8200H for ( i=0,pz=px;i<16;i++,pz++ )(*pz)=i;for ( i=0,pz=py;i<16;i++,pz++ ) // 在此加软件断点(*pz)=0x1234;for ( i=0;i<16;i++,px++,py++ ) // 在此加软件断点(*py)=(*px);while(1){} // 在此加软件断点}3.#include "myapp.h"// 定义指示灯寄存器地址和寄存器类型#define LBDS (*((unsigned int *)0x400001))void INTR_init( void );void TIMER_init(void);int nCount;main(){nCount=0;PLL_Init(40);SDRAM_init();LBDS=0;INTR_init();TIMER_init();while ( 1 ){}}void interrupt Timer(){nCount++; nCount%=16;if ( nCount==0 )LBDS^=1;}void INTR_init( void ){IVPD=0xd0;IVPH=0xd0;IER0=0x10;DBIER0 =0x10;IFR0=0xffff;asm(" BCLR INTM");}void TIMER_init(void){ioport unsigned int *tim0; ioport unsigned int *prd0; ioport unsigned int *tcr0; ioport unsigned int *prsc0; tim0 = (unsigned int *)0x1000;prd0 = (unsigned int *)0x1001;tcr0 = (unsigned int *)0x1002;prsc0 = (unsigned int *)0x1003;*tcr0 = 0x04f0;*tim0 = 0;*prd0 = 0x0ffff;*prsc0 = 2;*tcr0 = 0x00e0;}4.#include "myapp.h"#include "ICETEK-VC5509-EDU.h"#include "scancode.h"void InitADC();void wait( unsigned int cycles );void EnableAPLL( );unsigned int nADC0[256],nADC1[256]; main() {int i;unsigned int uWork;EnableAPLL();SDRAM_init();InitADC();PLL_Init(132);while ( 1 ){for ( i=0;i<256;i++ ){ADCCTL=0x8000; // 启动AD转换,通道0do{uWork=ADCDA TA;} while ( uWork&0x8000 );nADC0[i]=uWork&0x0fff;}for ( i=0;i<256;i++ ){ADCCTL=0x9000; // 启动AD转换,通道1do{uWork=ADCDA TA;} while ( uWork&0x8000 );nADC1[i]=uWork&0x0fff;}asm( " nop"); // break point}}void InitADC(){ADCCLKCTL=0x23; // 4MHz ADCLK ADCCLKDIV=0x4f00;}void wait( unsigned int cycles ){int i;for ( i = 0 ; i < cycles ; i++ ){ }}void EnableAPLL( ){/* Enusre DPLL is running */*( ioport volatile unsigned short* )0x1f00 = 4;wait( 25 );*( ioport volatile unsigned short* )0x1f00 = 0;// MULITPL Y*( ioport volatile unsigned short* )0x1f00 = 0x3000;// COUNT*( ioport volatile unsigned short* )0x1f00 |= 0x4F8;wait( 25 );//*( ioport volatile unsigned short* )0x1f00 |= 0x800// MODE*( ioport volatile unsigned short* )0x1f00 |= 2;wait( 30000 );// APLL Select*( ioport volatile unsigned short* )0x1e80 = 1;// DELAYwait( 60000 );}5.#include "myapp.h"#include "ICETEK-VC5509-EDU.h"#include "scancode.h"#define CTRSTATUS (*(unsigned int *)0x600800) //port8000 #define CTRLED (*(unsigned int *)0x600802) // port8004 void InitMcBSP();main(){PLL_Init(12);SDRAM_init();InitCTR();InitMcBSP();CTRSTATUS=0x80;CTRSTATUS=0;CTRSTATUS=0x80;CTRSTATUS=0;CTRLED=0xff;CTRGR=2; // 使能IOwhile ( 1 ){PCR1^=8;Delay(256);}}void InitMcBSP(){// IOPin: McBSP1.FSX S15//SPCR2.XRST_=0,PCR.XIOEN=1,PCR.FSXM=1,PCR.FSXP=0/ 1SPCR2_1&=0x0fffe;PCR1|=0x2800;}6.#include#include "volume.h"/* Global declarations */int inp1_buffer[BUFSIZE];int inp2_buffer[BUFSIZE]; /* processing data buffers */int out1_buffer[BUFSIZE];int out2_buffer[BUFSIZE];int out3_buffer[BUFSIZE];int out4_buffer[BUFSIZE*2];int size = BUFSIZE;int ain = MINGAIN;int zhy=0;int sk=64; /*sk代表所开的bufsize的大小,需修改它.输入文件sine.dat为32点,sine11.dat,sin22.dat,sin33.dat,sin44.dat为64点的输入波形.*//* volume control variable *///unsigned int processingLoad = 1; /* processing routine load value *//* Functions */extern void load(unsigned int loadValue);static int processing1(int *output1, int *output2);static int processing2(int *output2, int *output3);static int processing3(int *input1,int *output2,int *output4);static int processing4(int *input2, int *output1);static void dataIO1(void);static void dataIO2(void);/** ======== main ========*/void main(){int *input1 = &inp1_buffer[0];int *input2 = &inp2_buffer[0];int *output1 = &out1_buffer[0];int *output2 = &out2_buffer[0];int *output3 = &out3_buffer[0];int *output4 = &out4_buffer[0];puts("volume example started\n");/* loop forever */while(TRUE){/** Read input data using a probe-point connected to a host file.* Write output data to a graph connected through a probe-point.*/dataIO1(); // break pointdataIO2(); // break point/* apply gain */processing4(input2,output1);processing1(output1, output2);processing2(output2, output3);processing3(input1,output2,output4) ;}}/** ======== processing ========** FUNCTION: apply signal processing transform to input signal. ** PARAMETERS: address of input and output buffers.** RETURN V ALUE: TRUE.*/static int processing4(int *input2,int *output1){ int m=sk;for(;m>=0;m--){*output1++ = *input2++ * ain;}for(;(size-m)>0;m++){output1[m]=0;}// load(processingLoad);return(TRUE);}static int processing1(int *output1,int *output2){int m=sk-1;for(;m>0;m--){*output2++ = *output1++ * ain;}/* additional processing load */// load(processingLoad);return(TRUE);}static int processing2(int *output2, int *output3){ int n=zhy;size=BUFSIZE;for(;(size-n)>0;n++){ *output3++ = output2[n];}/* for (;n>0;n--){ *output3++ = 0;} */// load(processingLoad);return(TRUE);}static int processing3(int *input1,int *output2,int *output4) { int m=sk;int y=zhy;int z,x,w,i,f,g;for(;(m-y)>0;){i=y;x=0;z=0;f=y;for(;i>=0;i--){g=input1[z]*output2[f]; x=x+g;z++;f--;}*output4++ = x;y++;}m=sk;y=sk-1;w=m-zhy-1;for(;m>0;m--){y--;i=y;z=sk-1;x=0;f=sk-y;for(;i>0;i--,z--,f++){g=input1[z]*output2[f]; x=x+g;}out4_buffer[w]=x;w++;}// load(processingLoad);return(TRUE);}/** ======== dataIO ========** FUNCTION: read input signal and write processed output signal.** PARAMETERS: none.** RETURN V ALUE: none.*/static void dataIO1(){/* do data I/O */return;}static void dataIO2(){/* do data I/O */return;}7.#include "myapp.h"#include "ICETEK-VC5509-EDU.h" #include "scancode.h"void InitADC();void wait( unsigned int cycles ); void EnableAPLL( );void InitMcBSP();unsigned int nADC0[256];main(){int i;unsigned int uWork;EnableAPLL();SDRAM_init();InitADC();PLL_Init(144);InitCTR();InitMcBSP();while ( 1 ){for ( i=0;i<256;i++ ){ADCCTL=0x8000; // 启动AD转换,通道0 do{uWork=ADCDA TA;} while ( uWork&0x8000 );nADC0[i]=uWork&0x0fff;PCR1^=8;}asm( " nop"); // break point}}void InitADC(){ADCCLKCTL=0x23; // 4MHz ADCLKADCCLKDIV=0x4f00;}void wait( unsigned int cycles ){int i;for ( i = 0 ; i < cycles ; i++ ){ }}void EnableAPLL( ){/* Enusre DPLL is running */*( ioport volatile unsigned short* )0x1f00 = 4;wait( 25 );*( ioport volatile unsigned short* )0x1f00 = 0;// MULITPL Y*( ioport volatile unsigned short* )0x1f00 = 0x3000; // COUNT*( ioport volatile unsigned short* )0x1f00 |= 0x4F8; wait( 25 );//*( ioport volatile unsigned short* )0x1f00 |= 0x800 // MODE*( ioport volatile unsigned short* )0x1f00 |= 2;wait( 30000 );// APLL Select*( ioport volatile unsigned short* )0x1e80 = 1;// DELAYwait( 60000 );}void InitMcBSP(){// IOPin: McBSP1.FSX S15//SPCR2.XRST_=0,PCR.XIOEN=1,PCR.FSXM=1,PCR.FSXP=0/ 1 SPCR2_1&=0x0fffe;PCR1|=0x2800;}8.#include "myapp.h"#include "ICETEK-VC5509-EDU.h"#include "scancode.h"#include#define FIRNUMBER 25#define SIGNAL1F 1000#define SIGNAL2F 4500#define SAMPLEF 10000#define PI 3.1415926float InputWave();float FIR();float fHn[FIRNUMBER]={ 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 fXn[FIRNUMBER]={ 0.0 };float fInput,fOutput;float fSignal1,fSignal2;float fStepSignal1,fStepSignal2;float f2PI;float fIn[256],fOut[256];int nIn,nOut;main(){nIn=0; nOut=0;f2PI=2*PI;fSignal1=0.0;fSignal2=PI*0.1;fStepSignal1=2*PI/30;fStepSignal2=2*PI*1.4;while ( 1 ){fInput=InputWave();fIn[nIn]=fInput;nIn++; nIn%=256;fOutput=FIR();fOut[nOut]=fOutput;nOut++; /* break point */if ( nOut>=256 ){nOut=0;}}}float InputWave(){for ( i=FIRNUMBER-1;i>0;i-- )fXn[i]=fXn[i-1];fXn[0]=sin((double)fSignal1)+cos((double)fSignal2)/6.0; fSignal1+=fStepSignal1;if ( fSignal1>=f2PI ) fSignal1-=f2PI;fSignal2+=fStepSignal2;if ( fSignal2>=f2PI ) fSignal2-=f2PI;return(fXn[0]);}float FIR(){float fSum;fSum=0;for ( i=0;i<="" p="">{fSum+=(fXn[i]*fHn[i]);return(fSum);}9.#include"math.h"#define IIRNUMBER 2#define SIGNAL1F 1000#define SIGNAL2F 4500#define SAMPLEF 10000#define PI 3.1415926float 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 pointif ( 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<="" p="">{fSum+=(fXn[i]*fAn[i]);fSum+=(fYn[i]*fBn[i]);}return(fSum);}10.#include "myapp.h"//#include "ICETEK-VC5509-A.h"#include "LCD.h"#include "math.h"#include "extaddr.h"#include "util.h"#define CREG (*(unsigned short int *)0x400004)// AD ---------------------------------------------------------- ioport unsigned int *ADCCTL1=(unsigned int *)0x6800; ioport unsigned int *ADCDATA1=(unsigned int *)0x6801; ioport unsigned int *ADCCLKDIV1=(unsigned int *)0x6802;ioport unsigned int *ADCCLKCTL1=(unsigned int *)0x6803; #define ADCCTL (*ADCCTL1)#define ADCDATA (*ADCDA TA1)#define ADCCLKDIV (*ADCCLKDIV1)#define ADCCLKCTL (*ADCCLKCTL1)// DA ---------------------------------------------------------- #define DA_DATA_L (*((unsigned int *)0x400800))#define DA_DATA_H (*((unsigned int *)0x400801))#define DA_CTL (*((unsigned int *)0x400802))#define DA_CHN1 0x0#define DA_CHN2 0x40#define DA_CHN3 0x80#define DA_CHN4 0xc0// 液晶---------------------------------------------------------- #define CTRLED (*(unsigned int *)0x600802) // port8004 #define MCTRKEY (*(unsigned int *)0x602802) // port8005 #define CTRCLKEY (*(unsigned int *)0x600803) // port8006 #define CTRSTATUS (*(unsigned int *)0x600800) //port8000 #define ADCNUMBER 500void TIME_init(void);void INTR_init( void );void interrupt Timer( void );void InitADC();ioport unsigned int * sysR = (unsigned int *)0x7fd;struct struLCDGraph struGraph,struGraph1;unsigned int nScreenBuffer[30*128];int nData[256],nData1[256];void Delay(unsigned int nDelay);int k0,k1,uWork,uWork0,nAD,keyflage;intnGraphBuf1[ADCNUMBER],nGraphBuf2[ADCNUMBER],nGraphB uf3[ADCNUMBER]; int nADBuf1[ADCNUMBER],nADBuf2[ADCNUMBER],nADBuf3[ADC NUMBER];int nGraphBuf1[ADCNUMBER],nGraphBuf2[ADCNUMBER];intshow1[ADCNUMBER],show2[ADCNUMBER],show3[ADCNUMBE R];main(){unsigned int uWork1;int j;unsigned int * pWork;PLL_Init(12);//PLL_Init(48);SDRAM_init();CREG=1;LCDTurnOff();LCDSetScreenBuffer(nScreenBuffer);for( uWork=0,pWork=nScreenBuffer;uWork<30*128;uWork++,pW ork++ ) (*pWork)=0; LCDSetDelay(1);LCDTurnOn(); // 打开显示LCDCLS(); // 清除显示内存TIME_init();INTR_init();InitADC();ADCCTL = 0x8000;(*sysR)=1;k0=k1=0;keyflage=0;for(;;){for(j=0;j<adcnumber;j++)< p="">{show1[j]=nGraphBuf1[j];show2[j]=nGraphBuf2[j];show3[j]=nGraphBuf3[j];}if(keyflage==0){struGraph.pData=show2;struGraph.uDataMode=DA TAUINTMODE; struGraph.uDataLength=ADCNUMBER; struGraph.uMaxValue=2048; struGraph.uWindowX0=0; struGraph.uWindowY0=0; struGraph.uWindowX1=240; struGraph.uWindowY1=128; struGraph.nOriginX=0;struGraph.nOriginY=0;struGraph.uLineMode=LINEMODE; LCDGraph(&struGraph);struGraph.pData=show1;struGraph.uDataMode=DA TAUINTMODE; struGraph.uDataLength=ADCNUMBER; struGraph.uMaxValue=1024; struGraph.uWindowX0=0; struGraph.uWindowY0=0; struGraph.uWindowX1=240;struGraph.uWindowY1=128; struGraph.nOriginX=0;struGraph.nOriginY=64;struGraph.uLineMode=LINEMODE; LCDGraph(&struGraph);for ( j=0;j<20;j++ ) _Delay(614); LCDSetScreenBuffer(nScreenBuffer); LCDCLS(); // 清除显示内存}if(keyflage==1){struGraph.pData=show3;struGraph.uDataMode=DA TAUINTMODE; struGraph.uDataLength=ADCNUMBER; struGraph.uMaxValue=1024; struGraph.uWindowX0=0; struGraph.uWindowY0=0; struGraph.uWindowX1=240; struGraph.uWindowY1=128; struGraph.nOriginX=0;struGraph.nOriginY=0;struGraph.uLineMode=LINEMODE; LCDGraph(&struGraph);for ( j=0;j<20;j++ ) _Delay(614); LCDSetScreenBuffer(nScreenBuffer); LCDCLS();}uWork1=MCTRKEY;CTRCLKEY=0;if(uWork1==128){keyflage=1-keyflage;}}}void TIME_init(void){ioport unsigned int *tim0; ioport unsigned int *prd0; ioport unsigned int *tcr0; ioport unsigned int *prsc0;tim0 = (unsigned int *)0x1000; prd0 = (unsigned int *)0x1001; tcr0 = (unsigned int *)0x1002; prsc0 = (unsigned int *)0x1003; *tcr0 = 0x04f0;*tim0 = 0;*prd0 = 0x03ff;*prsc0 = 2;*tcr0 = 0x00e0;}void INTR_init( void ){IVPD=0xd0;IVPH=0xd0;IER0=0x10;DBIER0 =0x10;IFR0=0xffff;asm(" BCLR INTM");}void interrupt Timer( void ){uWork0=ADCDA TA; // 从FIFO中读取转换结果uWork=uWork0&0x0f000;if ( uWork==0 ){uWork0&=0x0fff; // 去掉高4位nADBuf1[k0++]=uWork0; // 保存结果DA_DA TA_L=uWork0&0xff;DA_DA TA_H=((uWork0>>8)&0x0f)|DA_CHN1;DA_CTL=0;if ( k0>=ADCNUMBER ){for ( nAD=0;nAD<="" p="">{nGraphBuf1[nAD]=nADBuf1[nAD];//+2048;//+1352;nGraphBuf1[nAD]&=0x0fff;nGraphBuf3[nAD]=nADBuf3[nAD];//+2048;//+1352;nGraphBuf3[nAD]&=0x0fff;}for ( nAD=k0;nAD<="" p="">{nGraphBuf1[nAD]=nADBuf1[k0-1];//+2048;//+1352;nGraphBuf1[nAD]&=0x0fff;}k0=0;}ADCCTL = 0x9000; // 发送控制脉冲信号,进行下次转换1通道只需送0x9000即可}if ( uWork==0x1000 ){uWork0&=0x0fff; // 去掉高4位nADBuf2[k1++]=uWork0;DA_DA TA_L=uWork0&0xff;DA_DA TA_H=((uWork0>>8)&0x0f)|DA_CHN2;DA_CTL=0;if ( k1>=ADCNUMBER ){for ( nAD=0;nAD<="" p="">{nGraphBuf2[nAD]=nADBuf2[nAD];//+2048;//+1352;nGraphBuf2[nAD]&=0x0fff;}for ( nAD=k1;nAD<="" p="">{nGraphBuf2[nAD]=nADBuf2[k1-1];//+2048;//+1352;nGraphBuf2[nAD]&=0x0fff;}k1=0;}ADCCTL = 0x8000; // 发送控制脉冲信号,进行下次转换0通道只需送0x8000即可}uWork0=nADBuf1[k0]+nADBuf2[k0];uWork0=uWork0>>1;</adcnumber;j++)<>。
word格式-可编辑-感谢下载支持1.STM #8765,*AR7+ 把立即数8765存放到AR7所指定的数据存储单元中去2.MPY #-2,A 立即数-2与T寄存器中的值相乘,并将乘积装入累加器A中3.MVPD TABLE,*AR1+把中TABLE标注的程序存储器单元地址中的一个字复制到由AR4所指定的数据存储单元中去。
4.BC new,AOV 若累加器A溢出,则跳转至new5.BC new,AGT 若累加器A中的值大于0,则跳转至new6.STL A,*AR1+ 把累加器A低端存放到AR1所指定的数据存储单元中7.PRTZ A,#4 对A清零并设置重复执行下条指令5次8.ADD *AR4,16,B,A将AR4所指定的数据存储单元中的值左移16后的值与累加器B中的值相加,并把结果装入累加器A中9.SUB *AR3+,14,A 累加器A中的值减去AR3所指定的数据存储单元中的数左移14位后的值,并将结果装入累加器A中。
即:从累加器A中减去AR3所指定的数据存储单元中的数左移14位后的值的值。
10.MAC #345H,A,B将T寄存器中的值与立即数345的乘积加上累加器A中的值所得到的和装入累加器B中。
11.STA, *AR4-(ASM=0)将累加器A中的值存储到AR4所指向的数据存储单元中。
12.MAC *AR3+,*AR4+,A,BAR3所指定数据存储单元中的值与AR4所指定数据存储单元中的值相乘,将乘积与累加器A中的值相加所得到的和装入累加器B中13.SUB #12345,8,A,B把累加器A中的值与立即数12345左移8位后的值相减所得到的差装入累加器B14.RPT #99NOP重复执行NOP指令100次15.MVDD *AR3+,*AR5+将AR3所指定的数据存储单元中的值传送到AR5指定的数据存储单元中。
16.CALA A 用累加器A的滴16位加载PC17.ST T,*AR7- T寄存器高端移位后存储到AR7所指定的数据存储单元中。
•装载累加器–LACC:左移装载累加器•LACC dma [,shift]•LACC dma ,16•LACC ind [,shift[,ARn]]•LACC ind ,16[,ARn]•LACC #lk [,shift]–LACL:装载累加器低位并清累加器高位•LACL dma•LACL ind[,ARn]•LACL #k–LACT:按TREG规定左移后再转载入累加器•LACT dma•LACT ind[,ARn]–PAC:用乘积寄存器PREG装载累加器,移位方式由ST1中的PM确定•PAC•装载临时寄存器TREG–LT:将指定数据存储器的内容装入TREG。
常作乘法的准备工作。
•LT dma•LT ind[,ARn]–LTA:装载TREG同时累加前次乘积•LTA dma•LTA ind[,ARn]–LTD:装载TREG,累加前次乘积并移动数据•LTD dma•LTD ind[,ARn]–LTP:装载TREG,并将PREG值保存至累加器•LTP dma•LTP ind[,ARn]–LTS:装载TREG并减去前次乘积•LTS dma•LTS ind[,ARn]•装载辅助寄存器AR–LAR:装载辅助寄存器•LAR ARx,dma•LAR ARx,ind[,ARn]•LAR ARx,#k•LAR ARx,#lk–MAR:修改辅助寄存器•MAR dma•MAR ind[,ARn]•装载其它寄存器–LDP:装载数据页指针•LDP dma•LDP ind[,ARn]•LDP #k–LPH:装载乘积寄存器高位字•LPH dma•LPH ind[,ARn]–LST:装载状态寄存器•LST #m,dma•LST #m,ind[,ARn]存储寄存器值•保存AR值(SAR)–SAR ARx, dma–SAR ARx, ind[, ARn] •保存PREG高位字(SPH)–SPH dma–SPH ind[, ARn]•保存PREG低位字(SPL)–SPL dma–SPL ind[, ARn]•保存状态寄存器ST0和ST1(SST)–SST #m, dma–SAR #m, ind[, ARn]堆栈操作•出栈至ACC低位字(POP )–POP•ACC低位字入栈(PUSH )–PUSH•出栈至数据存储器(POPD )–POPD dma–POPD, ind[, ARn]•数据存储器值入栈(PSHD )–PSHD dma–PSHD ind[, ARn]读写数据或程序存储器•数据存储器至数据存储器的块移动(BLDD )–BLDD #lk,dma–BLDD #lk,ind[, ARn]–BLDD dma ,#lk–BLDD ind ,#lk[, ARn] •程序存储器至数据存储器的块移动(BLPD )–BLPD #pma, dma–BLPD #pma, ind[, ARn] •片内数据存储器中的数据传送(DMOV )–DMOV dma–DMOV ind[, ARn]•长立即数写入数据存储器(SPLK )–SPLK #lk, dma–SPLK #lk, ind[, ARn]•读程序存储器(表读)(TBLR )–TBLR dma–TBLR ind[, ARn]•写程序存储器(表写)(TBLW )–TBLW dma–TBLW ind[, ARn]读写I/O单元•读I/O单元(IN )–IN dma, PA–IN ind, PA[, ARn]•写I/O单元(OUT )–OUT dma, PA–OUT ind, PA[, ARn]加法•左移加至ACC(ADD)–ADD dma [,shift]–ADD dma ,16–ADD ind [,shift[,ARn]]–ADD ind ,16[,ARn]–ADD #k–ADD #lk [,shift]•带进位位加至ACC (ADDC)–ADDC dma–ADDC ind [,ARn]•抑制符号扩展加至ACC (ADDS)–ADDS dma–ADDS ind [,ARn]•按TREG低4位规定左移加至ACC (ADDT)–ADDT dma–ADDT ind [,ARn]•加短立即数至当前AR(ADRK)–ADRK #k减法•左移后从ACC中减去(SUB)–SUB dma [,shift]–SUB dma ,16–SUB ind [,shift[,ARn]]–SUB ind ,16[,ARn]–SUB #k–SUB #lk [,shift]•带借位从ACC中减去(SUBB)–SUBB ind [,ARn]•条件减(SUBC):常用来实现除法–SUBC dma–SUBC ind [,ARn]•抑制符号扩展减(SUBS)–SUBS dma–SUBS ind [,ARn]•按TREG低4位左移后从ACC中减去(SUBT)–SUBT dma–SUBT ind [,ARn]•当前AR减去短立即数(SBRK)–SBRK #k•ACC减去PREG(SPAC)–SPAC•SUBC实现16位数除法的步骤–被除数(必须为正)置于累加器低位字中,且最高位放在bit15中,累加器高位字清零;–除数(必须大于0)放入数据存储单元中;–执行SUBC指令16次;–除的结果:商在累加器低位字;余数在累加器高位字。
乘法•简单乘(MPY)–MPY dma–MPY ind [,ARn]–MPY #k•乘且累加前次乘积(MPYA)–MPYA dma–MPYA ind [,ARn]•乘且减去前次乘积(MPYS)–MPYS dma–MPYS ind [,ARn]•无符号乘(MPYU)–MPYU dma–MPYU ind [,ARn]乘累加•乘且累加(MAC)–MAC pma,dma–MAC pma,ind ,[,ARn]•乘且累加,复制数据存储器内容至下一单元(MACD)–MACD pma,dma–MACD pma,ind ,[,ARn]平方累加/减•累加前次乘积再平方(SQRA)–SQRA ind [,ARn]•减去前次乘积再平方(SQRS)–SQRS dma–SQRS ind [,ARn]基本逻辑运算•与(AND)–AND dma–AND ind [,ARn]–AND #lk [,shift]–AND #lk ,16•或(OR)–OR dma–OR ind [,ARn]–OR #lk [,shift]–OR #lk ,16•异或(XOR)–XOR dma–XOR ind [,ARn]–XOR #lk [,shift]–XOR #lk ,16•求反(CMPL)–CMPL•求负(NEG)–NEG移位•循环移位–ROL–ROR•算术移位–SFL–SFR•移位存储–SACH•SACH dma [,shift2];shift2表明全部32位左移0~7位•SACH ind [,shift2 ][,ARn]–SACL•SACL dma [,shift2]•SACL ind [,shift2 ][,ARn]•累加器特殊装载(ZALR)–ZALR dma–ZALR ind [,ARn]•累加器规格化(NORM )–NORM ind无条件转移和条件转移•无条件转移(B)– B pma[,ind ,[,ARn]]•无条件转移至ACC低位字指定的ROM单元(BACC)–BACC•(当前AR)<>0,转移(BANZ)–BANZ pma[,ind ,[,ARn]] •条件转移(BCND)–BCND pma,cond1 [,cond2][,……]子程序调用及返回•调用累加器低位字指定地址处的子程序(CALA)–CALA•无条件调用(CALL)–CALL pma[,ind ,[,ARn]]•条件调用(CC)–CC pma,cond1 [,cond2][,……]•无条件返回(RET)–RET•条件返回(RETC)–RETC cond1 [,cond2][,……]中断程序调用及返回•软中断指令(INTR k)–INTR k•不可屏蔽中断(NMI)–NMI•软件陷阱中断(TRAP)–TRAP位操作•位测试(BIT)–BIT dma,bit code–BIT ind ,bit code [,ARn] •测试TREG规定位(BITT)–BITT dma–BITT ind [,ARn]•位清零(CLRC)–CLRC control bit•位置位(SETC)–SETC control bit辅助操作指令•空操作–IDLE:以省电方式等中断•IDLE–NOP•NOP•重复执行下条指令(RPT)–RPT dma–RPT ind [,ARn]–RPT #k•设置PREG输出移位方式(SPM)–SPM constant:设置ST1的PM位,constant取值位0~3。
•比较当前AR和AR0–CMPR CM:CM可取0,1,2,3,分别测试相等、小于、大于和不等于四种情况。