.data: {} > DATA PAGE 1 }
程序文件:
.data
table: .word 1,2,3,4 ; 变量初始化
.text
start: STM # 0,SWWSR ; 插入0个等待状态 问题:(1)MEMORY和SECTIONS的作用各是什么?
(2)标号“table”和“start”的地址分别是什么,分别位于程序空间还是数据空间?
答:定义一个自定义段名的程序段
604Ch
26.已知DSP的三个时钟引脚状态CLKMD1-CLKMD3=110,外部晶振=10MHz,参数设置表: CLKMD1 CLKMD2 CLKMD3 CLKMD复位时钟方式 值 0 0 0 E007H PLL×15 0 0 1 9007H PLL×10 0 1 0 4007H PLL×5 1 0 0 1007H PLL×2 1 1 0 F007H PLL×1 1 1 1 0000H 2分频 1 0 1 F000H 4分频 STM #00H,CLKMD Status:LDM CLKMD,A AND #01H,A BC Status,ANEQ
STM #4087H,CLKMD 问题:(1)DSP复位后,DSP的工作时钟是多少?
(2)执行上面的程序片段后,DSP的工作时钟是多少? 答:(1)10 MHz (5) (2)50MHz (5) 五、程序设计
1.实现计算z=x+y-w的程序。 .title \.mmregs
STACK .usect \.bss x,1
.bss y,1 .bss w,1 .bss z,1 .def start .data
第页(共 2 页) 31
table:.word 10,26,23 .text
start: STM #0,SWWSR
STM #STACK+10h,SP ;初始化堆栈指针SP STM #x,AR1 RPT #2 MVPD table,*AR1+;数据从程序存储器传送到数据存储器 CALL SUMB end: B end SUMB: LD @x,A ADD @y,A
SUB @w,A;实现减法运算 STL A,@z RET .end
2.实现对数组X[5]={1,2,3,4,5}的初始化,然后将数据存储器中的数组X[5]复制到数组Y[5]。最后实现数组X和数组Y中对应元素相乘并累加,即z=1*1+2*2+3*3+4*4+5*5
.mmregs
.bss x, 5 .bss y, 5 .bss z,1 .def start table:.word 1,2,3,4,5 .text
start: STM #x, AR1 RPT 4 MVPD table,*AR1+;从程序存储器传送到数据存储器数组X[5] STM # x, AR2 STM # y, AR3
RPT 4 MVDD *AR1,*AR3 ;从数据存储器数组X[5]传送到Y[5]
SSBX FRCT ;准备整数乘法
STM # x, AR2
STM # y, AR3 STM # z, AR4 RPTZ 4 MAC *AR2+,*AR3+,A STL A,*AR4 End: B end .end
第页(共 2 页) 32
3.写出计算y??xi的主要汇编程序,并给程序添加注释,画出程序的流程图。
i?120解:程序及注释: .bss x, 20 .bss y, 1
STM #x, AR1 STM #19, AR2 LD #0, A
loop: ADD *AR1+, A BANZ loop, *AR2- STL A, @y 流程图:
开始AR1=#x;AR2=19;;给变量x分配20个字单元 ;给变量y分配1个字单元 ;取x地址
;设置循环次数 ;累加器清零 ;累加x分量
;循环是否结束,没有结束则继续累加 ;把结果存入y
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
第页(共 2 页) 33
结束 ;定时长度计算公式: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 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
第页(共 2 页) 34
POPM (6) POPM T POPM TRN RETE
46.用C55x汇编语言实现计算 y??aixi 的程序。(10分)
i?1答: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 ||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
第页(共 2 页) 35