DSP十天速成精.docx

上传人:b****5 文档编号:2930109 上传时间:2022-11-16 格式:DOCX 页数:28 大小:33.64KB
下载 相关 举报
DSP十天速成精.docx_第1页
第1页 / 共28页
DSP十天速成精.docx_第2页
第2页 / 共28页
DSP十天速成精.docx_第3页
第3页 / 共28页
DSP十天速成精.docx_第4页
第4页 / 共28页
DSP十天速成精.docx_第5页
第5页 / 共28页
点击查看更多>>
下载资源
资源描述

DSP十天速成精.docx

《DSP十天速成精.docx》由会员分享,可在线阅读,更多相关《DSP十天速成精.docx(28页珍藏版)》请在冰豆网上搜索。

DSP十天速成精.docx

DSP十天速成精

实验一新手上路]

初学者编写的第一个程序通常是控制XF引脚的变化,然后用示波器测量XF脚波形或观察与相接的LED。

这个程序也常常用来测度一下DSP能否正常工作。

实验1.1最简单的程序:

控制XF引脚周期性变化

实验目的:

通过简单的程序了解DSP程序的结构,熟悉CCS开发环境。

*************************************************************

*最简单的程序:

TestXF1.asm

*循环对XF位置1和清0,用示波器可以在XF脚检测到电平高低周期性变化

*常用于检测DSP是否工作。

*************************************************************

.mmregs;预定义的寄存器

.defCodeStart;定义程序入口标记

.text;程序区

CodeStart:

;程序入口

SSBXXF;XF置1

RPT#999;重复执行1000次空指令产生延时

NOP

RSBXXF;XF清0

RPT#999;重复执行1000次空指令产生延时

NOP

BCodeStart;跳转到程序开头循环执行

.end

NOP指令执行时间为一个时钟周期,设DSP工作频率是50MHz,可以估算出XF引脚电平的变化频率约为:

50M/2000=25kHz

在没有示波器的情况下,就要将程序1.1稍作改进,增加延时,用一个延时子程序将XF脚电平变化频率降到肉眼可分辨的程度,就可以用LED来显示电平的变化,程序如下:

实验1.2子程序调用

实验目的:

学习子程序的调用

*************************************************************

*TestXF2.asm

*对TestXF1.asm稍作改进,用延时子程序设置较长的延时,

*可以用试验板上的LED看到XF引脚电平的变化

*************************************************************

.mmregs;预定义的寄存器

.defCodeStart;定义程序入口标记

.text;程序区

CodeStart:

;程序入口

SSBXXF;XF置1

CALLDelay;调用延时程序

RSBXXF;XF清0

CALLDelay;调用延时程序

BCodeStart;跳转到程序开头循环执行

**************************************************************

*延时子程序:

Delay

*用两级减一计数器来延时。

调整AR1和AR2的大小LED闪烁的频率不同

**************************************************************

Delay:

STM#999,AR1;循环次数1000

LOOP1:

STM#4999,AR2;循环次数5000

LOOP2:

BANZLOOP2,*AR2-;如果AR2不等于0,AR2减1,再判断

BANZLOOP1,*AR1-;如果AR1不等于0,AR1减1,跳转到LOOP1

RET

.end

**************************************************************

*注意这种延时方法并不精确,需要精确定时必须用定时器。

*按此法延时的近似公式为:

4*(AR2+1*(AR1+1*时钟周期

*当DSP工作在50MHz(时钟周期20ns,AR1=999,AR2=4999时

*延时约为400ms,则LED闪烁的周期为800ms,频率1.25Hz

**************************************************************

设计指导:

1.源代码书写格式

源代码的书写有一定的格式,初学者往往容易忽视。

简单归纳如下:

1.每一行代码分为三个区:

标号区、指令区和注释区。

标号区必须顶格写,主要是定义变量、常量、程序标签时的名称。

指令区位于标号区之后,以空格或TAB格开。

如果没有标号,也必须在指令前面加上空格或TAB,不能顶格。

注释区在标号区、程序区之后,以分号开始。

注释区前面可以没有标号区或程序区。

另外还有专门的注释行,以*打头,必须顶格开始。

2.一般区分大小写,除非加编译参数忽略大小写。

3.标点符号有时不注意会打成中文全角字符导致错误。

书写格式的要求在很多DSP书里都没有提,初学者往往只把书上的代码输入进去,编译时得到错误的提示,而不知所措。

其中最容易犯的错误指令顶格写,不过一般经提示后不会犯第二次。

有些格式CCS并没有做要求,但注意养成良好的代码书写风格,增加代码的可读性。

以上两个例子的书写风格可作参考,但不是硬性规定:

1.标号区占3个TAB的间隔,即12个字符

2.指令中的指令码占两个TAB间隔,然后是操作数。

3.每一行的尾注能对齐的尽量对齐

4.标明一段程序功能的注释以*号打头顶格写,如果功能说明的注释较多,用分格线框起来。

此外其它编程语言的编程风格也可以借用过来,比如标示符命名规则、程序说明的要求等。

如果项目组有规定,则按规定执行。

本书的代码尽量保持一定的风格,不过读者可以发现前面的代码注释较多,后面随着学习的深入,一般不会对每一条指令加注释,只注明程序段的功能。

另外代码贴到word里后,格式有些错位,无法一一纠正。

2.链接配置文件

一个完整的DSP程序至少包含三个部分:

程序代码、中断向量表、链接配置文件(*.cmd。

这里介绍一下链接配置文件文件,对本次试验影响不大的中断向量表将在后文介绍。

连接配置文件的确定了程序链接成最终可执行代码时的选项,其中有很多条目,实现不同方面的选项,其中最常用的也是必须的有两条:

1.存贮器的分配

2.标明程序入口。

以本次实验为例,下面的简单的链接配置文件就够用了:

/*TestXF.cmd*/

-eCodeStart/*程序入口,必须在程序中定义相应的标号*/

MEMORY{

page0:

PRAM:

org=0100hlen=0F00h/*定义程序存贮区,起始0100H,长度0F00H*/

}

SECTIONS{

.text:

>PRAMpage0/*将.text段映射到page0的param区*/

}

由于每个程序都需要一个链接配置文件,可以编写一个满足通常需要的链接配置文件。

作为本手册通用的链接配置文件如下,可以满足本书大部分程序的需要。

在未特别指明的情况下使用这个通用的链接配置文件:

/*5402.cmd*/

-eCodeStart/*程序入口,必须在程序中定义相应的标号*/

-mmap.map/*生成存储器映射报告文件*/

MEMORY{

PAGE0:

VECT:

org=0080hlen=0080h/*中断向量表*/

PARAM:

org=100hlen=0F00h/*代码区*/

PAGE1:

DARAM:

org=1000hlen=1000h/*数据区*/

}

SECTIONS{

.text:

>PARAMPAGE0/*代码段*/

.vectors:

>VECTPAGE0/*中断向量表*/

STACK:

>DARAMPAGE1/*堆栈*/

.bss:

>DARAMPAGE1/*未命名段*/

.data:

>DARAMPAGE1/*数据段*/

}

更多参考:

1.关于代码书写格式:

SPRU102:

TMS320C54xAssemblyLanguageToolsUser'sGuide,3.5

SourceStatementFormat

2.关于链接配置文件:

SPRU102:

TMS320C54xAssemblyLanguageToolsUser'sGuide,7.5

LinkerCommandFiles,7.7TheMEMORYDirective,7.8TheSECTIONSDirective

练习:

1、试一下不按规定格式书写代码会产生什么样的编译错误。

2、试一下将链接配置文件中的MEMORY,SECTIONS改成小写会出现什么样的编译错误。

3.修改程序1.2中AR1,AR2的值,观察LED闪烁频率

实验二基本运算

<本节选自为HK-DSP实验箱写的实验指导书,有待整理>

DSP指令数量最多的是:

算术指令、逻辑指令和数据加载与传送指令。

数据加载与传送指令由于处处要用,所以不单独列为实验。

算术与逻辑指令也是数量繁多,无法一一举例,这里简单举一个加法和除法的例子,乘法和乘加指令在FIR用得比较多,稍后一并介绍。

其它指令有兴趣可以对照指令表的说明,试验一下各指令运行的结果。

实验2.1加减法计算

************************************************

*计算z=x+y-w。

************************************************

.mmregs

.defCodeStart

Data_DP:

;数据段指针

x:

.word10;初始化变量

y:

.word26

w:

.word23

z:

.word0

.text

CodeStart:

LD#Data_DP,DP;装载数据指针DP

STM#STACK+10H,SP

SUMB:

LDx,A;A=x

ADDy,A;A=A+y

SUBw,A;A=A-w

STLA,z;z=A

END:

BEND

计算结果数据存储器地址存储内容十进制

x1010H000aH10

y1011H001aH26

w1012H0017H23

z1013H000dH13

技巧提示:

试验算术指令由于不需要外部资源,可以不需要仿真器和实验箱。

同学们可以平时自己用软件

仿真,多多实验。

但是复杂的算法最好还是在线仿真,因为程序是流水线执行,软件仿真有时与实际硬件执行结果有所不同。

实验2.2除法计算

DSP并没有除法指令,回想一下我们用在稿纸上演算除法列的竖式,实际是一种移位减法,DSP中也是通过做多次减法的办法来做除法。

下面例子是把用除以10的办法二进制数转成BCD码例子:

*********************************

*16进制转BCD码

*********************************

.mmregs

.globalCodeStart

.data

x:

.word1234;待转换的数字

y:

.word10;除数

z:

.word0Fh,0Fh,0Fh,0Fh,0Fh;结果区,每位BCD存一个字,

;初始化为F因为实验板的数码管不显示F

.text

CodeStart:

LD#x,DP;设置DP

LDx,A;被除数

STM#z,AR1;结果区指针

loop:

RPT#15;执行完16次减法后,A的高16位是余数

SUBCy,A;低16位是商

STHA,*

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1