DSP代码解读

合集下载

轻松学会DSP——DSP汇编指令

轻松学会DSP——DSP汇编指令

位倒序寻址的执行
设FFT长度N=16,x(0)~x(15)位于地址 (01100000)~(01101111),则AR0赋值为8 (00001000),位倒序方式读入数据情况如下(AR2初 始为01100000): RPT #15 PORTW *AR2+0B,PA
功能: 地址=AR2 , AR2=B(AR2+AR0)
循环寻址的有效地址计算
循环缓冲器的有效基地址(EFB)就是用户选定的 辅助寄存器(ARx)的低N位置 0后所得到的值。
循环缓冲器的尾地址(EOB)是通过用BK的低N位 代替ARx的低N位得到。循环缓冲器的INDEX就是 ARx的低N位,step就是加到辅助寄存器,或从辅 助寄存器中减去的值。循环寻址的算法如下:
FFT中混序就是位倒序
FFT运算时输出/输入序列中必有其一要混序。
存储单元 地址
FFT变换 结果
位码倒序
位码倒序 寻址结果
存储单元 地址
FFT变换 结果
位码倒序
位码倒序 寻址结果
0000
X(0)
0000
X(0)
1000
X(1)
0001
X(8)
0001
X(8)
1000
X(1)
1001
X(9)
1001
MVMD pmad, Smem
程序存储器地址(pmad)寻址:
FIRS Xmem, Ymem, pmad MACD Smem, pmad, src
MACP Smem, pmad, src MVPD pmad, Smem
端口地址(PA)寻址
PORTR PA, Smem
PORTW Smem, PA
*(lk)寻址适用于支持单数据存储器操作数的指令

DSP的CMD文件详解(整理版)

DSP的CMD文件详解(整理版)

DSP的CMD文件详解CMD是用来分配ROM和RAM空间用的,告诉链接程序怎样计算地址和分配空间。

所以不同的芯片就有不同大小的ROM和RAM,存放用户程序的地方也不尽相同。

所以要根据芯片进行修改,分为 MEMORY 和SECTIONS两个部分。

MEMORY{PAGE 0 ..........PAGE 1.........}SECTIONS{.vectors ..................reset .................................}MEMORY是用来指定芯片的ROM和RAM的大小和划分出几个区间。

PAGE 0对应ROM, PAGE 1对应RAM。

PAGE 里包含的区间名字与其后面的参数反映了该区间的起始地址和长度。

SECTIONS:(在程序里添加下面的段名,如.vectors。

用来指定该段名以下,另一个段名以上的程序(属于PAGE0)或数据(属于PAGE1)放到“>”符号后的空间名字所在的地方。

){.vectors : { } > VECS PAGE 0.reset : { } > VECS PAGE 0..................................}eg:MEMORY{PAGE 0:VECS :origin = 00000h, length = 00040h LOW :origin = 00040h, length = 03FC0h SARAM :origin = 04000h, length = 00800h B0 :origin = 0FF00h, length = 00100h PAGE 1:B0 :origin = 00200h, length = 00100h B1 :origin = 00300h, length = 00100h B2 :origin = 00060h, length = 00020h SARAM :origin = 08000h, length = 00800h }{.text : { } > LOW PAGE 0.cinit : { } > LOW PAGE 0.switch : { } > LOW PAGE 0.const : { } > SARAM PAGE 1.data : { } > SARAM PAGE 1.bss : { } > SARAM PAGE 1.stack : { } > SARAM PAGE 1.sysmem : { } > SARAM PAGE 1}由三部分组成:①输入/输出定义:这一部分,可以通过ccs的“BuildOption........”菜单设置: .obj(链接的目标文件)、.lib(链接的库文件)、.map(生成的交叉索引文件)、.out(生成的可执行代码)。

DSP中一些C语言语法的解释

DSP中一些C语言语法的解释

时常在cpp的代码之中看到这样的代码:#ifdef__cplusplusextern "C" {#endif//一段代码#ifdef__cplusplus}#endif这样的代码到底是什么呢?首先,__cplusplus是cpp中的自定义宏,那么定义了这个宏的话表示这是一段cpp的代码,也就是说,上面的代码的含义是:如果这是一段cpp的代码,那么加入extern "C"{和}处理其中的代码。

要明白为何使用extern "C",还得从cpp中对函数的重载处理开始说起。

在c++中,为了支持重载机制,在编译生成的汇编码中,要对函数的名字进行一些处理,加入比如函数的返回类型等等.而在C中,只是简单的函数名字而已,不会加入其他的信息.也就是说:C++和C对产生的函数名字的处理是不一样的.比如下面的一段简单的函数,我们看看加入和不加入extern "C"产生的汇编代码都有哪些变化:int f(void){return 1;}在加入extern "C"的时候产生的汇编代码是:.file "test.cxx".text.align 2.globl _f.def _f; .scl 2; .type 32; .endef_f:pushl %ebpmovl %esp, %ebpmovl $1, %eaxpopl %ebpret但是不加入了extern "C"之后.file "test.cxx".text.align 2.globl __Z1fv.def __Z1fv; .scl 2; .type 32; .endef__Z1fv:pushl %ebpmovl %esp, %ebpmovl $1, %eaxpopl %ebpret两段汇编代码同样都是使用gcc -S命令产生的,所有的地方都是一样的,唯独是产生的函数名,一个是_f,一个是__Z1fv。

DSP代码

DSP代码

void RamRead(Uint16 {
Uint16 i;
Start)/////读取外部 RAM 函数
for (i=0;i<0x4000;i++) {
*(ExRamStart + Start + i) = *(ExRamStart +i); } }
Flash 操作对应的 C 文件
外部 Flash 空间数据读写
主函数
通过定时器使 LED 闪烁
。InitPeripherals( )
。StartCpuTimer0( ) 定义在 DSP28_CputTimers.h 中
导入的头文件 主函数
输出占空比固定的 PWM 波形
定义两个全局变量
输出占空比可变的 PWM 波形
主函数
产生三相 SPWM 波形 说 明:EVA 下面的通用定时器 T1 工作于连续增/减计数模式,产生三角载波,载波频率为 3000Hz,载波比 N=60,因此调制波形正弦波的频率为 50Hz。本实验中,调制度为 0.8。
* *名 称:RamRead() * *功 能:读取外部 RAM 空间的数据 * *入口参数:Uint16 Start 此参数规定了从外扩 RAM 区域的第 Start 个存储空间开始读取 * *出口参数:无 * *****************************************************************************/
主函数
定时器 LED 闪烁的 CMD 文件
void InitExRam1(Uint16Start) {
Uint16 i;
for (i=0;i<0x4000;i++) {

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代码释义

•装载累加器–LACC:左移装载累加器•LACC dma [,shift]•LACC dma ,16•LACC ind [,shift[,ARn]]•LACC ind ,16[,ARn]•LACC #lk [,shift]–LACL:装载累加器低位并清累加器高位•LACL dma•LACL ind[,ARn]•LACL #k–LACT:按TREG规定左移后再转载入累加器•LACT dma•LACT ind[,ARn]–PAC:用乘积寄存器PREG装载累加器,移位方式由ST1中的PM确定•PAC•装载临时寄存器TREG–LT:将指定数据存储器的内容装入TREG。

常作乘法的准备工作。

•LT dma•LT ind[,ARn]–LTA:装载TREG同时累加前次乘积•LTA dma•LTA ind[,ARn]–LTD:装载TREG,累加前次乘积并移动数据•LTD dma•LTD ind[,ARn]–LTP:装载TREG,并将PREG值保存至累加器•LTP dma•LTP ind[,ARn]–LTS:装载TREG并减去前次乘积•LTS dma•LTS ind[,ARn]•装载辅助寄存器AR–LAR:装载辅助寄存器•LAR ARx,dma•LAR ARx,ind[,ARn]•LAR ARx,#k•LAR ARx,#lk–MAR:修改辅助寄存器•MAR dma•MAR ind[,ARn]•装载其它寄存器–LDP:装载数据页指针•LDP dma•LDP ind[,ARn]•LDP #k–LPH:装载乘积寄存器高位字•LPH dma•LPH ind[,ARn]–LST:装载状态寄存器•LST #m,dma•LST #m,ind[,ARn]存储寄存器值•保存AR值(SAR)–SAR ARx, dma–SAR ARx, ind[, ARn] •保存PREG高位字(SPH)–SPH dma–SPH ind[, ARn]•保存PREG低位字(SPL)–SPL dma–SPL ind[, ARn]•保存状态寄存器ST0和ST1(SST)–SST #m, dma–SAR #m, ind[, ARn]堆栈操作•出栈至ACC低位字(POP )–POP•ACC低位字入栈(PUSH )–PUSH•出栈至数据存储器(POPD )–POPD dma–POPD, ind[, ARn]•数据存储器值入栈(PSHD )–PSHD dma–PSHD ind[, ARn]读写数据或程序存储器•数据存储器至数据存储器的块移动(BLDD )–BLDD #lk,dma–BLDD #lk,ind[, ARn]–BLDD dma ,#lk–BLDD ind ,#lk[, ARn] •程序存储器至数据存储器的块移动(BLPD )–BLPD #pma, dma–BLPD #pma, ind[, ARn] •片内数据存储器中的数据传送(DMOV )–DMOV dma–DMOV ind[, ARn]•长立即数写入数据存储器(SPLK )–SPLK #lk, dma–SPLK #lk, ind[, ARn]•读程序存储器(表读)(TBLR )–TBLR dma–TBLR ind[, ARn]•写程序存储器(表写)(TBLW )–TBLW dma–TBLW ind[, ARn]读写I/O单元•读I/O单元(IN )–IN dma, PA–IN ind, PA[, ARn]•写I/O单元(OUT )–OUT dma, PA–OUT ind, PA[, ARn]加法•左移加至ACC(ADD)–ADD dma [,shift]–ADD dma ,16–ADD ind [,shift[,ARn]]–ADD ind ,16[,ARn]–ADD #k–ADD #lk [,shift]•带进位位加至ACC (ADDC)–ADDC dma–ADDC ind [,ARn]•抑制符号扩展加至ACC (ADDS)–ADDS dma–ADDS ind [,ARn]•按TREG低4位规定左移加至ACC (ADDT)–ADDT dma–ADDT ind [,ARn]•加短立即数至当前AR(ADRK)–ADRK #k减法•左移后从ACC中减去(SUB)–SUB dma [,shift]–SUB dma ,16–SUB ind [,shift[,ARn]]–SUB ind ,16[,ARn]–SUB #k–SUB #lk [,shift]•带借位从ACC中减去(SUBB)–SUBB ind [,ARn]•条件减(SUBC):常用来实现除法–SUBC dma–SUBC ind [,ARn]•抑制符号扩展减(SUBS)–SUBS dma–SUBS ind [,ARn]•按TREG低4位左移后从ACC中减去(SUBT)–SUBT dma–SUBT ind [,ARn]•当前AR减去短立即数(SBRK)–SBRK #k•ACC减去PREG(SPAC)–SPAC•SUBC实现16位数除法的步骤–被除数(必须为正)置于累加器低位字中,且最高位放在bit15中,累加器高位字清零;–除数(必须大于0)放入数据存储单元中;–执行SUBC指令16次;–除的结果:商在累加器低位字;余数在累加器高位字。

DSP-常用算法代码

DSP-常用算法代码

一、32 位加法//链接命令文件MEMORY{PAGE 0: ROM :origin=0080h,length=1000hROM :origin=0060h,length=10hPAGE 1: OTHER :origin=0400h,length=40h}SECTIONS{.text : { }>ROM PAGE 0.data :{ }>ROM PAGE 0.bss : { }>OTHER PAGE 1.stack : { }>OTHER PAGE 1}//汇编语言源代码.title "ADD32".mmregs.def start,_c_int00.bss xhi , 2,1,1.bss yhi , 2,1,1.bss zhi , 2,1, 1table .long 13578468H.long 1020B30AH.text_c_int00b startnopnopstart: LD #xhi ,DPSTM #xhi,AR1RPT #3MVPD table,*AR1+DLD xhi , ADADD yhi , ADST A ,zhiEND: B END.end二、64位加法/减法//链接命令文件/*ADDSUB64.cmd*/ADDSUB64.obj-m ADDSUB64.map-o ADDSUB64.outMEMORY{PAGE 0: ROM :origin=0080h,length=1000hROM :origin=0060h,length=10hPAGE 1: OTHER :origin=0400h,length=40h}SECTIONS{.text : { }>ROM PAGE 0.data :{ }>ROM PAGE 0.bss : { }>OTHER PAGE 1.stack : { }>OTHER PAGE 1}//汇编语言源代码.title "ADDSUB64".mmregs.def start,_c_int00.bss x1 , 2 ,1,1.bss x3 , 2 ,1,1.bss y1 , 2 ,1,1.bss y3 , 1.bss y2 , 1.bss z1 , 2 ,1,1.bss z3 , 1.bss z2 , 1.bss w1 , 2 ,1,1.bss w3 , 2 ,1,1table .long 12345678H ;x1x0.long 02468ACEH ;x3x2.long 22222222H ;y1y0.word 1357H,2468H ;y3,y2.long 44444444H ;z1z0.word 1020H,0B30AH ;z3,z2.text_c_int00b startnopnopstart: LD #x1 ,DPSTM #x1,AR1RPT #11MVPD table,*AR1+DLD x1,A ; A = X1 X0DADD y1,A ; A= X1 X0 + Y1 Y0,产生进位CDLD x3,B ; B = X3 X2ADDC y2,B ; B = X3 X2 + 00 Y2 + CADD y3,16,B ; B = X3 X2 + Y3 Y2 + CDSUB z1,A ; A= X1 X0 + Y1 Y0-Z1Z0,产生借位C'DST A,w1 ; W1W0= X1 X0 + Y1 Y0-Z1Z0SUBB z2,B ; B = X3 X2 + Y3 Y2 + C - 00 Z2-C'SUB z3,16,B ; B = X3 X2 + Y3 Y2 + C -Z3 Z2-C'DST B,w3 ; W3 W2= X3 X2 + Y3 Y2 + C - Z3 Z2-C' END: B END.end三、FIR滤波//链接命令文件fir.obj-m fir.map-o fir.outMEMORY{PAGE 0: ROM1(RIX) :ORIGIN=0080H,LENGTH=100HPAGE 1: INTRAM1(RW) :ORIGIN=2400H,LENGTH=0200HINTRAM2(RW) :ORIGIN=2600H,LENGTH=0100HINTRAM3(RW) :ORIGIN=2700H,LENGTH=0100HB2B(RW) :ORIGIN=0070H,LENGTH=10H}SECTIONS{.text : {}>ROM1 PAGE 0.data : {}>INTRAM1 PAGE 1FIR_COFF: {}>INTRAM2 PAGE 1FIR_BFR : {}>INTRAM3 PAGE 1.stack : {}>B2B PAGE 1}//汇编语言源代码;一个FIR滤波器源程序fir.asm.mmregs.global start.def start,_c_int00INDEX .set 1KS .set 256 ;模拟输入数据缓冲区大小N .set 17COFF_FIR .sect "COFF_FIR" ;FIR滤波器系数.word 0.word 158.word 264.word -290.word -1406.word -951.word 3187.word 9287.word 12272.word 9287.word 3187.word -951.word -1406.word -290.word 260.word 158.word 0.dataINPUT .copy "firin.inc" ;模拟输入在数据存储区0x2400 OUTPUT .space 1024 ;输出数据在数据区0x2500 ;FIR_DP .usect "FIR_V ARS",0;D_FIN .usect "FIR_V ARS",1;D_FOUT .usect "FIR_V ARS",1COFFTAB .usect "FIR_COFF",NDA TABUF .usect "FIR_BFR",NBOS .usect "STACK",0FhTOS .usect "STACK",1.text.asg AR0,INDEX_P.asg AR4,DA TA_P ;输入数据x(n)循环缓冲区指针.asg AR5,COFF_P ;FIR系数表指针.asg AR6,INBUF_P ;模拟输入数据指针.asg AR7,OUTBUF_P;FIR滤波器输出数据指针_c_int00b startnopnopstart: ssbx FRCTSTM #COFFTAB,COFF_PRPT #N-1 ;将FIR系数从程序存储器移动MVPD #COFF_FIR,*COFF_P+ ;到数据存储器STM #INDEX,INDEX_PSTM #DATABUF,DATA_PRPTZ A,#N-1STL A,*DATA_P+ ;将数据循环缓冲区清零STM #(DA TABUF+N-1),DATA_P ;数据缓冲区指针指向x[n-(N-1)]STM #COFFTAB,COFF_P ;FIR_TASK:STM #INPUT,INBUF_PSTM #OUTPUT,OUTBUF_PSTM #KS-1,BRCRPTBD LOOP-1STM #N,BK ;FIR循环缓冲区大小LD *INBUF_P+,A ;装载输入数据FIR_FILTER:STL A,*DATA_P+%RPTZ A,N-1MAC *DATA_P+0%,*COFF_P+0%,ASTH A,*OUTBUF_P+LOOP:EEND B EEND.end四、IIR滤波//链接命令文件MEMORY{PAGE 0:EPROM: org=0E00H, len=1000HVECS0: org=0FF80H, len=0080hPAGE 1:SPRAM: org=0060H, len=0020hDARAM: org=0080H, len=1380H}SECTIONS{.text :>EPROM PAGE 0.data :>EPROM PAGE 0X: align(8) {}>DARAM PAGE 1Y: align(8) {}>DARAM PAGE 1B: align(8) {}>DARAM PAGE 1A: align(8) {}>DARAM PAGE 1.vecs0:>VECS0, PAGE 0}//输入数据序列(512点)0x7fff0x00x0…0x0//汇编语言源代码.title "IIR.ASM".mmregs.def _c_int00X .usect "X", 5Y .usect "Y", 5B .usect "B", 5A .usect "A", 5PA0 .set 0PA1 .set 1.datatable: .word 0.word 0.word 0.word 0.word 0.word 0.word 0.word 0.word 3116.word -10286.word 14615.word -10286.word 3116.word -22082.word 31149.word -30484.word 28383.text_c_int00:SSBX FRCTSTM #X, AR1RPT #3MVPD #table, *AR1+STM #Y, AR1RPT #3MVPD #table+4, *AR1+STM #B, AR1RPT #4MVPD #table+8, *AR1+STM #A, AR1RPT #3MVPD #table+13, *AR1+STM #X+4, AR2STM #A+3, AR3STM #Y+3, AR4STM #B+4, AR5STM #5, BKSTM #-1, AR0STM #1000H, AR6STM #0200H-1, AR7loop:PORTR PA1, *AR2LD *AR2, ASTL A, -1, *AR2MPY *AR2+0%, *AR5+0%, AMAC *AR2+0%, *AR5+0%, AMAC *AR2+0%, *AR5+0%, AMAC *AR2+0%, *AR5+0%, AMAC *AR2, *AR5+0%, AMAC *AR4, *AR3, AMAC *AR4, *AR3, AMAC *AR4, *AR3, AMAC *AR4+0%, *AR3+0%, AMAC *AR4, *AR3, AMAC *AR4, *AR3, AMAC *AR4, *AR3, AMAC *AR4, *AR3, AMAC *AR4+0%, *AR3+0%, AMAC *AR4, *AR3, AMAC *AR4, *AR3, AMAC *AR4+0%, *AR3+0%, AMAC *AR4+0%, *AR3+0%, AMAR *AR3+0%STH A, *AR4PORTW *AR4, PA0STH A, *AR6+BANZ loop, *AR7-end: B end.end五、除法//链接命令文件/*chuf.cmd*/chuf.obj-m chuf.map-o chuf.outMEMORY{PAGE 0: ROM :origin=0080h,length=1000hROM :origin=0060h,length=10hPAGE 1: OTHER :origin=0400h,length=40h}SECTIONS{.text : {}>ROM PAGE 0.data :{}>ROM PAGE 0.stack : {}>OTHER PAGE 1.bss : {}>OTHER PAGE 1}//汇编语言源代码;*** 编制计算除法运算的程序段。

c54xx系列DSP汇编指令详解

c54xx系列DSP汇编指令详解
x
意义 或运算 异或运算
减1 赋值于 表示一个立即数 x 的补码
|x|
x 的绝对值
0x
十六进制数据
>>
右移
<<
左移
×
乘法
*
指针指向的地址
TMS320C54xx 系列 DSP 的指令一共有 129 条,按功能分为如下几类:算术指令、逻 辑指令、程序控制指令、存储和装入指令以及循环指令。下面根据每种指令功能的不同,
目的累加器的反 if dst=A,then dst_=B if dst=B then dst_=A
E 地址总线 EAB 地址寄存器 23 位立即数表示的程序存储器地址 ST1 寄存器中的分数方式位 十六进制数据 十六进制数据 累加器 A 的高端(位 32~16) ST1 寄存器中的保持方式位 中断标志寄存器 ST1 寄存器中的中断屏蔽位 少于 9 位的短立即数
3 位立即数(0 ≤ k3 ≤ 7 ) 5 位立即数(-16 ≤ k5 ≤ 15 ) 9 位立即数(0 ≤ k9 ≤ 115 )
16 位长立即数 使用长字寻址 32 位单数据存储器操作数 存储器映射寄存器,AR0~AR7 或 SP
存储器映射寄存器,AR0~AR7 或 SP
紧跟 XC 指令的字数,n=1 或 2 指定在 RSBX、SSBX 和 XC 指令中修改的状态寄存器 N=0,状态寄存器 ST0 N=1,状态寄存器 ST1 ST0 寄存器中的累加器 A 的溢出标志 ST0 寄存器中的累加器 B 的溢出标志 目的累加器(A 或 B)的溢出标志 目的累加器反(A 或 B)的溢出标志 源累加器(A 或 B)的溢出标志 ST1 寄存器中的溢出方式位 16 位立即数表示的端口地址
③ 乘法指令
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

;************ GPIO.asm ***************
.global _c_int0 ;定义全局变量 _c_int
.global PHANTOM ;定义全局变量 PHANTOM
.data ;data定义数据
b0 .word 0fffEh ;turn-on GPIO0 ;
b1 .word 0fffDh ;turn-on GPIO1
b2 .word 0fffBh ;turn-on GPIO2
b3 .word 0fff7h ;turn-on GPIO3
b4 .word 0ffEFh ;turn-on GPIO0
b5 .word 0ffDFh ;turn-on GPIO1
b6 .word 0ffBFh ;turn-on GPIO2
b7 .word 0ff7Fh ;turn-on GPIO3
GPR0 .word 0
.include f2407.h ;包含一个 f2407.h 文件
KICK_DOG .macro ;看门狗控制寄存器LDP #00E0h ;DP-->7000h-707fh ;数据页指针将00E0赋给DP SPLK #05555h,WDKEY ;将05555h送给寄存器WDKEY SPLK #0aaaah,WDKEY ;同上
LDP #0h ;DP-->0000h-007fh ;数据页指针将0赋给DP
.end ;结束程序
.text ;向下是个文本段
_c_int0: ;开始执行程序LDP #0h ;数据页指针
SETC I NTM ;关掉中断让程序正常运行
SETC C NF ;B2程序存储器 0,数据 1,程序SPLK #0000h,IMR ;将0000送给寄存器中断屏蔽寄存器LACC IFR ;将中断标志寄存器IFR的值给了累加器SACL IFR ;将中断标志寄存器IFR的值
LDP #00E0h ;数据页指针
SPLK #0200h, SCSR1 ;将0200送给系统控制和状态寄存SPLK #006Fh,WDCR ;禁止看门狗复位
KICK_DOG ;看门狗寄存器
SPLK #0h,GPR0 ;将0送给等待寄存器GPR0
OUT GPR0,WSGR ;将GPR0的值送给WSGR
LDP #00E1h ;数据页指针
SPLK #00000h,MCRA ;定义RA输入或输出
SPLK #0FF00h,MCRB ;定义RB输入或输出
SPLK #00000h,MCRC ;定义RC输入或输出
SPLK #0FFFFh,PADATDIR ;端口A输出高电平
SPLK #0FFFFh,PBDATDIR
SPLK #0FFFFh,PCDATDIR
SPLK #0FFFFh,PEDATDIR
SPLK #0FFFFh,PFDATDIR
MAIN: ;主程序
LDP #0 ;数据页指针
LOOP: ;循环
LDP #00E1h ;数据页指针
setc x f ;给xf高电平,使发光二极管发光SPLK #0FFFFh,PADATDIR ;端口A输出高电平
SPLK #0FFFFh,PBDATDIR
SPLK #0FFFFh,PCDATDIR
SPLK #0FFFFh,PEDATDIR
SPLK #0FFFFh,PFDATDIR
CALL D ELAY ;调用延迟程序
clrc x f ;清零
SPLK #0FF00h,PADATDIR ;端口A数据和方向控制寄存器输出低电平
SPLK #0FF00h,PBDATDIR
SPLK #0FF00h,PCDATDIR
SPLK #0FF00h,PEDATDIR
SPLK #0FF00h,PFDATDIR
B MAIN ;无条件跳转到主程序
DELAY: ;延迟
D_LOOP: ;
RPT #0FFh ;重复0FF+1次
NOP ;无动作
RET ;跳转到 CALL DELAY
PHANTOM: ; 假中断KICK_DOG ;看门狗寄存器
B RET ;无条件跳转到 CALL DELAY。

相关文档
最新文档