开始AR1=#x;AR2=19;A=(AR1)+A;AR2=AR2-1NAR2=0?Yy=AL;结束
4.在进行DSP的程序设计时,如果程序中要使用堆栈,则必须要先进行设置。下面程序段是对堆栈的设置,完成的功能是在RAM空间开辟了200个字的空间作为堆栈区,请完成程序段。(4分)
size .set (1) stack .usect “STACK”, size ;…
STM #stack+ (2) , SP 5.采用TMS320C54xDSP的定时器0产生方波,DSP主频为40MHz。要求:周期为20s的方波发生,从DSP的通用I/O引脚XF输出,定时中断周期为10ms,需要中断1000次,输出端XF引脚电平取一次反。 请在空处填写正确指令完成下面程序段。(12分)
;初始化定时器0,定时为10ms,本设置中TDDR=9,PRD=39999,主频为40MHz ;T=25ns
;定时长度计算公式:T=CLKOUT* (TDDR+1) * (PRD+1)=10ms ;定时器0寄存器地址 TIM0 .set 0024H PRD0 .set 0025H TCR0 .set 0026H
;K_TCR0:设置定时器控制寄存器的内容 K_TCR0_SOFT .set 0b<<11 ;Soft=0 K_TCR0_FREE .set 0b<<10 ;Free=0 K_TCR0_PSC .set 1001b<<6 ;PSC=9H K_TCR0_TRB .set 1b<<5 ;TRB=1 K_TCR0_TSS .set 0b<<4 ;TSS=0
K_TCR0_TDDR .set 1001b<<0 ;TDDR=9
K_TCR0 .set K_TCR0_SOFT| K_TCR0_FREE| K_TCR0_PSC
| K_TCR0_TRB| K_TCR0_TSS| K_TCR0_TDDR ;初始化定时器0 STM #039999,TIM0
第26 页(共 2 页)
STM #039999,PRD0 STM (1) ,TCR0 ;启动定时器0中断 RET ;定时器0的中断服务子程序 t0_flag .usect “vars”,1 ;当前XF输出电平标志位,
;若t0_flag=1,则XF=1
;若t0_flag=0,则XF=0 t0_counter .usect “vars”,1 ;计数长度变量
time0_rev: PSHM TRN PSHM T PSHM ST0 (2) RSBX CPL ADDM # -1,*(t0_counter) CMPM *(t0_counter),#0 BC (3) ,NTC ;NTC表示TC为0 ST #1000, (4) BITF t0_flag, #1 BC xf_out, NTC SSBX XF ST #0, t0_flag B still_wait xf_ out:
(5) ST #1, t0_flag Still_wait:
POPM ST1
POPM (6) POPM T POPM TRN RETE 6.用C55x汇编语言实现计算 y?
?axii?14i 的程序。(10分)
答:mpym *AR0+, *AR1+, AC0
mpym *AR0+, *AR1+, AC1 add AC1, AC0
mpym *AR0+, *AR1+, AC1 add AC1, AC0
mpym *AR0+, *AR1+, AC1 add AC1, AC0
或者:
mpym *AR0+, *AR1+, AC0
第27 页(共 2 页)
||rpt #2
macm *AR0+, *AR1+, AC0
7.用C55x汇编语言实现计算 y1?x1*a1?x2*a2的程序。(10分)
答:mpym *AR0+, *AR1+, AC3 masm *AR0+, *AR1+, AC3
8.以8点的FFT为例,用C55x的汇编语言实现FFT的算法,并且解释该算法的实现方法。(20分)
答: .sect \
_fft:
aadd #(ARGS-Size+1),SP ; Adjust stack for local vars
mov mmap(ST1_55),AR2 ; Save ST1,ST3 mov mmap(ST3_55),AR3 mov AR2,fft.d_ST1 mov AR3,fft.d_ST3
btst @#0,T1,TC1 ; Check SCALE flag set
mov #0x6340,mmap(ST1_55) ; Set CPL,XF,SATD,SXAM,FRCT (SCALE=1) mov #0x1f22,mmap(ST3_55) ; Set: HINT,SATA,SMUL xcc do_scale,TC1
mov #0x6300,mmap(ST1_55) ; Set CPL,XF,SATD,SXAM (SCALE=2) do_scale
mov T2,fft.d_T2 ; Save T2 || mov #1,AC0
mov AC0,fft.d_L ; Initialize L=1 || sfts AC0,T0 ; T0=EXP mov AC0,fft.d_N ; N=1< mov XAR1,XCDP ; CDP = pointer to U[] mov XSP,XAR4 add #fft.d_temp,AR4 ; AR4 = pointer to temp mov XAR0,XAR1 ; AR1 points to sample buffer mov T0,T1 mov XAR0,XAR5 ; Copy externd bits to XAR5 outer_loop ; for (L=1; L<=EXP; L++) mov fft.d_L,T0 ; note: Since the buffer is || mov #2,AC0 ; arranged in re,im pairs sfts AC0,T0 ; the index to the buffer neg T0 ; is doubled || mov fft.d_N,AC1 ; But the repeat coutners sftl AC1,T0 ; are not doubled mov AC0,T0 ; LE=2< 第28 页(共 2 页) mov AC0,AR0 ; LE1=LE>>1 || sfts AC0,#-1 sub #1,AC0 ; Init mid_loop counter mov mmap(AC0L),BRC0 ; BRC0=LE1-1 sub #1,AC1 ; Init inner loop counter mov mmap(AC1L),BRC1 ; BRC1=(N>>L)-1 add AR1,AR0 mov #0,T2 ; j=0 || rptblocal mid_loop-1 ; for (j=0; j add AR0,AR5 ; AR5 = pointer to X[id].re add #1,AR5,AR2 ; AR2 = pointer to X[id].im add AR1,AR3 ; AR3 = pointer to X[i].re || rptblocal inner_loop-1 ; for(i=j; i :: mpy *AR2-,*CDP+,AC1 ; -X[id].im*U.im)/SCALE masr *AR5-,*CDP-,AC0 ; AC1=(X[id].im*U.re :: macr *AR2+,*CDP-,AC1 ; +X[id].re*U.im)/SCALE mov pair(hi(AC0)),dbl(*AR4); AC0H=temp.re AC1H=temp.im || mov dbl(*AR3),AC2 xcc scale,TC1 || mov AC2>>#1,dual(*AR3) ; Scale X[i] by 1/SCALE mov dbl(*AR3),AC2 scale add T0,AR2 || sub dual(*AR4),AC2,AC1 ; X[id].re=X[i].re/SCALE-temp.re mov AC1,dbl(*(AR5+T0)) ; X[id].im=X[i].im/SCALE-temp.im || add dual(*AR4),AC2 ; X[i].re=X[i].re/SCALE+temp.re mov AC2,dbl(*(AR3+T0)) ; X[i].im=X[i].im/SCALE+temp.im inner_loop ; End of inner loop amar *CDP+ amar *CDP+ ; Update k for pointer to U[k] || add #2,T2 ; Update j mid_loop ; End of mid-loop sub #1,T1 add #1,fft.d_L ; Update L bcc outer_loop,T1>0 ; End of outer-loop mov fft.d_ST1,AR2 ; Restore ST1,ST3,T2 mov fft.d_ST3,AR3 mov AR2,mmap(ST1_55) mov AR3,mmap(ST3_55) mov fft.d_T2,T2 第29 页(共 2 页) aadd #(Size-ARGS-1),SP ; Reset SP ret .end 9.已知事件管理器通用定时器工作于连续递增计数模式,且定时器的使能信号和定时器时钟信号如下图所示,当周期寄存器的值TxPR=4时,画出通用定时器连续递增计数模式的示意图(至少画出2个计数周期)。 10.已知ADC模块中的排序器工作于启动/停止操作,使用触发信号1启动3个自动转换I1、I2、I3,触发信号2启动3个自动转换V1、V2、V3。 (1)MAX CONV1的值应该设置为_______________。 (2)在ADC输入通道选择排序控制寄存器设置表中填入相应的转换值。 Bit15~12 X X X X X X Bit11~8 X X Bit7~4 X X Bit3~0 CHSELSEQ1 CHSELSEQ2 CHSELSEQ2 CHSELSEQ2 11.给出函数 int fn(long l1,longl2,long l3,int *p4,int*p5,int *p6,int *p7,int*p8,int i9,int i10)中所使用的寄存器。(10分) 12.设VC5509 DSP定时器输入时钟100MHz,如果要求定时器输出中断信号或同步事件信号的频率为1000次每秒,假设将TDDR设为9,则 PRD应为多少 ,写出相关公式 (3分) 13.C55x DSP复位期间或复位之后输出的时钟频率如何?(2分) 第30 页(共 2 页) 第31 页(共 2 页)