DSP例程

合集下载

一个简单的dspC语言例子

一个简单的dspC语言例子

一个简单的dsp C语言例子开发平台: CCS集成开发环境通过这个简单的例子, 可以大致了解用C语言开发dsp程序的原理。

程序要求: 用C语言编写产生正弦调幅波信号的源程序;正弦调幅波的公式在离散域中的表示:y(n) = (1 + M*sin(2 * PI * fb / fs * n)) * sin(2 * PI * fa / fs * n);编写文件1.sin_am.c#include<stdio.h>#include<math.h>#define TRUE 1#define pi 3.1415926536int y[500],i;float M;void main(){puts("amplitude modulation sinewave example started.\n");M = 50;for(i = 0; i < 500; i++)y[i]= 0;while(TRUE){for(i = 0; i < 500; i++)y[i]=(int)((1 + M / 100 * sin(i * 2 * pi * 20 / 4000))* sin(i * 2 * pi * 200 / 4000)* 16384);puts("program end");}}2.sin_am_v.asm (reset vector file).title "sin_am_v.asm".sect ".vectors".ref _c_int00RESET:B _c_int00.end..3.sin_am.cmdsin_am.objsin_am_v.obj-m sin_am.map-o sin_am.outMEMORY{PAGE 0:EPROG: origin = 0x1400, len = 0x7c00 VECT: origin = 0xff80, len = 0x80PAGE 1:USERREGS: origin = 0x60, len = 0x1c IDATA: origin = 0x80, len = 0x3000 }SECTIONS{.vectors:>VECT PAGE 0.text:>EPROG PAGE 0.cinit:>EPROG PAGE 0.bss:>IDATA PAGE 1.const:>IDATA PAGE 1.switch:>IDATA PAGE 1.system:>IDATA PAGE 1.stack:>IDATA PAGE 1}"*.cmd"文件说明:链接命令文件是实现对段的存储空间位置的定位, C语言程序中常用已初始化和未初始化段如下:已初始化段包括:.init 存放C程序中的变量的初值和常量, 放在ROM和RAM 中均可, 一般属于PAGE 0.const 存放C程序中的字符常量、浮点常量和用const声明的常量, 放在ROM和RAM中均可, 一般属于PAGE 1.text 存放C程序代码, 放在ROM和RAM中均可, 一般属于PAGE 0.switch 存放C程序中的语句的跳针表, 放在ROM和RAM中均可, 一般属于PAGE 0未初始化段包括:.bss 为C程序中的全局和静态变量保留存储空间, 一般存放于RAM中, 属于PAGE 1.stack 为C程序系统堆栈保留存储空间, 用于保存返回地址、函数间的参数传递、存储局部变量和保存中间结果, 一般存放于RAM中, 属于PAGE 1.sysmem 用于C程序中malloc、calloc和realloc函数动态分配存储空间, 一般存放于RAM中, 属于PAGE 14.vary_M.gelmenuitem "Myfunctions"slider vary_M(0, 100, 10, 1, Amount_of_modulation){M = Amount_of_modulation;}该文件用于调试的时候可随意改变变量M的值, 该文件通过file->load GEL File添加到工程中, 调试的时候可选择GEL->My Functions->vary_M来打开vary_M滑动条组件。

DSP简单例程

DSP简单例程

不知道你学过单片机没有。

37个寄存器是R1-R16.(当然,里面有很多是分几个模式的,所以总共有37个)类似于单片机的R0-R7.GPXCON,GPXDAT等等是另外的寄存器,应该叫,特殊功能寄存器,类似于单片机的P0,P1,TCON,等等。

GPXCON:是X管脚的控制寄存器,控制它们的模式,比如输出模式,输入模式……GPXDAT:是X管脚的数据寄存器,存储它们的数据,比如:在输出模式中,想在X管脚输出什么数据,就在这个寄存器里写入什么数据,在输入模式中,这个寄存器中存储的就是外部输入的数据。

手把手教你找GPIO寄存器IODIR 定义手把手教你找寄存器定义一直就很纳闷,没有一个向c8051f410.h的头文件定义特殊功能寄存器,找不见定义,使用起来就无从下手,心里总是不舒坦;从网上看了一些帖子,都说就是在头文件里(我也是这么认为的,肯定要有定义的,不然无法调用)StartUp{………..……….GEL_MapAdd(0x3400u,2,0x0400u,1,1); /* GPIO 1KW */………..}这段映射0x3400u 为GPIO空间,其实只是表示这段i/o空间可读可写;下面是我一步一步地追踪,这些都是要用到的宏定义;#define PREG16(addr) (*(volatile ioport Uint16*)(addr)) 从一个ioport Uint16*类型的地址中取出地址内容,就是IODIR寄存器的值了#define _GPIO_IODIR_ADDR (0x3400u) //定义了IO地址常量#define _GPIO_IODIR PREG16(_GPIO_IODIR_ADDR) //得到寄存器的地址#define _IODIR _GPIO_IODIR 定义了 _IODIR 常量#define GPIO_ADDR(Reg) _GPIO_##Reg##_ADDR 两个变量合并#define _PREG_SET(PregAddr, Val) PREG16(PregAddr) = (Uint16)Val#define GPIO_RSET(Reg,Val) _PREG_SET(GPIO_ADDR(##Reg),Val)从这个宏定义开始1:GPIO_RSET(IODIR,1)这句很明显了,把IODIR寄存器的值置12:_PREG_SET(GPIO_ADDR(##IODIR),1)利用这两个宏#define GPIO_RSET(Reg,Val) _PREG_SET(GPIO_ADDR(##Reg),Val)#define GPIO_ADDR(Reg) _GPIO_##Reg##_ADDR分解的到a:GPIO_ADDR(IODIR) _GPIO_##Reg##_ADDR_GPIO_ IODIR _ADDRb:_PREG_SET(_GPIO_ IODIR _ADDR,1)3:接下来#define _PREG_SET(PregAddr, Val) PREG16(PregAddr) = (Uint16)ValPREG16(_GPIO_ IODIR _ADDR) =1;4::#define PREG16(addr) (*(volatile ioport Uint16*)(addr)) **(_GPIO_ IODIR _ADDR) = 1;5:这句就简单了*(0x3400u) = 1;一步一步顺藤摸瓜,总算摸到;但我们的问题,还是没讲清楚;究竟IODIR 是在哪里定义的呢?开始我也很迷惑,仔细想想后,惶然大悟,快乐!!问题出在,这些都是宏语句,执行编译前,就已经把GPIO_RSET(IODIR,1) 翻译成*(0x3400u) = 1;编译器不认识IODIR ,而IODIR在直到#define GPIO_ADDR(Reg) _GPIO_##Reg##_ADDR 两个变量合并前就是个字符串,连个常量都算不上(不知道这么说确切不,完全是因为它在语句的位置,赋予了它意义)跟单片机类比 SFR IODIR = 0X3400;编译器绕了这么一大圈,其实做得工作太简单了,究竟为什么这么做,我还没来得及想。

DSP例程

DSP例程

通用定时器1、通用定时器有四个中断:A、通用定时器1上溢中断B、通用定时器下溢中断C、通用定时器比较中断D、通用定时器周期中断这四个中断标志位在EV A中断标志寄存器A(EV AIFRA)中,这四个中断的使能位在EV A 屏蔽寄存器EV AIMRA中设置。

2、通用定时器有三个16位的和定时比较有关的寄存器:A、通用定时器计数寄存器TXCNTB、通用定时器周期寄存器TxPRC、通用定时器比较寄存器TXCMPR通用定时器计数寄存器TxCNT根据通用定时器的时钟和计数模式开始计数,不停的和周期寄存器和比较寄存器从而产生中断或者各种事件。

当工作在定时器的模式时,TxCNT得值和TxPR中设置的值比较,当比较匹配后的一个时钟后,产生相应的事件当工作在比较的模式时,TxCNT得值和TxCMPR中设置的值比较,当比较匹配后的一个时钟后,产生相应的比较事件TxPR和TxCMPR都是带有影子寄存器的,在一个周期的任何时刻都可以对这两个寄存器进行读写,读写的是他们的影子寄存器。

对于TxCMPR,只有当TxCON寄存器指定的特定条件满足时,影子寄存器中的值才加载到比较寄存器中;对于周期寄存器,只有当计数寄存器为0时,影子寄存器的值才能重新加载到周期寄存器。

3、通用定时器的计数模式通用定时器有四种计数模式A、停止/保持吧、模式(TxCON.TMODE1~TMODE0=00)B、连续增计数模式(TxCON.TMODE1~TMODE0=01)C、定向增/减计数模式(有外部引脚决定,xCON.TMODE1~TMODE0=11D、连续增减计数模式(TxCON.TMODE1~TMODE0=10)通过定时器控制寄存器TxCON的12~11位决定,4、时钟可以是外部时钟也可以是内部时钟,一般用内部时钟,内部时钟是HSPCLK经过预分频后得到的。

由TxCON得5~4位决定,TxCON。

TCLKS1~TCLKS0=00选择内部时钟;预分频由TxCON得10~8位决定,CLK=HSPCLK/2的TxCON。

ADI_DSP程序间调用例程及说明

ADI_DSP程序间调用例程及说明

ADI_DSP程序间调用例程及说明下面的程序间的调用是基于TigerSharc101处理器,在VisualDSP++3.0上调试通过验证。

VDSP上编程可使用标准C语言,也可使用汇编语言。

故程序间的调用共分4种:(1)C语言调用C语言子程序;(2)C语言调用汇编语言子程序;(3)汇编语言调用汇编语言子程序;(4)汇编语言调用C语言子程序;下面详细说明4中调用方法:1.C语言调用C语言子程序这种调用方法最简单,和标准C语言调用一样。

声明函数之后便可以调用例程:Func调用SubCFuncvoid SubCFunc(int *BuffAddr, int N);void Func(void){int *BuffAddr;int N;SunCFunc(BuffAddr, N);Return;}void SubCFunc(int *BuffAddr, int N){return;}2.C语言调用汇编语言子程序这种调用方法最常用。

首先要在C语言程序中用extern声明汇编子函数,在汇编子函数中要用global _SunAsmFunc;,这样便可以调用汇编子程序了2.1 声明:C语言中声明用extern void SubAsmFunc(int *BuffAddr, int N);汇编语言中声明.global _SubAsmFunc;2.2 参数传递C语言的参数传递到汇编语言中,地址和整数依次分别用j4, j5, j6, j7传递;浮点数依次分别用xr4,xr5, xr6, xr7 传递;汇编函数的返回值:浮点值放在xr8中;整型值放在j8中;多于4个参数的传递则要借助堆栈传递数据。

2.3 例程:C语言函数:extern int SubAsmFunc(int *BuffAddr, float x, int N)void CFunc(void){int *BuffAddr;float x;int N;SubAsmFunc(BuffAddr, x, N);return;}汇编子程序section program;global _SubAsmFunc;_SubAsmFunc://j4存放BufferAddr地址//xr5存放浮点数x//j6存放N//j8返回值存放地址,如果是浮点数则放在xr8中_SunAsmFunc.endalign_code 4;cjmp(np)(abs);nop;nop;nop;3.汇编程序调用汇编子程汇编程序调用汇编子程序时,首先要进行堆栈保护,每进一层子函数都要进行堆栈保护。

DSP汇编编程及应用举例

DSP汇编编程及应用举例

1.DSP汇编语言程序的编写(1)汇编语言源程序以.asm为其扩展名。

(2)汇编语言源程序的每一行都可以由4个部分组成,句法如下:[标号] [:] 助记符[操作数] [;注释]其中可用空格或TAB键隔开标号——供本程序的其他部分或其他程序调用。

标号是任选项,标号后面可以加也可以不加冒号“:”。

标号必须从第一列写起,标号最多可达到32个字符(A~Z ,a~z ,0~9 ,_ ,以及$),但第1个字符不能以数字开头。

引用标号时,标号的大小写必须一致。

标号的值就是SPC(段程序计数器)的值。

如果不用标号,则第一个字符必须为空格、分号或星号(*)。

助记符——助记符指令、汇编指令、宏指令和宏调用。

作为助记符指令,一般用大写;汇编命令和宏指令,以英文句号“.”开始,且为小写。

汇编命令可以形成常数和变量,当用它控制汇编和连接过程时,可以不占用存储空间。

指令和汇编命令都不能写在第1列。

操作数——指令中的操作数或汇编命令中定义的内容。

操作数之间必须用逗号“,”分开。

有的指令操作无操作数,如NOP、RESET。

注释——注释从分号“;”开始,可以放在指令或汇编命令的后面,也可以放在单独的一行或数行。

注释是任选项。

如果注释从第1列开始,也可以用“*”表示注释。

(3)常用的汇编命令如表所示。

(4)汇编语言程序中的数据形式如表所示2.程序2.1 程序一编程目的:了解DSP的输入和输出方法程序功能:求乘积之和y=a1*x1+a2*x2+a3*x3+a4*x4.title "mpy_add.asm".mmregs ;将存储映像寄存器导入列表STACK .usect "STACK",10h ;给堆栈段分配空间.bss a,4 ;将9个字空间分配给各个变量.bss x,4.bss y,1PA0 .set 0 ;将端口PA0全部置0.def start ;定义标号start.data ;定义数据代码段table: .word 4,4,4,4.word 4,4,4,4.text ;定义文本代码段start: STM #0,SWWSR ;将等待寄存器设为0,表示不等待STM #STACK+10h,SP ;设堆栈指针STM #a,AR1 ;将AR1指向变量a的地址RPT #7 ;从程序存储空间转移7+1个值到数据储存空间MVPD table,*AR1+CALL SUM ;调用SUM子程序end: B end ;循环等待SUM: STM #a,AR3 ;将AR3指向变量a的地址STM #x,AR4 ;将AR4指向变量x的地址RPTZ A,#3 ;将A清0,并重复执行下一条指令3+1次MAC *AR3+,*AR4+,ASTL A,@y ;将寄存器A中的低16位存入y地址空间PORTW @y,PA0 ;将y地址中的值输出到输出口RET ;子程序返回.end ;程序结束等待位的设置:C54x片内有一部件——软件可编程等待状态发生器,控制着外部总线的工作。

第一章DSP例程

第一章DSP例程

系统与DSP芯片 第一章 DSP系统与 系统与 芯片
1.2 DSP芯片 DSP芯片
1.2.1 DSP芯片的特点 芯片的特点
(1)在一个指令周期内可完成一次乘法和一次加法运算。 在一个指令周期内可完成一次乘法和一次加法运算。 在一个指令周期内可完成一次乘法和一次加法运算 (2)程序和数据空间分开,可以同时访问指令和数据。 程序和数据空间分开,可以同时访问指令和数据 程序和数据空间分开 (3)具有快速 具有快速RAM。 具有快速 。 (4)具有低开销或无开销循环及跳转的硬件支持。 具有低开销或无开销循环及跳转的硬件支持。 具有低开销或无开销循环及跳转的硬件支持 (5)快速的中断处理和硬件 支持。 快速的中断处理和硬件I/O支持 快速的中断处理和硬件 支持。 (6)具有在单周期内操作的多个硬件地址产生器。 具有在单周期内操作的多个硬件地址产生器。 具有在单周期内操作的多个硬件地址产生器 (7)可以并行执行多个操作。 可以并行执行多个操作。 可以并行执行多个操作 (8)流水线操作,取指、译码和执行等操作可以并行执行。 流水线操作,取指、译码和执行等操作可以并行执行。 流水线操作 (9)为适应一般系统的开发,片内具有一定容量的闪存(Flash 为适应一般系统的开发,片内具有一定容量的闪存 为适应一般系统的开发 Memory,简写为 简写为FLASH),可使得系统的体积更小。 可使得系统的体积更小。 简写为 可使得系统的体积更小 退出
退出
系统与DSP芯片 第一章 DSP系统与 系统与 芯片 (3)专用的硬件乘法器:通用微处理器中的乘法指令往往需要 专用的硬件乘法器: 专用的硬件乘法器 多个指令周期,而由于DSP芯片具有专用的硬件乘法器,使 芯片具有专用的硬件乘法器, 多个指令周期,而由于 芯片具有专用的硬件乘法器 得乘法可在一个指令周期内完成,还可以与加法并行进行, 得乘法可在一个指令周期内完成,还可以与加法并行进行, 即完成一个乘法和加法只需一个指令周期。可见, 即完成一个乘法和加法只需一个指令周期。可见,高速的乘 法指令和并行操作大大提高了DSP处理器的性能。 处理器的性能。 法指令和并行操作大大提高了 处理器的性能 (4)特殊的 特殊的DSP指令:DSP芯片采用了一些特殊指令,这些特 指令: 芯片采用了一些特殊指令, 特殊的 指令 芯片采用了一些特殊指令 殊指令进一步提高了DSP芯片的处理能力。 芯片的处理能力。 殊指令进一步提高了 芯片的处理能力

DSP汇编程序12例

DSP汇编程序12例

案例1判断闰年程序说明:这是一个判断某一年是否为润年的程序,运行可执行程序Ifleap.exe后,输入具体的年份,可输出是本年是否为闰年的提示信息。

源码:Delphi代码data segment ;定义数据段infon db 0dh,0ah,'Please input a year: $'Y db 0dh,0ah,'This is a leap year! $'N db 0dh,0ah,'This is not a leap year! $'w dw 0buf db 8db ?db 8 dup(?)data endsstack segment stackdb 200 dup(0)stack endscode segmentassume ds:data,ss:stack,cs:codestart:mov ax,datamov ds,axlea dx,infon ;在屏幕上显示提示信息mov ah,9int 21hlea dx,buf ;从键盘输入年份字符串mov ah,10int 21hmov cl, [buf+1]lea di,buf+2call datacatecall ifyearsjc a1lea dx,nmov ah,9int 21hjmp exita1: lea dx,ymov ah,9int 21hexit: mov ah,4chint 21hdatacate proc near;push cx;dec cxlea si,buf+2tt1: inc siloop tt1;lea si,cx[di]pop cxmov dh,30hmov bl,10mov ax,1l1: push axsub byte ptr [si],dhmul byte ptr [si]add w,axpop axmul bldec siloop l1retdatacate endpifyears proc nearpush bxpush cxpush dxmov ax,wmov cx,axmov dx,0mov bx,4div bxcmp dx,0jnz lab1mov ax,cxmov bx,100div bxcmp dx,0jnz lab2mov ax,cxmov bx,400div bxcmp dx,0jz lab2lab1: clcjmp lab3lab2: stclab3: pop dxpop cxpop bxretifyears endpcode endsend start案例2数字方阵程序说明:该程序实现显示一个数字的方阵,程序中的清屏功能可将上次运行的结果清除,重新显示下次运行结果。

DSP开发环境和流程的简单例程

DSP开发环境和流程的简单例程
绝对列表器(absolute lister)它输入目标文件,输出.abs文件,通过汇编.abs文件可产生含有绝对地址的列表文件。如果没有绝对列表器,这些操作将需要冗长乏味的手工操作才能完成。
图1-3典型的软件开发流程图
1.2.3硬件仿真和实时数据交换
TI DSPs提供在片仿真支持,它使得CCS能够控制程序的执行,实时监视程序运行。增强型JTAG连接提供了对在片仿真的支持,它是一种可与任意DSP系统相连的低侵扰式的连接。仿真接口提供主机一侧的JTAG连接,如TI XSD510。为方便起见,评估板提供在板JTAG仿真接口。
图2-2装载程序
图2-3反汇编(Disassembly)窗口
现在可以开始运行我们的程序:在主菜单中单击“Debug”,选择“Go Main”,让程序从主函数开始执行。程序会停在main()处,并会有一个黄色的箭头标记当前要执行的C语言代码。如果希望同时看到C语言代码和对应编译生成的汇编代码,在主菜单中单击“View”,选择“Mixed Source/ASM”,此时会有一个绿色的箭头量标记当前要执行的汇编代码,如图2-4所示。
此时,在浅灰色显示的汇编指令上单击鼠标,然后按F1键,CCS会对该汇编指令进行搜索并弹出帮助窗进行解释。可以利用该功能来了解不熟悉的汇编指令。
在主菜单中单击“Debug”,选择“Run”,或单击工具条图标(Run),让程序全速执行。在主菜单中单击“Debug”,选择“Halt”,或单击工具条(Halt),让程序退出运行。
工程窗口用来组织用户的若干程序构成一个项目,用户可以从工程列表中选中需要编译和调试的特定程序。在源程序编译/调试窗口中用户既可以编译程序又可以设置断点、探针,调试程序。反汇编窗口可以帮助用户查看机器指令,查找错误。内存和寄存器显示窗口可以查看、编辑内存单元和寄存器。图形显示窗口可以根据用户需要直接或经过处理后显示数据。用户可以通过主菜单Windows条目来管理窗口。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
如果采用间接寻址并更新ARP的值,此时必须指定一 个shift(移位)操作数。如果不希望产生移位,则将0作为 操作数,例如ADD *+,0,AR2。
退出
第三章 TMS320LF240x的软件结构
通常,如果相加的结果产生进位时,C=1;不产生进 位时,C=0。但是,当左移16位进行相加时,如果相加的 结果产生进位,则C=1;不产生进位时,则C不受影响。 这样,在把32位数加到累加器时,可使累加器产生正确的 符号进位。
【例3-17 】 ADD 1,1 ;DP=6:地址0300h-037Fh
数据存储器 301h
ACC × C
执行指令前 1h 2h
数据存储器 301h
ACC 0 C
执行指令后 1h 4h
退出
第三章 TMS320LF240x的软件结构 【例3-18 】 ADD *+,0,AR0
指令中给出的操作数既不是立即数也不是直接地址,而 是将这个操作数做地址的内存单元的内容作为访问地址,即 指令中的操作数是一个间接地址。间接寻址为系统的编程带 来了很大的灵活性和方便性。
DSP芯片内有8个辅助寄存器AR0-AR7和辅助寄存器算术 单元ARAU,这些资源专用于间接寻址,它可以访问64KB的 寻址空间而不受数据页的限制。因此,DSP的间接寻址能力非 常灵活和强大,而且寻址的速度非常快。
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
1 0 1 1 1 0 11
k
RPT 操作代码
8 位常数=k
退出
第三章 TMS320LF240x的软件结构
【例2】 采用9位短立即数寻址的RPT指令,需要重复执行的 次数包含在指令操作码后。
RPT #k ;9位短立即数寻址
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
ADD操作码
移5位
9h
高9位来自DP
低7位来自IR
0000 0010 0
000 1001
16位数据存储器地址0209h
退出
第三章 TMS320LF240x的软件结构
【例6】 使用直接寻址的ADDC指令。
LDP #500 ;设置数据页为500(地址FA00h-FA7Fh) ADDC 6h ;数据寄存器地址FA06h单元的内容和进位值(C)
语法:ADD dma [,shift]
直接寻址
ADD dma,16
左移16位直接寻址
ADD ind [,shift [,ARn]] 间接寻址
ADD ind,16 [,ARn] 左移16位间接寻址
ADD #k
短立即数寻址
ADD #1k [,shift]
长立即数寻址
说明:被寻址的数据单元的内容或一个立即数左移后加到 累加器,在移位时低位填0。如果符号扩展方式位SXM=1, 则高位进行符号扩展;如果SXM=0,则高位填0。
dma:数据存储器地址的低7位(LSB) shift:左移位数0~15 n:指定下一次的辅助寄存器ARP值(0~7) k:8位短立即数 1k:16位长立即数 ind:是一个间接寻址变量,可取*、*+、*-、*0+、*0-、
*BR0+、*BR0-
退出
第三章 TMS320LF240x的软件结构 (1)ABS(累加器取绝对值) 语法:ABS 说明:计算ACC的绝对值,进位位C置0。指令受OVM状态 标志位影响,执行的结果影响C和OV。如果ACC的内容大于 或等于0,执行指令后其内容不变;若累加器内容小于0,执 行指令后用其对2的补码数(即它的绝对值)取代原来的值。
3.1.1 立即寻址方式
指令操作所需要的数就在本指令中,这个数也称为立即 数。立即寻址的操作数分为短立即数和长立即数,因此相应 的寻址方式也有短立即数寻址和长立即数寻址。
退出
第三章 TMS320LF240x的软件结构
【例1】 采用8位短立即数寻址的RPT指令,需要重复执行 的次数包含在指令操作码后。 RPT #k ;8位短立即数寻址
第二字节
ADD 操作代码
移位 2 次
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
1k 16 位常数=1k
退出
第三章 TMS320LF240x的软件结构
3.1.2 直接寻址方式
操作地址就在指令中,按照该地址可以直接访问寄存器, 这个地址也称为直接地址。
在DSP程序中,直接寻址通常是将指令中的数据页指 针DP和操作数合并起来作为被访问的地址。每页的具体操 作地址的高9位是由数据页指针DP决定;低7位(又称偏移地 址量)是由指令操作数决定,它处于指令寄存器的最低7位有 效位上。DP指针与偏移地址量共同构成16位的指令操作地 址。
k
RPT 操作代码
13 位常数=k
退出
第三章 TMS320LF240x的软件结构
【例4】 采用16位长立即数寻址的ADD指令。
ADD #1k ,2 ;将立即数1k左移2位后与累加器中
第一字节
;的内容相加,结果存累加器中
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
1 0 1 1 1 1 1 11 1 0 1 0 0 1 0
退出
第三章 TMS320LF240x的软件结构 【例5】 采用直接寻址的ADD指令。
LDP #4 ;设置数据页为4(地址0200h-027Fh) ADD 9h,5 ;将数据地址0209h单元的内容左移5位后加至 ACC
数据页指针DP= 0 1 0 0 0 1 0 0 000 1001
LDP #32 ;加载数据页指针
(2)指定偏移量。提供7位偏移量作为指令的操作数。例如将 当前数据页的第2个地址中的数据加到ACC时。
ADD 1h ;将当前数据页中偏移量为1处的数据加到ACC
如果在一段代码块中所有的指令都访问的是同一数据页, 则只需在该块代码的前面加载一次DP即可;如果代码块中需 要访问不同的数据页,则每当访问新的数据页时需确保加载 相应的DP。
在间接寻址时,当前AR的内容用作将被访问的数据存储器 的地址。因此,当前辅助寄存器中的内容才是真正被访问的 数据地址。
在进行间接寻址操作的同时可以对当前辅助寄存器中的内 容(即操作地址)进行修改,甚至可以改变ARP的值,为下一 次的间接寻址操作做准备,从而极大地提高了寻址速度。
退出
第三章 TMS320LF240x的软件结构 TMS320LF240x提供了对AR的内容进行四种运算的选择:
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
8MSB
0
7LSB
第15~8位为指令的操作码;第7位为直接/间接寻址指示 符,为0是直接寻址;第6~0位为偏移地址量。
退出
第三章 TMS320LF240x的软件结构
因此,在使用直接寻址方式时,应按下述步骤进行:
(1)设置数据页面。将页值加载到DP,加载时可使用LDP指 令。LDP指令可直接加载DP而不影响ST0的其他位,该指令 明确指出加载到DP的值,例如把当前数据页设置成32(地址 1000h-107Fh),可使用如下指令。
ACC=8000 0000h时为特殊情况,若溢出方式位 OVM=0,对8000 0000h取绝对值(执行ABS指令)的结果 是8000 0000h;若溢出方式位OVM=1,对8000 0000h 取绝对值的结果是7FFF FFFFh,无论哪种情况下,状态位 OV都置1。
退出
第三章 TMS320LF240x的软件结构 【例3-14】 ABS
;位后加至累加器中,AR0的内容加到当前AR 【例11】 当前AR减去一个变址量 ADD *0-,8 ;把当前AR指定的数据存储单元的内容左移 8
;位后加至累加器中,当前AR的内容减去AR0 ;内容
退出
第三章 TMS320LF240x的软件结构
3.2 TMS320LF240x的汇编指令
汇编语言是DSP应用软件的基础,使用汇编语言时必 须要符合规定的格式,只有这样汇编器才能将源文件转换 为机器语言的目标文件。 1.汇编语言源程序的标准格式
DSP系统也具有计算机的一般特性,其完成的任务是采 样、运算和输出的功能,即从某个地址单元(片内或片外)取 数据,然后按照一定的规则进行运算,最后将运算的结果存 放到某个地址单元来输出。因此,在程序中如何寻址和表达 数据的地址是软件系统的关键问题。
TMS320LF240x的程序采用了三种基本的寻址方式:立 即寻址、直接寻址和间接寻址。
(3)每部分必须由1个或多个空格分开。
(4)开始于第1列的注释须用星号(*)或分号(;)标示,但在其 他列开始的注释前面只能用分号。
(5)指令一定不能从第1列开始,否则将被视为标号。指令 包括助记符指令、汇编伪指令(如.data,.set)等。
(6)操作数可以为列表形式,汇编器允许使用常数、符号或 表达式作为地址、立即数或间接寻址。当操作数为立即数 时,使用#号作为前缀;操作数为间接寻址时,使用*号, 将操作数的内容作为地址。
【例8】 当前AR增加1
ADD *+,8,AR4 ;把当前AR指定的数据存储单元的内容左 ;移8位后加至累加器中,当前AR内容加1, ;指定下条指令的当前辅助寄存器为AR4
【例9】 当前AR减去1
ADD *-,8 ;把当前AR指定的数据存储单元的内容左移8 ;位后加至累加器中,当前AR内容减1
退出
第三章 TMS320LF240x的软件结构 【例10】 当前AR增加一个变址量 ADD *0+,8 ;把当前AR指定的数据存储单元的内容左移8
第三章 TMS320LF240x的软件结构
第三章 TMS320LF240x的软件结构
TMS320LF240x的寻址方式 TMS320LF240x的汇编指令 DSP软件的文件结构 定点DSP芯片的数据定标及运算 非线性函数的处理方法
相关文档
最新文档