⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 my.asm

📁 dsp滤波程序。基于TMS5320C54XX
💻 ASM
字号:

************************************************************
***************************************************
********************** BPF.asm ***********************
************************************************************
				.mmregs
            	.def	jump
            	.def    start
            	
K_SAMPLE_NUM	.set	256
				;设置保存采样数据的点数
K_DATA_SIZE		.set	256
				;输入数据点数
K_BUFFER_SIZE	.set    32
				;缓冲大小,必须大于a向量和b向量的个数综合,并且必须是2的整数次幂


K_B				.set	31		;b向量的个数
K_CIR			.set	K_BUFFER_SIZE

DATA_DP			.usect	"filter_vars",0
out_data		.usect	"out_data",K_SAMPLE_NUM
			;A/D读入的数据保存位置,大小为K_SAMPLE_NUM,用来保存一批数据,
			;以便查看采样是否正确,可以提供需要分批处理数据的程序调用,例如FFT.
			;可以用ARX来指定数据的首地址
filterdata		.usect	"filter_vars",K_DATA_SIZE
				;滤波后的数据输出位置,大小为K_DATA_SIZE,用来查看滤波后的数据
bufferdatax		.usect	"filter_vars",K_BUFFER_SIZE*2   ;循环缓冲区Y

in_data			.usect	"in_vars",1
d_cr0_send		.usect	"cr_send",1	
d_cr1_send		.usect	"cr_send",1	

				;定义2个状态字,此状态字就是需要开始写入A/D的初值
d_temp			.usect	"temp",1	;存放临时数据
k_cr0_send		.set	0080h       ;初始化两个状态字的值
k_cr1_send	    .set	0100h                            

**************** 滤波器系数 *************************
a0        .set     4BH
a1        .set     1DH     
a2        .set   -0A4H
a3        .set    196H
a4        .set     34H
a5        .set   -137H
a6        .set    0F2H
a7        .set   -498H
a8        .set   -144H
a9        .set    766H
a10       .set    -45H
a11       .set    83BH
a12       .set    1DEH
a13       .set  -2635H
a14       .set  - 124H
a15       .set   361BH
a16       .set   -124H
a17       .set  -2635H
a18       .set    1DEH
a19       .set    83BH
a20      .set     -45H
a21      .set     766H
a22       .set   -144H
a23       .set   -498H
a24      .set     0F2H
a25      .set    -137H  	
a26       .set     34H
a27       .set    196H
a28      .set    -0A4H	
a29      .set      1DH
a30       .set     4BH

**********************  滤波器的指针的命名 **************
	.text
	.asg	AR2,ORIGIN
	.asg	AR3,INPUT
    .asg	AR5,OUTPUT

											
*********************************************************
*****************重新映射中断向量的变量******************
*********************************************************
K_IPTR			.set	000111000b<<07		;指向1C00H新的向量区
                ;IPTR是DSP内部PMST寄存器的高9位,用于指定中断向量表的位置.
                ; 位时全为1,此程序诶了调试,重新映射到地址1D00H处
K_TEMP			.set	1111111b
				;定义一个常数,用于以后于PMST的与操作,保持PMST的弟7为不变
D_PMST			.usect	"pmst",1									
				
				.sect	"prog"
start:			
                SSBX	FRCT	;所有运算纯小数或纯正数
                LDM		PMST,A	;取出PMST的值,放入A.改变PMST的高9位,再放入PMST
				AND		#K_TEMP,A
				OR		#K_IPTR,A
				STLM	A,PMST		

*********************************************************
*****************       定时器设置、中断设置       ******
*********************************************************				
				stm		#0010h,TCR	;
				
				stm 	#0400h,PRD	;采样频率10k
				
				stm		#0825h,TCR
                stm		#0008h,IMR	;开中断
				nop
				nop	
				rsbx	intm			;允许中断	
				nop
				nop
*********************************************************
*****************     设置初始值       ******************
*********************************************************				
				stm		#d_temp,ar2
				stm		#d_cr0_send,ar1
				st		#k_cr0_send,*ar1+
				st		#k_cr1_send,*ar1
				stm		#d_cr0_send,ar1
                LD		#K_SAMPLE_NUM,A 	;用以计数,注意在滤波程序段工作时会被用作中间结果的容器

*********************************************************
*****************      写状态字        **********************
*********************************************************				
				portr  0ffffh,*ar2	;读别的端口使A/D转换器的CS位高
				rpt	#20
				nop
				nop
				nop
				portw	*ar1+,07FFFh   ;写A/D转换器的寄存器CR0
				rpt	#20
				nop
				nop
				portw	*ar1,07FFFh	;写A/D转换器的寄存器CR1
				portr 0ffffh,*ar2	;读别的端口,使A/D转换器的CS为高
				rpt	#20
				nop
				nop					;此时状态字写好A/D开始采样
*********************************************************
*****等中断用A作计数器,当写完K_SAMPLE_NUM个数据后 *******
********重置计数器A,并使AR5指向OUT_DATA的开始地址 *******
*********************************************************	

;				STL	A,AR7	;设置循环次数初值,用ar7保护A里的循环计数


**************   滤波器指针初始化 **********************
;				STM	#out_data,ORIGIN
;				STM #bufferdatax,INPUT
;               STM	#filterdata,OUTPUT	
				
				
							;设置循环缓冲区大小和步长
												;初始化												;a1,a2,a3的个数
;				RPT		#K_B-1
;				MVDD	*ORIGIN+,*INPUT+0%		;初始化头三个 X(i)
;				STM		#bufferdatax,INPUT	
										
WAIT:			NOP
				NOP
				BC	WAIT,ANEQ
				NOP
				STM	#out_data,ORIGIN
				STM #filterdata,OUTPUT
				STM	#K_DATA_SIZE,AR7
				
				LD  #K_SAMPLE_NUM,A
				B	WAIT
				NOP
*********************************************************
******中断服务程序,用以读转换信号,放入out_data***********
*********************************************************
jump:		
				LDM	AR7,	A	;计数
				SUB	#1,A
				STL	A,	AR7	

				rsbx	xf	;发出读信号,A/D转换器收到后开始下一次采样
				rpt	#5
				nop
				portr	07FFFh,*ORIGIN
							;读A/D转换数据,写在RAM的out_data数据段
							
				rpt	#5
				nop
				ssbx	xf  ;制高读信号
				nop
                portr	0FFFFh,*ar4  ;读别的端口,使A/D转换器的CS为高
				
					
		
filter_start:	
				STM		#K_CIR,BK
				STM		#1,AR0	
				ld      *ORIGIN+,a   ;将采样得到的数据左移6位,再把计算得到的数据右移4位
				sfta     a,+6
				AND     #0FFFFh,A
				stl      a,*INPUT

				nop
				nop
				RPT		#K_B-1-1				
				MAR		*INPUT-0%			

				nop
				nop					
				MPY  *INPUT+0%,#a30,B   
                LD  B,A
                MPY  *INPUT+0%,#a29,B   
                ADD  B,A
                MPY  *INPUT+0%,#a28,B   
                ADD  B,A
                MPY  *INPUT+0%,#a27,B   
                ADD  B,A
                MPY  *INPUT+0%,#a26,B   
                ADD  B,A
                MPY  *INPUT+0%,#a25,B   
                ADD  B,A
                MPY  *INPUT+0%,#a24,B   
                ADD  B,A
                MPY  *INPUT+0%,#a23,B   
                ADD  B,A
                MPY  *INPUT+0%,#a22,B   
                ADD  B,A
                MPY  *INPUT+0%,#a21,B   
                ADD  B,A
       			MPY  *INPUT+0%,#a20,B   
      			ADD  B,A
       			MPY  *INPUT+0%,#a19,B   
       			ADD  B,A
       			MPY  *INPUT+0%,#a18,B   
       			ADD  B,A
      			MPY  *INPUT+0%,#a17,B   
       			ADD  B,A               
       			MPY  *INPUT+0%,#a16,B   
       			ADD  B,A
       			MPY  *INPUT+0%,#a15,B   
      			ADD  B,A
      		    MPY  *INPUT+0%,#a14,B   
      			ADD  B,A
       			MPY  *INPUT+0%,#a13,B   
      		    ADD  B,A
       			MPY  *INPUT+0%,#a12,B   
       			ADD  B,A
       			MPY  *INPUT+0%,#a11,B   
       			ADD  B,A
       			MPY  *INPUT+0%,#a10,B   
       			ADD  B,A
       			MPY  *INPUT+0%,#a9,B   
       			ADD  B,A
       			MPY  *INPUT+0%,#a8,B   
       			ADD  B,A
       			MPY  *INPUT+0%,#a7,B   
       			ADD  B,A
       			MPY  *INPUT+0%,#a6,B   
       			ADD  B,A
       			MPY  *INPUT+0%,#a5,B   
       			ADD  B,A
       			MPY  *INPUT+0%,#a4,B   
      		    ADD  B,A
       			MPY  *INPUT+0%,#a3,B   
       			ADD  B,A
       			MPY  *INPUT+0%,#a2,B   
       			ADD  B,A
       			MPY  *INPUT+0%,#a1,B   
       			ADD  B,A
       			MPY  *INPUT+0%,#a0,B   
       			ADD  B,A			
	
			    sfta    a,-4
				add     #0800h,16,A    				
			    STH		A,*OUTPUT				;输出数据到OUTPUT的下一个单元
			
filter_end		NOP
				NOP
			
		
				nop
				nop

				portw	*OUTPUT+,0BFFFH         
				LDM	AR7,A	;将保存的循环次数赋给A,用于判断循环是否结束
				RSBX	intm	;开启中断,允许再次中断
				rete				;中断返回

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -