54DSP十天速成.doc

上传人:hw****26 文档编号:3525635 上传时间:2019-06-02 格式:DOC 页数:22 大小:80.50KB
下载 相关 举报
54DSP十天速成.doc_第1页
第1页 / 共22页
54DSP十天速成.doc_第2页
第2页 / 共22页
54DSP十天速成.doc_第3页
第3页 / 共22页
54DSP十天速成.doc_第4页
第4页 / 共22页
54DSP十天速成.doc_第5页
第5页 / 共22页
点击查看更多>>
资源描述

1、实验一 新手上路初学者编写的第一个程序通常是控制 XF 引脚的变化,然后用示波器测量 XF 脚波形或观察与相接的 LED。这个程序也常常用来测度一下 DSP 能否正常工作。实验 1.1 最简单的程序:控制 XF 引脚周期性变化实验目的:通过简单的程序了解 DSP 程序的结构,熟悉 CCS 开发环境。*最简单的程序:TestXF1.asm*循环对 XF 位置 1 和清 0,用示波器可以在 XF 脚检测到电平高低周期性变化*常用于检测 DSP 是否工作。*.mmregs ;预定义的寄存器.def CodeStart ;定义程序入口标记.text ;程序区CodeStart: ;程序入口SSBX X

2、F ;XF 置 1RPT #999 ;重复执行 1000 次空指令产生延时NOPRSBX XF ;XF 清 0RPT #999 ;重复执行 1000 次空指令产生延时NOP B CodeStart ;跳转到程序开头循环执行.end NOP 指令执行时间为一个时钟周期,设 DSP 工作频率是 50MHz,可以估算出 XF 引脚电平的变化频率约为:50M/2000=25kHz在没有示波器的情况下,就要将程序 1.1 稍作改进,增加延时,用一个延时子程序将 XF 脚电平变化频率降到肉眼可分辨的程度,就可以用 LED 来显示电平的变化,程序如下:实验 1.2 子程序调用实验目的:学习子程序的调用*Te

3、stXF2.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,AR1

4、 ;循环次数 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*设计指

5、导:1源代码书写格式源代码的书写有一定的格式,初学者往往容易忽视。简单归纳如下: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关于代码书写格式:SPRU102:

10、 TMS320C54x Assembly Language Tools Users Guide,3.5 Source Statement Format2关于链接配置文件:SPRU102: TMS320C54x Assembly Language Tools Users Guide,7.5 Linker Command Files,7.7 The MEMORY Directive,7.8 The SECTIONS Directive练习:1、试一下不按规定格式书写代码会产生什么样的编译错误。2、试一下将链接配置文件中的 MEMORY,SECTIONS 改成小写会出现什么样的编译错误。3修改程序

11、1.2 中 AR1,AR2 的值,观察 LED 闪烁频率实验二 基本运算本节选自为 HK-DSP 实验箱写的实验指导书,有待整理DSP 指令数量最多的是:算术指令、逻辑指令和数据加载与传送指令。数据加载与传送指令由于处处要用,所以不单独列为实验。算术与逻辑指令也是数量繁多,无法一一举例,这里简单举一个加法和除法的例子,乘法和乘加指令在 FIR 用得比较多,稍后一并介绍。其它指令有兴趣可以对照指令表的说明,试验一下各指令运行的结果。实验 2.1 加减法计算 *计算 z=x+y-w。*.mmregs.def CodeStartData_DP: ;数据段指针x: .word 10 ;初始化变量y:

12、.word 26w: .word 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,D

14、P ;设置 DPLD x,A ;被除数STM #z,AR1 ;结果区指针loop: RPT #15 ;执行完 16 次减法后,A 的高 16 位是余数SUBC y,A ;低 16 位是商STH A,*AR1+ ;余数保存到 ZAND #0FFFFH,A ;掩盖掉高 16 位,保留商值BC loop,ANEQ ;继续做除法直到商为 0 end: B end练习:练习其他算术指令其它参考:spru172c:TMS320C54x DSP Reference Set Volume 2: Mnemonic Instruction Set,2.1 Arithmetic Operations这个资料对每个指

15、令都有详细说明。也可以在 Help 中的 TMS320C54x DSP Mnemonic Instruction Set 中查询或搜索相关指令。实验三 中断中断的概念应该不陌生,指的是当某个事件发生时,暂停当前的操作,转向中断服务程序,执行完后再返回继续原来的操作。这使得 DSP 能够处理多个任务。DSP 有许多中断源,可以设置中断控制寄存器来确定响应哪些中断而不理会哪些中断。本实验介绍最常用的定时器中断和外部中断的使用方法,并介绍中断向量表和中断向量指针。 实验 3.1 定时器中断:方波发生器实验目的:学习定时器中断的设计方法回顾一下实验一控制 LED 的闪烁实际就是一个简单的方波发生器。但

16、不足的是延时的方法定时不精确,另外还有一个缺点是在执行延时的过程中 DSP 就无法执行其它指令,这时就可以用定时器来改进。使用定时器首先要对它初始化,基本步骤如下:1关掉中断2停止定时器运行。3设定时器的定时长度4允许定时器中断5运行定时器6打开中断现以简单的方波程序为例:;=; fangbo1.asm; 利用定时器 Timer0 在 XF 脚产生周期 2ms 的的方波;=.title “fangbo1.asm“.mmregs.def codestart ;程序入口.def TINT0_ISR ;Timer0 中断服务程序STACK .usect “STACK“,10H ;分配堆栈空间 ;设定

17、定时器 0 控制寄存器的内容K_TCR_SOFT .set 0B技巧提示:只有第一个中断(Reset 中断)是每个程序都应该有的,在不需要其它中断的情况下,可以只用这一部分,后面可以省略。如果只需要部分中断也可以按需设置,但必须保证所用中断在中断向量表的位置不变。不熟悉中断向量表的情况下最好还是用这个完整中断向量表样例。另外 C5400 系列中不同型号 DSP 的中断向量数量和在中断向量表中的位置有所不同,程序移植时需要查相应 datasheet 确认。2中断向量指针中断向量表的位置并没有强制的位置,可以在内部存贮器,也可以在外部存贮器。但有一个要求:中断量表必须放在 80H 字长存贮块的起始处,即中断向量表的首地址的低 7 位必须全为 0。DSP 的寄存器 PMST 的高 9 位是中断向量表的指针 IPTR。其上电时默认是在 FF80H 处,这是为了运行固化在内

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 实用文档资料库 > 策划方案

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。