📄 dsp中利用ccs5000程序.txt
字号:
一,sin(x)的计算
算法
; 计算sin(x)利用泰勒级数展开为
;sin(x)=x-x3/3!+x5/5!-x7/7!+x9/9!=x(1-(x2/6)(1-(x2/20)(1-(x2/42)(1-x2/72))))
;cos(x)=1-x2/2!+x4/4!-x6/6!+x8/8!=1-x2/2(1-x2/12(1-x2/30(1-x2/56)))
;c1=32768/72 c2=32768/42 c3=32768/20 c4=32768/6
sin(x)*32768=x(32768-(x2/6)(32768-(x2/20)(32768-(x2/42)(32768- x2*32768/72))))
y=32768*x y2=(32768*x)2=32768*(32768*x2)
d_x=32768*x2= (2*y2)/65536
;kx1=32768-x2*32768/72= 32768-x2*c1
=(32768*65536-32768*x2*2*c1)/65536
=(32768*65536-d_x*c1*2)/65536
kx2=32768-x2/42(32768- x2/72*32768)
=32768-(x2/42)*kx1
=(32768*65536-32768*x2*2*kx1/42)/65536
=(32768*65536-d_x*kx1*2/42)/65536
=(32768*65536-((d_x*kx1*2)/65536)*32768*2/42)/65536
=(32768*65536-((d_x*kx1*2)/65536)*c2*2)/65536
kx3=32768-x2/20(32768-x2/42(32768- x2/72*32768))
=32768-(x2/20)*kx2
=(32768*65536-32768*x2*2*kx2/20)/65536
=(32768*65536-d_x*kx2*2/20)/65536
=(32768*65536-(d_x*kx2*2/65536)*c3*2)/65536
kx4=32768-x2/6(32768-x2/20(32768-x2/42(32768- x2/72*32768)))
=32768-x2/6*k3
=(32768*65536-(d_x*k3*2/65536)*c4*2)/65536
sin(x)*32768=x*kx4=(32768*x*kx4)/32768=y*kx4*2/65536
例:
.title "sinx.asm"
.mmregs
.def _c_int00
STACK .usect "STACK",10
y .usect "sin_vars",1
d_x .usect "sin_vars",1
d_temp .usect "sin_vars",1
d_sinx .usect "sin_vars",1
s .usect "sin_vars",1
d_coeff .usect "coeff",4
.data
table: .word 01c7H,030bH,0666H,1556H ;系数表
.sect ".vectors"
_c_int00: B start
.text
start: STM #STACK+10,SP
LD #y,DP
ssbx frct ;置frct位,执行乘法时左移一位,相当于乘2
stm #d_coeff,ar5
rpt #3
mvpd #table,*ar5+ ;把系数c1,c2,c3,c4传送到数据存储区
stm #d_coeff,ar3 ;AR3指向c1
stm #y,ar2
st #6487H,*ar2 ;输入一个角度值 y=x*32768
stm #s,ar4
st #7fffh,*ar4 ;(*AR4)=32768
squr *ar2+,a ;A=2*y2,AR2指向d_x
st a,*ar2 ;d_x=2*y2/65536
||ld *ar4,b ;B=32768*65536
masr *ar2+,*ar3+,b,a ;A=(32768*65536-d_x*c1*2), T=d_x
;AR2指向d_temp ,AR3指向c2
mpya a ;A=T*A(32--16)= d_x*kx1*2
sth a,*ar2 ;d_temp=(d_x*kx1*2)/65536
masr *ar2-,*ar3+,b,a
;A=32768*65536-((d_x*kx1*2)/65536)*c2*2
;AR2指向d_x ,AR3指向c3
mpya *ar2+ ;B=(*AR2)*A(32—16)= d_x*kx2*2
; AR2指向d_temp
st b,*ar2 ; d_temp=(d_x*kx2*2)/65536
||ld *ar4,b ; B=32768*65536
masr *ar2-,*ar3+,b,a
;A=32768*65536-((d_x*kx2*2)/65536)*c2*2
; AR2指向d_x ,AR3指向c4
mpya *ar2+ ; B=(*AR2)*A(32—16)= d_x*kx3*2
; AR2指向d_temp
st b,*ar2 ; d_temp=(d_x*kx3*2)/65536
||ld *ar4,b ; B=32768*65536
masr *ar2,*ar3,b,a
;A=32768*65536-((d_x*kx3*2)/65536)*c2*2
mpya y ;B=y*A(32—16)= y*kx4*2
sth b,d_sinx ;d_sinx=B(31—16)=y*kx4*2/65536
ends b ends
.end
命令文件:
MEMORY
{
PAGE 0: EPROM: org=1000H len=1000h
VECS: org=0xff80 len=0x80
PAGE 1: SPRAM: org=0080H len=0020H
DARAM: org=0100H len=0010H
}
SECTIONS
{
.text: > EPROM PAGE 0
.vectors: >VECS PAGE 0
.data: > EPROM PAGE 0
STACK: > SPRAM PAGE 1
sin_vars: > DARAM PAGE 1
coeff: > DARAM PAGE 1
}
二,定时器使用
源程序:
.version 5410
.title "timer"
.mmregs
.def _c_int00
k_tcr_soft .set 0b<<11
k_tcr_free .set 0b<<10
k_tcr_psc .set 0000b<<6
k_tcr_trb .set 1b<<5
k_tcr_tss .set 0b<<4
k_tcr_tddr .set 1001b<<0
k_tcr .set k_tcr_soft|k_tcr_free|k_tcr_psc|k_tcr_trb|k_tcr_tss|k_tcr_tddr
.sect ".vectors"
reset:
b _c_int00
.text
_c_int00:
ld #0,dp
stm#0,imr
stm #200h,sp
orm #010h,tcr;停止定时器
stm #0b,clkmd;
tsstatus:ldm clkmd,a;
and #1b,a;
bc tsstatus,aneq;
stm #07007h,clkmd;0111 0000 0000 0111
stm #00fffh,bscr;0111 1111 1111 1111,clkout=dsp_clk/4
stm #10h,prd;设置定时器周期寄存器
stm #k_tcr,tcr;设置定时器控制寄存器
stm #08h,imr
rsbx intm
end:
nop
bd end
nop
nop
.end
命令文件:
MEMORY
{
PAGE 0: VECS: org=0ff80h,len=80h
ROM : org=6000h,len=1000h
DATA: org=7000h,len=1000h
PAGE 1: RAM: org =200h,len=100h
}
SECTIONS
{
.vecorts:> VECS PAGE 0
.text:>ROM PAGE 0
.data :>DATA PAGE 0
.bss:> RAM PAGE 1
}
三,FIR滤波器设计
例:
.title "FIR.asm"
.mmregs
.def _c_int00
x .usect "x",46 ;循环寻址的基地址的低N位必须是0
h .usect "h",46
y .usect "y",256
.data
fir_coff_table:
.word -26, -91, -61, 77, 181, 85, -173
.word -309, -88, 338, 483, 48, -613, -720
.word 78, 1094, 1082, -406, -2129, -1870, 1569
.word 6889, 10892, 10892, 6889, 1569, -1870, -2129
.word -406, 1082, 1094, 78, -720, -613, 48
.word 483, 338, -88, -309, -173, 85, 181
.word 77, -61, -91, -26
.sect “.vectors”
_c_int00: b start
.text
start: stm #x,ar3
rptz a, #45
stl a,*ar3+ ;初始化x缓冲区-->全部填0
stm #h,ar3
rpt #45
mvpd fir_coff_table,*ar3+ ;把h(n)装载到数据缓冲区
stm #2000h,ar2;数据存储器的2000h为256个采样值的起始地址
stm #x,ar3 ;ar3为x(n)的指针
stm #h,ar4 ;ar4为h(n)的指针
stm #y,ar5 ;ar5为y(n)的指针 y(n)=x(n)*h(n)
stm #x+45,ar6 ;ar6为LTD指令的间接寻址指针
ssbx frct
stm #46,bk ;Fir缓冲区大小
stm #255,brc ;y(n)256点输出
rptb fir_loop-1
stm #1,ar0
ld *ar2+,a ;装载输入数据
stl a,*ar3
fir_filter:
rptz a,#45
mac *ar3+0%,*ar4+0%,a
sth a,*ar5+
stm #x+45,ar6 ;ar6为LTD指令的间接寻址指针
rpt #45
ltd *ar6-
fir_loop: b fir_loop
.end
命令文件:
-o fir.out
-m fir.map
MEMORY {
PAGE 0: EPROM: org=1000H len=1000H
PAGE 1: RAM: org=200H len=1000H
}
SECTIONS
{
.text: > EPROM PAGE 0
.data: > EPROM PAGE 0
.bss: > RAM PAGE 1
x: align(64) { } > RAM PAGE 1
h: align(64) { } > RAM PAGE 1
y: align(256) { } > RAM PAGE 1
}
四,仿真FIR滤波器数据生成
在ti\c5400\cgtools\lib目录下,把rts.lib加入工程;
例:
#include "stdio.h"
#include "math.h"
main()
{
int i;
float f[256];
FILE *fp;
if((fp=fopen("d:\\firdinput.dat","w+"))==NULL)
{
printf("can't open file!\n");
exit(0);
}
for (i=0;i<=255;i++)
{
f[i]=(cos(2*3.14159265*i*1000/10000)+cos(2*3.14159265*i*3000/10000))/4;
fprintf(fp,"%ld\n",(long)(f[i]*32767));
}
fclose(fp);
}
五,正弦信号发生器
例 .title "sin_wave.asm"
.mmregs
.def _c_int00
drr20 .set 20h;McBSP0
drr10 .set 21h
dxr20 .set 22h
dxr10 .set 023h
spsa0 .set 38h
mcbspc0 .set 39h
spcr10 .set 00h
spcr20 .set 01h
rcr10 .set 02h
rcr20 .set 03h
xcr10 .set 04h
xcr20 .set 05h
srgr10 .set 06h
srgr20 .set 07h
mcr10 .set 08h
mcr20 .set 09h
rcera0 .set 0ah
rcerb0 .set 0bh
xcera0 .set 0ch
xcerb0 .set 0dh
pcr0 .set 0eh
;.def d_xs,d_sinx,d_xc,d_cosx,sinx,cosx
sin_x .usect "sin_x",360
d_xs .usect "sin_vars",1
d_squr_xs .usect "sin_vars",1
d_temp_s .usect "sin_vars",1
d_sinx .usect "sin_vars",1
d_l_s .usect "sin_vars",1
d_coef_s .usect "coefs",4
d_xc .usect "cos_vars",1
d_squr_xc .usect "cos_vars",1
d_temp_c .usect "cos_vars",1
d_cosx .usect "cos_vars",1
d_l_c .usect "cos_vars",1
d_coef_c .usect "coefc",4
STACK .usect "STACK",10H
k_theta .set 286 ;theta=pi/360 (0.5 deg)
.data
table_s: .word 01c7h,030bh,0666h,1556h
table_c: .word 0249h,0444h,0aabh,4000h
.sect ".vectors"
_c_int00: b start
stm #STACK+10H,SP
nmi: rete
nop
nop
nop
.space 18*4*16
brint0:
b receive
nop
nop
btint0:
b transmit
nop
nop
.text
start: stm #STACK+10H,SP
stm #0,imr
stm #d_coef_c,ar5
rpt #3
mvpd #table_c,*ar5+
stm #d_coef_s,ar5
rpt #3
mvpd #table_s,*ar5+
stm #k_theta,ar0 ;
stm #0,ar1
stm #sin_x,ar6
stm #90,brc
rptb loop1-1
ldm ar1,a
ld #d_xs,dp
stl a,*(d_xs)
stl a,*(d_xc)
call sinx
call cosx
ld #d_sinx,dp
stm #d_sinx,ar3
stm #d_cosx,ar4
ssbx frct
mpy *ar3,*ar4,a
stm #7fffh,t
mpya a
sth a,1,*ar6+
mar *ar1+0
loop1: stm #sin_x+89,ar7 ;sin91(deg)--sin179(deg)
stm #88,brc
rptb loop2-1
ld *ar7-,a
stl a,*ar6+
loop2: stm #180,brc
stm #sin_x,ar7
rptb loop3-1
ld *ar7+,a
neg a
stl a,*ar6+
loop3:
nop
ld #00,dp
STM #spcr10,spsa0 ;子地址寄存器指向串行口控制寄存器1
stm #00h,mcbspc0 ;spcr10=00,接收复位
stm #spcr20,spsa0 ; 子地址寄存器指向串行口控制寄存器2
stm #200h,mcbspc0 ;spcr20=200h,free=1,发送复位
stm #pcr0,spsa0 ; 子地址寄存器指向串行口引脚控制寄存器
stm #0ch,mcbspc0 ;pcr0=0ch;xioena=0,fsxp=1,fsrp=1
stm #spcr10,spsa0 ; 子地址寄存器指向串行控制口寄存器1
stm #00h,mcbspc0 ;spcr10=00;接收复位
stm #spcr20,spsa0 ;子地址寄存器指向串行控制口寄存器2
stm #00h,mcbspc0 ;spcr20=00h,free=0,发送复位
stm #rcr10,spsa0 ;子地址寄存器指向串行口接收控制寄存1
stm #40h,mcbspc0 ;rcr10=40;rfrlen1=000000,1字每帧
;rwdlen1=010,16位每字
stm #rcr20,spsa0 ;子地址寄存器指向串行口接收控制寄存2
stm #00h,mcbspc0 ;rphase=0,单相帧 ,rcompand=00,
stm #xcr10,spsa0; 子地址寄存器指向串行口发送控制寄存1
stm #40h,mcbspc0;xcr10=40;xfrlen1=000000,1字每帧
;xwdlen1=010,16位每字
stm #xcr20,spsa0; 子地址寄存器指向串行口发送控制寄存2
stm #00h,mcbspc0;xphase=0,μ¥?à??,xcompand=00,
rpt #100;wait
nop
andm #0ff3fh,54h;interupt from serial
stm #0,dxr10 ; 不请求二次通信
stm #spcr10,spsa0;启动串行口
stm #01h,mcbspc0;
stm #spcr20,spsa0;
stm #201h,mcbspc0;
stm #0ffffh,ifr ;清除中断标志位
call requst
stm #0180h,dxr10;0000 0001 1000 0000 对contol1写
;15位DAC,没有二次通行,软件复位AD50
call wait1 ;
call requst ;调用请求二次通信子程序
stm #0210h,dxr10;0000 0010 0001 0000 对contol 2写,
;ADC为16位
call wait1 ;
call requst ;调用二次通信子程序
stm #0460h,dxr10;0000 0100 0110 0000 对contol 4写
;采样率10.7k
call wait1 ;
stm #000h,dxr10;
;stm #010h,imr
;rsbx intm
stm #360,bk
stm #60,ar0
stm #sin_x,ar4
nop
wait2: ldm ifr,a ;等待中断
and #010h,a;
bc wait2,aeq;
stm #0ffffh,ifr;清中断标志位
call receive ; 调用接收服务子程序
b wait2 ;等待下一次接收
requst: ;二次通信
stm #01h,dxr10;请求二次通信
wait1: ldm ifr,a ;
and #010h,a ;判断是否发送完毕
bc wait1,aeq;
stm #0ffffh,ifr;清中断标志位
ld drr10,a; 读数据
ret
receive:
ld drr10,a
andm #0fffeh,*ar4
mvdk *ar4+0%,dxr10
ret
transmit:
rete
sinx:
ssbx frct
stm #d_coef_s,ar3
stm #d_xs,ar2
stm #d_l_s,ar4
st #7fffh,*ar4
squr *ar2+,a ;A=x*x
st a,*ar2 ;d_squr_x=x*x
||ld *ar4,b ;B=1 B等于1乘以32768
masr *ar2+,*ar3+,b,a ;A=1-x*x/72 T=x*x
mpya a ;A=T*A(31--16)=x*x(1-x*x/72)
sth a,*ar2 ;d_temp=x*x(1-x*x/72)
masr *ar2-,*ar3+,b,a
mpya *ar2+
st b,*ar2
||ld *ar4,b
masr *ar2-,*ar3+,b,a
mpya *ar2+
st b,*ar2
||ld *ar4,b
masr *ar2-,*ar3+,b,a
mpya d_xs
sth b,d_sinx
ret
cosx: ssbx frct
stm #d_coef_c,ar3
stm #d_xc,ar2
stm #d_l_c,ar4
st #7fffh,*ar4
squr *ar2+,a ;A=x*x
st a,*ar2 ;d_squr_x=x*x
||ld *ar4,b ;B=1 B等于1乘以32768
masr *ar2+,*ar3+,b,a ;A=1-x*x/72 T=x*x
mpya a ;A=T*A(31--16)=x*x(1-x*x/72)
sth a,*ar2 ;d_temp=x*x(1-x*x/72)
masr *ar2-,*ar3+,b,a
mpya *ar2+
st b,*ar2
||ld *ar4,b
masr *ar2-,*ar3+,b,a
sfta a,-1,a
neg a
mpya *ar2+
mar *ar2+
add *ar4,16,b
sth b,*ar2
ret
.end
命令文件:
MEMORY
{
PAGE 0: EPROM: org=1000H len=1000h
VECS: org=0ff80H len=0080H
PAGE 1: SPRAM: org=0080H len=0040H
DARAM1: org=0120H len=0008H
DARAM2: org=0128H len=0008H
DARAM3: org=0200H len=0200H
}
SECTIONS
{
.text: > EPROM PAGE 0
.data: > EPROM PAGE 0
STACK: > SPRAM PAGE 1
sin_vars: > DARAM1 PAGE 1
coef_s: > DARAM1 PAGE 1
cos_vars: > DARAM2 PAGE 1
coef_c: > DARAM2 PAGE 1
sin_x: align (512) { } > DARAM3 PAGE 1
.vectors: > VECS PAGE 0
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -