1、DSP十天速成精实验一 新手上路初学者编写的第一个程序通常是控制 XF 引脚的变化,然后用示波器测量 XF 脚波形或观察与相接的 LED。 这个程序也常常用来测度一下 DSP 能否正常工作。实验 1.1 最简单的程序:控制 XF 引脚周期性变化实验目的:通过简单的程序了解 DSP 程序的结构,熟悉 CCS 开发环境。*最简单的程序:TestXF1.asm*循环对 XF 位置 1和清 0,用示波器可以在 XF 脚检测到电平高低周期性变化*常用于检测 DSP 是否工作。*.mmregs ;预定义的寄存器.def CodeStart ;定义程序入口标记.text ;程序区CodeStart: ;程序
2、入口SSBX XF ;XF置 1RPT #999 ;重复执行 1000次空指令产生延时NOPRSBX XF ;XF清 0RPT #999 ;重复执行 1000次空指令产生延时NOPB CodeStart ;跳转到程序开头循环执行.endNOP 指令执行时间为一个时钟周期, 设 DSP 工作频率是 50MHz, 可以估算出 XF 引脚电平的变化频率约为:5 0M/2000=25kHz在没有示波器的情况下, 就要将程序 1.1稍作改进,增加延时, 用一个延时子程序将 XF 脚电平变化频率降 到肉眼可分辨的程度,就可以用 LED 来显示电平的变化,程序如下:实验 1.2 子程序调用实验目的:学习子程
3、序的调用*TestXF2.asm*对 TestXF1.asm 稍作改进,用延时子程序设置较长的延时,*可以用试验板上的 LED 看到 XF 引脚电平的变化*.mmregs ;预定义的寄存器.def CodeStart ;定义程序入口标记.text ;程序区CodeStart: ;程序入口SSBX XF ;XF置 1CALL Delay ;调用延时程序RSBX XF ;XF清 0CALL Delay ;调用延时程序B CodeStart ;跳转到程序开头循环执行*延时子程序:Delay*用两级减一计数器来延时。调整 AR1和 AR2的大小 LED 闪烁的频率不同*Delay:STM #999,A
4、R1 ;循环次数 1000LOOP1: STM #4999, AR2 ;循环次数 5000LOOP2: BANZ LOOP2,*AR2- ;如果 AR2不等于 0,AR2减 1,再判断BANZ LOOP1,*AR1- ;如果 AR1不等于 0,AR1减 1,跳转到 LOOP1RET.end*注意这种延时方法并不精确,需要精确定时必须用定时器。*按此法延时的近似公式为:4*(AR2+1*(AR1+1*时钟周期*当 DSP 工作在 50MHz(时钟周期 20ns,AR1=999, AR2=4999时*延时约为 400ms,则 LED 闪烁的周期为 800ms,频率 1.25Hz*设计指导:1.源代
5、码书写格式源代码的书写有一定的格式,初学者往往容易忽视。简单归纳如下:1.每一行代码分为三个区:标号区、指令区和注释区。标号区必须顶格写,主要是定义变量、常量、程序 标签时的名称。指令区位于标号区之后,以空格或 TAB 格开。如果没有标号,也必须在指令前面加上空格 或 TAB,不能顶格。注释区在标号区、程序区之后,以分号开始。注释区前面可以没有标号区或程序区。 另外还有专门的注释行,以*打头,必须顶格开始。2.一般区分大小写,除非加编译参数忽略大小写。3.标点符号有时不注意会打成中文全角字符导致错误。书写格式的要求在很多 DSP 书里都没有提, 初学者往往只把书上的代码输入进去, 编译时得到错
6、误的提示, 而不知所措。其中最容易犯的错误指令顶格写,不过一般经提示后不会犯第二次。有些格式 CCS 并没有做要求,但注意养成良好的代码书写风格,增加代码的可读性。以上两个例子的书写 风格可作参考,但不是硬性规定:1.标号区占 3个 TAB 的间隔,即 12个字符2.指令中的指令码占两个 TAB 间隔,然后是操作数。3.每一行的尾注能对齐的尽量对齐4.标明一段程序功能的注释以*号打头顶格写,如果功能说明的注释较多,用分格线框起来。此外其它编程语言的编程风格也可以借用过来,比如标示符命名规则、程序说明的要求等。如果项目组有 规定,则按规定执行。本书的代码尽量保持一定的风格,不过读者可以发现前面的
7、代码注释较多,后面随着学习的深入,一般不 会对每一条指令加注释,只注明程序段的功能。另外代码贴到 word 里后,格式有些错位,无法一一纠正。2.链接配置文件一个完整的 DSP 程序至少包含三个部分:程序代码、中断向量表、链接配置文件(*.cmd。这里介绍一下链 接配置文件文件,对本次试验影响不大的中断向量表将在后文介绍。连接配置文件的确定了程序链接成最终可执行代码时的选项,其中有很多条目,实现不同方面的选项,其 中最常用的也是必须的有两条:1.存贮器的分配2.标明程序入口。以本次实验为例,下面的简单的链接配置文件就够用了:/* TestXF.cmd */-e CodeStart /*程序入口
8、,必须在程序中定义相应的标号*/MEMORY page 0:PRAM: org=0100h len=0F00h /*定义程序存贮区,起始 0100H,长度 0F00H*/SECTIONS.text:PRAM page 0 /*将.text 段映射到 page0的 param 区*/由于每个程序都需要一个链接配置文件,可以编写一个满足通常需要的链接配置文件。作为本手册通用的 链接配置文件如下,可以满足本书大部分程序的需要。在未特别指明的情况下使用这个通用的链接配置文 件:/* 5402.cmd */-e CodeStart /*程序入口,必须在程序中定义相应的标号*/-m map.map /*生
9、成存储器映射报告文件 */MEMORY PAGE 0:VECT: org=0080h len=0080h /*中断向量表*/PARAM: org=100h len=0F00h /*代码区*/PAGE 1:DARAM: org=1000h len=1000h /*数据区*/SECTIONS .text : PARAM PAGE 0 /*代码段*/.vectors : VECT PAGE 0 /*中断向量表*/STACK : DARAM PAGE 1 /*堆栈*/.bss : DARAM PAGE 1 /*未命名段*/.data : DARAM PAGE 1 /*数据段*/更多参考:1.关于代码书
10、写格式:SPRU102: TMS320C54x Assembly Language Tools Users Guide,3.5Source Statement Format2.关于链接配置文件:SPRU102: TMS320C54x Assembly Language Tools Users Guide,7.5Linker Command Files,7.7 The MEMORY Directive,7.8 The SECTIONS Directive练习:1、试一下不按规定格式书写代码会产生什么样的编译错误。2、试一下将链接配置文件中的 MEMORY,SECTIONS 改成小写会出现什么样的
11、编译错误。3.修改程序 1.2中 AR1,AR2的值,观察 LED 闪烁频率实验二 基本运算DSP 指令数量最多的是:算术指令、逻辑指令和数据加载与传送指令。数据加载与传送指令由于处处要用, 所以不单独列为实验。 算术与逻辑指令也是数量繁多,无法一一举例, 这里简单举一个加法和除法的例子, 乘法和乘加指令在 FIR 用得比较多,稍后一并介绍。其它指令有兴趣可以对照指令表的说明,试验一下各 指令运行的结果。实验 2.1 加减法计算*计算 z=x+y-w。*.mmregs.def CodeStartData_DP: ;数据段指针x: .word 10 ;初始化变量y: .word 26w: .wo
12、rd 23z: .word 0.textCodeStart:LD #Data_DP,DP ;装载数据指针 DPSTM #STACK+10H,SPSUMB: LD x,A ;A=xADD y,A ;A=A+ySUB w,A ;A=A-wSTL A,z ;z=AEND: B END计算结果数据存储器地址存储内容十进制x1010H000aH10y1011H001aH26w1012H0017H23z1013H000dH13技巧提示:试验算术指令由于不需要外部资源,可以不需要仿真器和实验箱。同学们可以平时自己用软件仿真,多多实验。但是复杂的算法最好还是在线仿真,因为程序是流水线执行,软件仿真有时与实际硬
13、件 执行结果有所不同。实验 2.2 除法计算DSP 并没有除法指令, 回想一下我们用在稿纸上演算除法列的竖式, 实际是一种移位减法, DSP 中也是通过 做多次减法的办法来做除法。下面例子是把用除以 10的办法二进制数转成 BCD 码例子:*16进制转 BCD 码*.mmregs.global CodeStart.datax: .word 1234 ;待转换的数字y: .word 10 ;除数z: .word 0Fh,0Fh,0Fh,0Fh,0Fh;结果区,每位 BCD 存一个字,;初始化为 F 因为实验板的数码管不显示 F.textCodeStart:LD #x,DP ;设置 DPLD x,A ;被除数STM #z,AR1 ;结果区指针loop:RPT #15 ;执行完 16次减法后,A 的高 16位是余数SUBC y,A ;低 16位是商STH A,*
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1