实验1ARM汇编指令实验1、实验目的:z熟悉ADS开发环境和wiggler调试环境。z掌握简单的ARM汇编指令的使用方法。2、实验设备zPC机、JTAG调试板、S3C2410开发板。3、实验内容z熟悉ARM开发环境的建立。z使用ARM汇编指令设置GPIO口的相应寄存器,控制LED灯的亮灭。4、实验原理下面介绍本实验用到的一些汇编指令。1).LDR/STR指令说明:LDR/STR指令用于加载/存储寄存器。举例说明:示例:LDRr3,[r0],#4//从r0表示的地址中读取数据分别存放到r3中,然后将r0加4。STRr3,[r1],#4//将r3中的数据保存到r1表示的地址中,然后将r1加4。LDMIA/STMIA指令说明:LDM/STM指令用于加载/存储多个寄存器,举例示例:LDMIAr0!,{r4---r11}//从r0表示的地址中顺利取出8个字数据分别存放到r4-r11中。2).程序分支指令B指令说明:B指令为ARM的分支指令,将引起处理器转移到制定标号处执行。示例:BLabel//处理器转移到Label标号处执行BEQstop//Z标记置位,则跳转到stop标号处执行;否则继续下一条指令BNEoctcopy//Z标记清0,则跳转到octcopy标号处执行;否则继续下一条指令3).其他指令SUBS说明:该指令有SUB指令加上S后缀组成,S后缀标志根据执行结果更新条件标志码。示例:SUBSr3,r3,#1//如果r3等于0,则Z位清0MOVS指令说明:该指令由MOV指令加上后缀S组成,S后缀标志根据执行结果更新条件标志码。1示例:MOVSr3,r2,LSB#3//将r2右移3位即除以8,然后赋值给r3。5、实验相应寄存器说明GPFCON-端口配置寄存器。GPFDAT-端口数据寄存器GPFUP-端口上拉电阻使能寄存器6、实验电路图27.实验程序实现利用ARM汇编语言实现跑马灯程序/*asm.s*/GPFCONEQU0x56000050GPFDATEQU0x56000054GPFUPEQU0x56000058EXPORTLEDTESTAREALEDTESTASM,CODE,READONLY;该伪指令定义了一个代码段,段名为LEDTESTASM,属性只读LEDTEST;设置GPF4-GPF7为outputldrr0,=GPFCONldrr1,=0x5500strr1,[r0];禁止GPF4-GPF7端口的上拉电阻ldrr0,=GPFUPldrr1,=0xff00strr1,[r0];将数据端口F的数据寄存器的地址赋值给寄存器r2ldrr2,=GPFDAT;跑马灯循环ledloop1ldrr1,=0xf0strr1,[r2];使GPF7输出高电平,D9-D12灯会灭bldelay1;调用延迟子程序ledloop2ldrr1,=0x0strr1,[r2];使GPE7输出低电平 D9-D12灯亮3bldelay2;调用延迟;延迟程序delay1ldrr3,=0x1ffff;设置延迟的时间delay3subr3,r3,#1;r3=r3-1cmpr3,#0x0;将r3的值与0相比较bnedelay3;比较的结果不为0(r3不为0),继续调用delay1,否则执行下一条语句bledloop2movpc,lr;返回;延迟程序delay2ldrr3,=0x2ffff;设置延迟的时间delay4subr3,r3,#1;r3=r3-1cmpr3,#0x0;将r3的值与0相比较bnedelay4;比较的结果不为0(r3不为0),继续调用delay1,否则执行下一条语句bledloop1movpc,lr;返回END;程序结束符4实验2C和汇编语言的混合编程实验1、实验目的z学习在C程序中使用嵌入式汇编编写程序z了解嵌入式汇编的格式、语言特点2、实验设备zS3C2410开发板zADS1.2集成开发环境,JTAG调试器z串口连接线3、实验原理在ARM的应用开发中,C语言功能强大且容易编写程序,但是汇编程序在底层的操作仍然具有C程序无法替代的功能,有时候我们需要在C程序中嵌入汇编程序来完成一些直接对底层的诸如寄存器的操作。在ARMC语言中,使用关键词__asm来标志一段汇编指令程序:其格式如下,__asm{汇编程序}嵌入式汇编语言不同的地方有:z如果一行中有多个汇编指令,指令之间用分号(;)隔离z如果一天指令占多行,要使用续行符号(\)z在汇编指令段中可以使用C语言的注释语句4、实验电路图5、程序实现5.1创建GPFC.c源文件,应用C语言实现嵌入式编程/*这是一个利用GPIO做跑马灯的程序*/1/*GPIO1到GPIO4分别对应2410的GPF4到GPF7*/#include2410lib.h#defineGPFCON(*(volatileunsigned*)0x56000050)//PortFcontrol#defineGPFDAT(*(volatileunsigned*)0x56000054)//PortFdata#defineGPFUP(*(volatileunsigned*)0x56000058)//Pull-upcontrolFintMain(){GPFCON=(GPFCON|0xFF00)&0xFFFF55FF;//GPF4--GPF7设置为outputGPFUP|=0xFF00;//disableGPFpullupwhile(1){inti=0;GPFDAT=(GPFDAT&0xFFFFFF0F)|0xE0;Delay(100);GPFDAT=(GPFDAT&0xFFFFFF0F)|0xD0;Delay(100);GPFDAT=(GPFDAT&0xFFFFFF0F)|0xB0;Delay(100);GPFDAT=(GPFDAT&0xFFFFFF0F)|0x70;Delay(100);}}5.2创建GPFA.c源程序,实现在C程序中嵌入ARM汇编指令//定义寄存器地址#defineGPFCON(*(volatileunsigned*)0x56000050)//PortFcontrol#defineGPFDAT(*(volatileunsigned*)0x56000054)//PortFdata#defineGPFUP(*(volatileunsigned*)0x56000058)//Pull-upcontrolFintMain(){intx=0;//时钟、端口、串口初始化SetClockDivider(1,1);SetSysFclk(DFT_FCLK_VAL);Port_Init();Uart_Select(0);Uart_Init(0,UART_BAUD);2GPFCON=(GPFCON|0xFF00)&0xFFFF55FF;//GPF4--GPF7设置为outputGPFUP|=0xFF00;//disableGPFpullupwhile(1){GPFDAT=(GPFDAT&0xFFFFFF0F)|0xE0;Delay(200);__asm//嵌入汇编指令{addx,x,#1nopnop}GPFDAT=(GPFDAT&0xFFFFFF0F)|0xD0;Delay(200);GPFDAT=(GPFDAT&0xFFFFFF0F)|0xB0;Delay(200);GPFDAT=(GPFDAT&0xFFFFFF0F)|0x70;Delay(200);Uart_Printf(thevalueofxis:%d\n,x);//串口输出}}5.3创建delay.s和GPFTEST.c源文件,实现在C程序中汇编函数调用/*delay.s*/EXPORTdelayAREADELAY,CODE,READONLY;该伪指令定义了一个代码段,段名为Init,属性只读;下面是延迟子程序delaysubr0,r0,#1;r0=r0-1cmpr0,#0x0;将r0的值与0相比较bnedelay;比较的结果不为0(r0不为0),继续调用delay,否则执行下一条语句movpc,lr;返回END;程序结束符/*GPFTEST.C*//*C语言函数*//*端口F寄存器预定义*/#defineGPFCON(*(volatileunsigned*)0x56000050)//PortFcontrol3#defineGPFDAT(*(volatileunsigned*)0x56000054)//PortFdata#defineGPFUP(*(volatileunsigned*)0x56000058)//Pull-upcontrolFexternintdelay(inttime);/*声明汇编函数*/intMain(){GPFCON=(GPFCON|0xFF00)&0xFFFF55FF;//GPF4--GPF7设置为outputGPFUP|=0xFF00;//disableGPFpullupwhile(1){inti=0;GPFDAT=(GPFDAT&0xFFFFFF0F)|0xE0;delay(0x1ffff);GPFDAT=(GPFDAT&0xFFFFFF0F)|0xD0;delay(0x1ffff);GPFDAT=(GPFDAT&0xFFFFFF0F)|0xB0;delay(0x1ffff);GPFDAT=(GPFDAT&0xFFFFFF0F)|0x70;delay(0x1ffff);}}6.实验过程程序运行后,结果和实验一相同,LED灯不断闪烁。4实验3外部中断实验1.实验目的:z了解S3C2410外部中断的工作原理。z掌握S3C2410外部中断的使用方法。2.实验设备zPC机、JTAG调试板、S3C2410开发板。3.实验内容z通过外部按键(K10)触发外部中断0(EINT0)。4.实验原理4.1ARM的异常中断类型七种异常中断4.2异常中断响应过程和返回过程异常中断的响应过程:1).保存处理器但前状态寄存器CPSR的值、中断屏蔽以及各条件标志位到将要执行的异常中断的SPSR中。2).设置但前程序状态寄存器CPSR的值,其中包括:设置CPSR响应位的值使处理器进入特定的处理器模式;安要求屏蔽中断,通常应该屏蔽IRQ中断。在FIQ总断时屏蔽FIQ中断。3).设置Lr寄存器。将中断相应模式的Lr寄存器的值设为异常中断的返回地址4).处理程序计数器PC,将PC值设为相应的中断向量的地址,从而实现跳转以执行中断程序。异常中断的返回当处理器执行完以上流程之后,处理器已经自中断向量进入异常中的处理状态。异常中断处理完毕之后,在异常中断程序的末端,处理器进入异常中断的返回状态,其流程如下:1).恢复状态寄存器。将保存在中断模式中的SPSR值赋给当前的状态寄存器。12).将返回地址赋值到程序计数器。这样程序将返回到异常中断产生的下一条指令或出现问题的指令处执行。需要注意的是:对于不同的异常中断,其返回地址的计算方法也是不同的,IRQ和FIQ异常中断产生时,程序计数器PC已经更新,而SWI中断和未定义指令中断时由当前指令自身产生的,程序计数器PC尚未更新,所以要计算出下一条指令的地址来执行返回操作;指令预取指中指异常中断和数据访问中断要求,返回到出现异常的执行现场,重新执行操作。S3C2410X异常中断的响应-返回流程图:保存状态寄存器CPSR-进入特定模式、屏蔽中断-设置Lr寄存器-设置程序计数器PC进入中断向量、异常中断的处理程序-恢复状态寄存器-将返回地址复制到程序计数器4.3异常中断的安装S3C2410系统通过异常向量表安装异常中断处理程序。即将异常向量表指向异常中断处理程序的入口,实现面向异常中断的跳转,异常向量中断的的入口地址时固定的(0x00-0x1C),系统运行到满足异常中断时,系统将自动跳入相应的异常中断向量表中,而在异常向量表中保存的正是利用跳转指令或LDR指令指向该中断的异常中断处理程序,这就实现了异常中断处理程序的安装。1).利用跳转指令实现异常中断的安装将BL指令放置到中断向量表的特定位置,跳转目标地址为中断处理程序的首地址,便可直接实现异常中断