|
*******************************************************************
基于TMS320C5409中低速数据采集系统:数据滤波程序代码
硬件组成:
DSP芯片:TMS320C5409
AD转换器:TLV1571
DA转换器:TLVTLC7528
Flash:SST29LE010
*******************************************************************
.mmregs .ref filter_start K_DATA_SIZE .set 256 ;输入数据个数 K_BUFFER_SIZE .set 8 ;缓冲大小,必须是大于a和b并且是2的整数次幂 K_STACK_SIZE .set 256 ;堆栈大小 K_A .set 3 ;滤波器a参数的个数 K_B .set 4 ;滤波器b参数的个数 K_CIR .set K_BUFFER_SIZE
STACK .usect "stack",K_STACK_SIZE SYSTEM_STACK .set K_STACK_SIZE+STACK
DATA_DP .usect "filter_vars",0 filterdata .usect "filter_vars",K_DATA_SIZE bufferdatay .usect "filter_vars",K_BUFFER_SIZE*2 bufferdatax .usect "filter_vars",K_BUFFER_SIZE*2 .data .global inputdata
.text .asg AR2,ORIGIN .asg AR3,INPUT .asg AR4,FILTER .asg AR5,OUTPUT START: SSBX FRCT SSBX INTM LD #DATA_DP,DP STM #STACK,SP CALL filter_start NOP NOP NOP LOOP B LOOP
.def b1,b2,b3,a1,a2 .def filter_start b1 .set 1456H ;b1=0.1589 b2 .set 3D07H ;b2=0.4768 b3 .set 3D07H ;b3=0.4768 b4 .set 1456H ;b4=0.1589 a1 .set -103AH ;a1=-0.1268 a2 .set 430FH ;a2=0.5239 a3 .set -1016H ;a3=-0.1257 .text filter_start: STM #K_CIR,BK STM #1,AR0 ;设置循环缓冲区大小和步长 STM #inputdata,ORIGIN STM #bufferdatax,INPUT STM #bufferdatay,FILTER STM #filterdata,OUTPUT ;初始化 RPT #K_A-1 ;系数 a1,a2,a3 的个数 MVDD *ORIGIN+,*INPUT+0% ;初始化头3 个Ys STM #bufferdatax,INPUT ;设置初始化滤波数据 RPT #K_A-1 ;系数a1,a2,a3的个数 MVDD *INPUT+0%,*FILTER+0% ;初始化3 个Ys STM #bufferdatay,FILTER STM #bufferdatax,INPUT ;滤波 STM #K_DATA_SIZE-3-1,BRC ;设置块循环计数器 RPTB filter_end-1 ;头3个值直接通过 MVDD *ORIGIN+,*INPUT RPT #K_B-1-1 ;系数b1,b2,b3, b4的个数 MAR *INPUT-0% ;调整输入到相应位置 MPY *INPUT+0%,#b4,B ;计算B=b4*x(i) LD B,A MPY *INPUT+0%,#b3,B ;计算B=b3*x(i+1) ADD B,A MPY *INPUT+0%,#b2,B ;计算B=b2*x(i+2) ADD B,A MPY *INPUT+0%,#b1,B ;计算B=b1*x(i+3) ADD B,A ;计算y(x+3)=A MPY *FILTER+0%,#a3,B ;计算B=y(i)*a3 ADD B,A ;计算A=A+B MPY *FILTER+0%,#a2,B ;计算B=y(i+1)*a2 ADD B,A ;计算A=A+B MPY *FILTER+0%,#a1,B ;计算B=y(i+2)*a1 ADD B,A ;计算y(x+3)=A+B STH A,*FILTER-0% ;为下一次滤波保存数据 STH A,*OUTPUT+ ;输出数据到OUTPUT的下一个单元 MAR *FILTER-0% ;调整滤波器到相应位置 filter_end: NOP RET .end ;程序代码结束
*******************************
vectors.asm为以上程序需要的文件
*******************************
.sect ".DISPLAY1" .ref start .def reset
k_stack_size .set 200 k_stack .usect "stack_section",k_stack_size system_stack .set k_stack+k_stack_size
.word 08aah ;INDICATE 8BITS PARALLEL BOOT MODE .word 7fffh ;VALUE FOR SWWSR .word 0f000h ;VALUE FOR BSCR .word 0000h ;xpc for entry point .word 0200h ;pc for entry point .word 01e0h ;size of first section .word 0000h ;xpc for first section .word 0100h ;pc for first section
reset: b start stm #3000h,sp nmi: rete nop nop nop
sint17 .space 4*16 sint18 .space 4*16 sint19 .space 4*16 sint20 .space 4*16 sint21 .space 4*16 sint22 .space 4*16 sint23 .space 4*16 sint24 .space 4*16 sint25 .space 4*16 sint26 .space 4*16 sint27 .space 4*16 sint28 .space 4*16 sint29 .space 4*16 sint30 .space 4*16
int0: rete nop nop nop int1: rete nop nop nop int2: rete nop nop nop tint0: rete nop nop nop brint0: rete nop nop nop bxint0: rete nop nop nop dmac0: rete nop nop nop dmac1: rete nop nop nop int3: rete nop nop nop hpint: rete nop nop nop dmac2: rete nop nop nop bxint1: rete nop nop nop dmac4: rete nop nop nop dmac5: rete nop nop nop RESERVED: .space 880H
|