




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
嵌入式系统 实验报告18/55嵌入式系统原理与应用实验报告实验一ARM汇编指令实验—简单数据搬移实验一、实验目的熟悉实验开发环境,掌握简单ARM汇编指令的使用方法。二、实验环境硬件:PC机软件:ADS1.2集成开发环境三、实验内容熟悉开发环境并使用LDR/STR,MOV等指令访问寄存器或存储单元;使用ADD/SUB/LSL/LSR/AND/ORR等指令,完成基本数学/逻辑运算。四、实验要求(1)按照2.3节介绍的方法,在ADS下创建一个工程asmlab1,定义两个变量x,y和堆栈地址0x1000,将变量x的内容存到堆栈顶,然后计算x+y,并将和存到堆栈的下一个单元。通过AXD查看寄存器和memory和寄存器中数据变化。(2)在指令后面加上适当注释,说明指令功能。(3)指出程序执行完成后各相关寄存器及存储器单元的具体内容。五、实验过程(1)在ADS下创建一个工程asmlab1,定义两个变量x,y和堆栈地址0x1000,将变量x的内容存到堆栈顶,然后计算x+y,并将和存到堆栈的下一个单元。通过AXD查看寄存器和memory和寄存器中数据变化。创建工程:通过AXD查看寄存器和memory中数据变化:(2)在指令后面加上适当注释,说明指令功能。AREAInit,CODE,READONLY;AREA用于声明一个只读或读写的代码或数据段
ENTRY;ENTRY声明程序入口
CODE32;CODE32用于申明以下代码为32位ARM指令
xEQU45;x=45
yEQU64;y=64
stack_topEQU0x1000;definethetopaddressforstacks栈顶为0x1000
startMOVSP,#stack_top;SP=0x1000
MOVR0,#x ;R0=45
STRR0,[SP] ;[1000]存放45
MOVR0,#y;R0=64
LDRR1,[SP];LDR加载指令
ADDR0,R0,R1;将R0与R1相加赋值给R0
STRR0,[SP,#4];STRR0,[SP,#4];先执行SP+4,再将寄存器R0
B.END;END程序结束。(3)指出程序执行完成后各相关寄存器及存储器单元的具体内容。六、相关知识(1)相关指令及伪指令AREA用于声明一个只读或读写的代码或数据段,ENTRY声明程序入口,CODE32用于申明以下代码为32位ARM指令,END程序结束。LDR加载指令,STR存储指令.STRR0,[SP,#4];先执行SP+4,再将寄存器R0内容复制到SP指向的存储器(2)存储器的大小端存储格式:1)大端格式在这种格式中,字数据的高位字节存储在低地址中,而字数据的低位字节则存放在高地址中,如下图所示。2)小端格式在这种格式中,字数据的高位字节存储在高地址中,而字数据的低位字节则存放在低地址中,如下图所示。实验二ARM汇编指令实验—字符串拷贝实验一、实验目的通过实验掌握使用LDB/STB,b等指令完成较为复杂的存储区访问和程序分支,学习使用条件码。二、实验环境硬件:PC机。软件:ADS1.2集成开发环境三、实验内容熟悉开发环境的使用并完成一块存储区的拷贝。完成分支程序设计,要求判断参数,根据不同参数,调用不同的子程序。四、实验要求(1)按照2.3节介绍的方法,在ADS下创建一个工程asmlab2,定义两个数据存储区Src和Dst,Src用于存放原字符串,Dst用于存放目的字符串。堆栈地址0x400,将变量原字符串的内容拷贝到目的字符串中,要能判断原字符串的结束符(0),并统计字符串中字符的个数。通过AXD查看寄存器和memory和寄存器中数据变化。(2)在指令后面加上适当注释,说明指令功能。(3)指出程序执行完成后各相关寄存器及存储器单元的具体内容。五、实验过程(1)按照2.3节介绍的方法,在ADS下创建一个工程asmlab2,定义两个数据存储区Src和Dst,Src用于存放原字符串,Dst用于存放目的字符串。堆栈地址0x400,将变量原字符串的内容拷贝到目的字符串中,要能判断原字符串的结束符(0),并统计字符串中字符的个数。通过AXD查看寄存器和memory和寄存器中数据变化。创建工程如下:通过AXD查看寄存器和memory中数据变化:(2)在指令后面加上适当注释,说明指令功能。AREAInit,CODE,READONLY;AREA用于声明一个只读或读写的代码或数据段,这里是只读代码段ENTRY ;ENTRY声明程序入口CODE32 ;CODE32用于申明以下代码为32位ARM指令START ;标号“start”MOVSP,#0x400;SP=0x400LDRR0,=Src;LDR伪指令将源字符串的地址值读取到R0寄存器中LDRR1,=Dst;LDR伪指令将目的字符串的地址值读取到R1寄存器中MOVR3,#0;R3=0进行初始化,用来统计字符串中字符的个数Strcopy ;标号“strcopy”LDRBR2,[R0],#1;将源地址起始位置的一个字节数据装入R2中,且R0=R0+1CMPR2,#0 ;比较R2和结束符0的大小BEQendcopy;若R2==0表示跳转到endcopy处STRBR2,[R1],#1;若R2!=0,把寄存器R2中的字数据(32位)保存到目的地址的内存地址中,且R1=R1+1ADDR3,R3,#1;R3=R3+1用来统计字符串中字符的个数Bstrcopy;跳转回标号“strcopy”处Endcopy ;标号“endcopy”LDRR0,=ByteNum ;LDR伪指令将ByteNum的地址值读取到R0寄存器中STRR3,[R0] ;将统计得到的字符个数存储到ByteNum内存单元中B. ;无限循环跳转到当前地址AREADatapool,DATA,READWRITE;AREA用于声明一个只读或读写的代码或数据段,这里是读写数据段SrcDCB"string" ;源字符串数据存储地址 DstDCB0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;目的字符串存储地址ByteNumDCD0;字符个数统计单元存储地址END ;END程序结束(3)指出程序执行完成后各相关寄存器及存储器单元的具体内容。六、相关知识相关指令及伪指令LDR:LDR伪指令将一个32位的常数或者一个地址值读取到寄存器中。当需要读取到寄存器中的数据超过了MOV指令可以操作的范围时,可以使用LDR伪指令将该数据读取到寄存器中。在汇编编译器处理源程序时,如果该常数没有超过MOV可以操作的范围,则LDR指令被一条MOV替代,否则,该常数将被放在最近的一个文字池内(literalpool),同时,本指令被一条基于PC的加载指令LDR替代。语法格式:LDR<register>,=<expression>其中,expression为需要读取的32位常数。register为目标寄存器。加载或者存储一个字节的数据时,使用的指令为:LDRB和STRB实验三ARM汇编指令实验--ARM处理器工作模式实验一、实验目的(1)通过实验掌握学会使用msr/mrs指令实现ARM处理器工作模式的切换,观察不同模式下的寄存器,加深对CPU结构的理解;(2)通过实验掌握ld中如何使用命令行指定代码段起始地址。二、实验设备硬件:PC机软件:ADS1.2集成开发环境三、实验内容通过ARM汇编指令,在各种处理器模式下切换并观察各种模式下寄存器的区别;掌握ARM不同模式的进入与退出。四、实验原理1.ARM处理器模式ARM体系结构支持下表所列的7种处理器模式。2.程序状态寄存器程序状态寄存器CPSR和SPSR包含了条件码标志,中断禁止位,当前处理器模式以及其他状态和控制信息。每种异常模式都有一个程序状态保存寄存器SPSR。当异常出现时,SPSR用于保留CPSR的状态。CPSR和SPSR的格式如下:条件码标志: N,Z,C,V大多数指令可以检测这些条件码标志以决定程序指令如何执行2)控制位:最低8位I,F,T和M位用作控制位。当异常出现时改变控制位。当处理器在特权模式下也可以由软件改变。中断禁止位:I置1则禁止IRQ中断;F置1则禁止FIQ中断。T位:T=0指示ARM执行;T=1指示Thumb执行。在这些体系结构的系统中,可自由的使用能在ARM和Thumb状态之间切换的指令。模式位:M0,M1,M2,M3和M4(M[4:0])是模式位.这些位决定处理器的工作模式.如下表所示。ARM工作模式M[4:0]M[4:0]模式可访问的寄存器0b10000用户模式PC,R14-R0,CPSR0b10001FIQ模式PC,R14_fiq-R8_fiq,R7-R0,CPSR,SPSR_fiq0b10010IRQ模式PC,R14_irq-R8_fiq,R12-R0,CPSR,SPSR_irq0b10011管理模式PC,R14_svc-R8_svc,R12-R0,CPSR,SPSR_svc0b10111中止模式PC,R14_abt-R8_abt,R12-R0,CPSR,SPSR_abt0b11011未定义模式PC,R14_und-R8_und,R12-R0,CPSR,SPSR_und0b11111系统模式PC,R14-R0,CPSR3.状态寄存器与通用寄存器之间的传送指令ARM指令中有两条指令MSR和MRS,用于在状态寄存器和通用寄存器之间传送数据。修改状态寄存器一般是通过“读取-修改-写回”三个步骤的操作来实现的。需要注意的是不能通过该指令直接修改CPSR中的T控制位直接将程序状态切换到Thumb状态,必须通过BX等指令来完成程序状态的切换。(1)状态寄存器到通用寄存器的传送指令(MRS) MRS指令用于将状态寄存器的内容传到通用寄存器中,它主要用于以下三种场合: 通过“读取-修改-写回”操作序列修改状态寄存器的内容。MRS指令用于将状态寄存器的内容读到通用寄存器中; 当异常中断允许嵌套时,需要在进入异常中断之后,嵌套中断发生之前保存当前处理器模式对应的SPSR。这时需要先通过MRS指令读出SPSR的值,再用其他指令将SPSR值保存起来; 当进程切换时也需要保存当前寄存器值。(2)通用寄存器到状态寄存器的传送指令(MSR) 当需要保存或修改当前模式下CPSR或SPSR的内容时,这些内容首先必须传送到通用寄存器中,再对选择的位进行修改,然后将数据回写到状态寄存器。这里讲述的MSR指令完成这一过程的最后一步,即将立即数常量或通用寄存器的内容加载CPSR或SPSR的指定区域。指令格式: MSR{<cond>}CPSR_f|SPSR_f,#<32-bitimmediate>MSR{<cond>}CPSR_<field>|SPSR_<field>,Rm这里<field>表示下列情况之一:c-控制域-PSR[7:0]。x-扩展域-PSR[15:8](在当前ARM中未使用)。s-状态域-PSR[23:16](在当前ARM中未使用)。f-标志位域-PSR[31:24]。五、实验过程(1)按照2.3节介绍的方法,在ADS下创建一个工程asmmodelab,完成各个模式下的堆栈初始化工作,并将R1-R12的内容存入当前模式下堆栈。通过AXD运用单步执行方式调试程序,验证工作模式的切换,注意观察CPSR寄存器中的变化。随着程序调试过程中在模式间的切换,使用寄存器观察器切换到不同的工作模式下观察SP(R13)的变化情况。创建工程如下:参考程序及注释如下:usr_stack_legthequ64 ;用户模式svc_stack_legthequ32 ;管理模式fiq_stack_legthequ16 ;快速中断模式irq_stack_legthequ64 ;中断模式abt_stack_legthequ16 ;中止模式und_stack_legthequ16 ;未定义模式 areareset,code,readonly ;声明只读代码段reset entry ;ENTRY声明程序入口 code32 ;CODE32用于申明以下代码为32位ARM指令startmovr0,#0 movr1,#1 movr2,#2 movr3,#3 movr4,#4 movr5,#5 movr6,#6 movr7,#7 movr8,#8 movr9,#9 movr10,#10 movr11,#11 movr12,#12 blinitstack;初始化各模式下的堆栈指针BL(BranchwithLink跳转将PC拷入LR,用于子程序返回);打开irq中断(将cpsr寄存器的i位清0) mrsr0,cpsr ;r0<--cpsr bicr0,r0,#0x80 ;开IRQ中断 msrcpsr_cxsf,r0 ;cpsr<--r0;切换到用户模式msrcpsr_c,#0xd0 ;(CPSR[4:0]=10000,同时CPSR[7:6]=11,CPSR[5]=0保留,即CPSR[7:0]=11010000=0xd0) mrsr0,cpsr ;保存当前CPSR,将CPSR传入R0;STM指令把寄存器列表中索引最小的寄存器存在最低地址,所以R1在最低地址,向上依次是R1,R2,...R12,LR。完成后SP指向保存R1的地址。stmfdsp!,{r1-r12} ;观察由用户模式能否切换到其他模式;切换到管理模式 msrcpsr_c,#0xdf mrsr0,cpsr ;保存当前CPSR,将CPSR传入R0 stmfdsp!,{r1-r12} ;STM指令把寄存器列表中索引最小的寄存器存在最低地址,所以R1在最低地址,向上依次是R1,R2,...R12,LR。完成后SP指向保存R1的地址。haltbhalt ;留在此处Initstack ;初始化各模式下的堆栈子程序;子程序内容r0<--lr,因为各种模式下r0是相同的而各个模式movr0,lr ;R0<-LR,各模式下的R0是相同的 ;设置管理模式堆栈 ;先切换到管理模式下再设置该模式下的SP
msrcpsr_c,#0xd3;11010011cpsr[4:0] ldrsp,stacksvc ;将StackSvc代表的地址装入SPstmfdsp!,{r1-r12} ;STM指令把寄存器列表中索引最小的寄存器存在最低地址,所以R1在最低地址,向上依次是R1,R2,...R12,LR。完成后SP指向保存R1的地址。;设置中断模式堆栈;先切换到中断模式下再设置该模式下的SP,;中断模式CPSR[7:0]=110,10010 msrcpsr_c,#0xd2 ldrsp,stackirq ;将stackirq代表的地址装入SP;STM指令把寄存器列表中索引最小的寄存器存在最低地址,所以R1在最低地址,向上依次是R1,R2,...R12,LR。完成后SP指向保存R1的地址。 stmfdsp!,{r1-r12} msrcpsr_c,#0xd1; ;设置快速中断模式堆栈 ldrsp,stackfiq ;将stackfiq代表的地址装入SP;STM指令把寄存器列表中索引最小的寄存器存在最低地址,所以R1在最低地址,向上依次是R1,R2,...R12,LR。完成后SP指向保存R1的地址。 stmfdsp!,{r1-r12} ;设置中止模式堆栈 ;先切换到中断模式下再设置SP msrcpsr_c,#0xd7 ldrsp,stackabt ;将stackabt代表的地址装入SP;STM指令把寄存器列表中索引最小的寄存器存在最低地址,所以R1在最低地址,向上依次是R1,R2,...R12,LR。完成后SP指向保存R1的地址。 stmfdsp!,{r1-r12} ;设置未定义模式堆栈 msrcpsr_c,#0xdb ldrsp,stackund ;将stackund代表的地址装入SP;STM指令把寄存器列表中索引最小的寄存器存在最低地址,所以R1在最低地址,向上依次是R1,R2,...R12,LR。完成后SP指向保存R1的地址。 stmfdsp!,{r1-r12};设置系统模式堆栈 msrcpsr_c,#0xdf ldrsp,stackusr ;将stackusr代表的地址装入SP;STM指令把寄存器列表中索引最小的寄存器存在最低地址,所以R1在最低地址,向上依次是R1,R2,...R12,LR。完成后SP指向保存R1的地址。 stmfdsp!,{r1-r12} movpc,r0 ;返回;定义堆栈首地址,即最高地址处stackusrdcdusrstackspace+(usr_stack_legth-1)*4stacksvcdcdsvcstackspace+(svc_stack_legth-1)*4stackirqdcdirqstackspace+(irq_stack_legth-1)*4stackfiqdcdfiqstackspace+(fiq_stack_legth-1)*4stackabtdcdabtstackspace+(abt_stack_legth-1)*4stackunddcdundstackspace+(und_stack_legth-1)*4 areareset,data,noinit,align=2 ;分配栈堆空间usrstackspacespaceusr_stack_legth*4 ;分配USR_STACK_LENGTH*4个字节svcstackspacespacesvc_stack_legth*4irqstackspacespaceirq_stack_legth*4fiqstackspacespacefiq_stack_legth*4abtstackspacespaceabt_stack_legth*4undstackspacespaceund_stack_legth*4 end通过AXD运用单步执行方式调试程序,验证工作模式的切换,注意观察CPSR寄存器中的变化。随着程序调试过程中在模式间的切换,使用寄存器观察器切换到不同的工作模式下观察SP(R13)的变化情况。(2)实验过程中请记录并思考以下内容:1)程序复位之后系统处于什么模式?管理模式。2)记录每种模式下的初始堆栈指针,以及执行R1-R12内容压栈后本模式堆栈相关内存单元的数值。并分析快速中断FIQ模式与其他模式存入的R1-R12有什么不同。管理模式,初始化堆栈指针:0x8240中断模式,初始化堆栈指针:0x8340快速中断模式,初始化堆栈指针:0x8380只到r7就停了,快速中断模式有自己的分组寄存器R8_fiqR14_fiq。中止模式,初始化堆栈指针:0x8c0未定义模式,初始化堆栈指针:0x8400系统模式,初始化堆栈指针:0x81c03)切换成用户模式之后还能否从用户模式切换到其他模式(如系统模式)?能,例如可以切换到中断模式。4)用户模式下能否执行堆栈压栈操作?如果能得话,观察用户模式下压栈之前和压栈之后其堆栈区域的变化情况。用户模式下能执行压栈操作。堆栈的变化情况如图所示。5)观察本程序模式切换过程中SPSR有无变化,并解释其原因。无变化,因为没有产生异常情况。实验四ARM汇编与C混合编程实验—ARM启动过程控制实验一、实验目的(1)
掌握建立基本完整的ARM工程,包含启动代码,C语言程序等; (2)
了解ARM启动过程,学会编写简单的C语言程序和汇编启动代码并进行调试; (3)
掌握如何指定代码入口地址与入口点; (4)
掌握通过memory/register/watch/variable窗口分析判断结果。二、实验设备硬件:PC机软件:ADS1.2集成开发环境三、实验内容使用汇编语言编写初始化程序,并引导至C语言main函数,用汇编语言编写延时函数实现毫秒级的延时,在C语言中调用延时函数,实现1s钟定时。四、实验原理 1.ARM异常向量表结构当正常的程序执行流程暂时挂起时,称之为异常,例如:处理一个外部的中断请求。在处理异常之前,必须保存当前的处理器状态,以便从异常程序返回时可以继续执行当前的程序。ARM异常向量表如下:处理器允许多个异常同时发生,这时,处理器会按照固定的顺序进行处理,参照下面的异常优先级。高优先级: 1Reset 2Dataabort 3FIQ 4IRQ 5Prefetchabort低优先级:6UndefinedInstruction,Softwareinterrupt由上可见,Reset入口,即为整个程序的实际入口点。因此,我们在编写代码的时候,一般地,我们使用下面的代码:Reset_Handler: BReset_HandlerUndefined_Handler:BUndefined_HandlerSWI_Handler: BSWI_HandlerPrefetch_Handler: BPrefetch_HandlerAbort_Handler: BAbort_HandlerNOP/*Reservedvector*/IRQ_Handler: BIRQ_HandlerFIQ_Handler: BFIQ_Handler2.ARMC与汇编混合编程及其接口ATPCS标准ATPCS(ARM-ThumbProduceCallStandard)是ARM程序和Thumb程序中子程序调用的基本规则,目的是为了使单独编译的C语言程序和汇编程序之间能够相互调用。这些基本规则包括子程序调用过程中寄存器的使用规则、数据栈的使用规则和参数的传递规则。(1)、寄存器的使用规则(2)、数据栈的使用规则ATPCS规定数据栈为FD(满递减)类型,并且对数据栈的操作是8字节对齐的。(3)、参数的传递规则当参数不超过4个时,可以使用寄存器R0~R3来传递参数;当参数超过4个时,还可以使用数据栈来传递参数。结果为一个32位的整数时,可以通过寄存器R0返回;结果为一个64位整数时,可以通过寄存器R0和R1返回,依次类推。(4)、内嵌汇编指令的语法格式ARMC汇编器使用关键字“__asm"。如果有多条汇编指令需要嵌入,可以用{“}”将它们归为一条语句。C编译器在对程序进行编译时,会直接将asm函数内部的内容直接引用到期编译成的汇编语言程序中。asm函数的语法格式为:__asm{指令指令}(5)、C与汇编程序的相互调用1)在C语言程序中调用汇编程序为了保证程序调用时参数的正确传递,汇编程序的设计要遵守ATPCS。在汇编程序中需要使用EXPORT伪操作来声明,使得本程序可以被其它程序调用。同时,在C程序调用该汇编程序之前需要在C语言程序中使用extern关键词来声明该汇编程序。2)在汇编程序中调用C语言程序为了保证程序调用时参数的正确传递,汇编程序的设计要遵守ATPCS。在C程序中不需要使用任何关键字来声明将被汇编语言调用的C程序,但是在汇编程序调用该C程序之前需要在汇编语言程序中使用IMPORT伪操作来声明该C程序。在汇编程序中通过BL指令来调用子程序。五、实验过程(1)按照2.3节介绍的方法,在ADS下创建一个工程armasmc,编写3个文件,其中一个初始化汇编语言文件Init.s,该文件中主要完成异常矢量表的建立,模式堆栈初始化,并将程序引导至C语言的main函数。C语言程序保存为armasmc.c,C语言中调用汇编语言文件delay.s中的毫秒延时程序delayxms,C语言将延时的毫秒数通过参数传递到汇编语言,汇编语言完成延时,然后返回C语言函数。通过AXD运用单步执行方式调试程序。观察程序执行过程中的寄存器及存储器的变化情况。创建工程如下:通过AXD运用单步执行方式调试程序,观察程序执行过程中的寄存器及存储器的变化情况。(2)实验过程中请记录并思考以下内容:1)如何建立异常矢量入口表?编写以下程序startbReset_HandlerUndefined_Handler bUndefined_HandlerSWI_HandlerbSWI_HandlerPrefetch_handlerbPrefetch_handlerAbort_HandlerbAbort_Handlernop;ReservedvectoIRQ_HandlerbIRQ_HandlerFIQ_HandlerbFIQ_Handler2)如何在汇编语言中切换至C语言的main函数?用BLmain实现从汇编语言切换到C语言。3)如何在C语言中调用汇编语言函数,并完成参数传递?要在C语言中调用汇编函数,首先要用extern等标注函数,传递参数要遵从ATPS的规则。4)汇编语言函数中用到的寄存器如何保护与恢复,为什么要保护参考程序中的R11?要保护R11是因为之后的程序要用到R11=1000。5)将delay.s中的R11改成R4,并将两条R11的保护与恢复语句stmfdsp!,{r12}和ldmfdsp!,{r11}删掉,在C语言程序中的语句i--处设置端点,观察运行过程中变量i的变化情况,并解释其中的原因。更改的效果是,运行到i--时候,i从100变到0。原因是i的值存储在R4里面。实验五ARM硬件接口实验—基本IO实验一、实验目的(1)GPIO的功能配置方法; (2)通过寄存器访问引脚的方法; (3)实现GPIO输入输出功能的基本编程方法。二、实验设备硬件:北京博创UP-TECH三合一实验箱,J-Link仿真器套件,PC机软件:ADS1.2集成开发环境三、实验内容编写S3C2440X处理器的端口控制程序,实现利用按键控制的跑马灯程序。GPC5,GPC6,GPC7三个引脚连接发光二极管,按钮开关连接在GPF5引脚,如下图所示:上电之后,GPC5、GPC6、GPC7按照如下图所示的方向,轮流显示,当按钮开关按下去,方向反向,如下图所示:实验过程中要注意按键去抖动和每个发光二极管显示一定的时间(至少100ms)。四、实验原理1、S3C2440的GPIO功能简介S3C2440有130个多功能输入输出接口(GPIO),它们被分成9组,分别是:—PortA(GPA):25-outputport —PortB(GPB):11-input/outport —PortC(GPC):16-input/outputport—PortD(GPD):16-input/outputport—PortE(GPE):16-input/outputport—PortF(GPF):8-input/outputport—PortG(GPG):16-input/outputport—PortH(GPH):9-input/outputport—PortJ(GPJ):13-input/outputport每个端口的功能可由软件进行配置。这些端口的功能如下表所示:S3C2440APortConfiguration(略)PortA,B,C,D,E,F,G,H,JSelectablePinFunctions(具体见嵌入式开发实验手册)2、GPIO特殊功能寄存器对GPIO进行配置和控制的特殊功能寄存器,主要有3类,分别是:端口控制寄存器GPxCON寄存器,端口数据寄存器GPxDAT寄存器和端口上拉寄存器GPxUP。GPxCON寄存器GPxCON寄存器是为了配置引脚功能的,每一个引脚都可以配置成为输入、输出、外部中断组、特殊功能引脚中的至少三种情况。(2)GPxDAT寄存器GPxDAT是用来读/写引脚状态的:当引脚设置为输出时,向该寄存器的对应位写“1”可输出高电平,写“0”可输出低电平;当引脚设置为输入时,读此寄存器便可得知相应引脚的电平状态;引脚被设置成为特殊功能时,读写此寄存器无效。(3)GPxUP寄存器GPxPUD寄存器是用来设置引脚的内部上/下拉电阻的,寄存器每两位控制一个引脚的上下拉电阻。当引脚对应的两位为“00”时,禁止上/下拉,为“01”时,下拉使能,为“10”时上拉使能。上拉电阻和下拉电阻的作用是:当GPIO引脚处于第三态(高阻态,相当于没接芯片)时,它的电平状态由上拉电阻或下拉电阻确定。3、端口配置(1)GPC5,GPC6和GPC7三个管脚定义为输出口,输出低电平时相应的LED灯点亮。#definerGPCCON(*(volatileunsigned*)(0x56000020))
#definerGPCDAT(*(volatileunsigned*)(0x56000024))
#definerGPCUP(*(volatileunsigned*)(0x56000028))
#defineGPC5_ONrGPCDAT&~(1<<5)
#defineGPC5_OFFrGPCDAT|(1<<5)
#defineGPC6_ONrGPCDAT&~(1<<6)
#defineGPC6_OFFrGPCDAT|(1<<6)
#defineGPC7_ONrGPCDAT&~(1<<7)
#defineGPC7_OFFrGPCDAT|(1<<7)
rGPCCON=rGPCCON&~(0x3f<<10)|(0x15<<10);//GPC5~7端口设置为输出
rGPCUP=rGPCUP|(7<<5);//禁止GPC的5~7端口引脚上拉(2)GPF5定义为输入,用于实现按键识别#definerGPFCON(*(volatileunsigned*)(0x56000050))
#definerGPFDAT(*(volatileunsigned*)(0x56000054))
#definerGPFUP(*(volatileunsigned*)(0x56000058))
rGPFCON=rGPFCON&~(0x3<<10);//将GPF的5端口设置为输入
rGPFUP=rGPCUP&~(1<<5);//GPF的5端口引脚上拉
charKey_Scan()//按键扫描程序
{
if(!(rGPFDAT&(1<<5)))//如果GPF5被按下,读取到低电平
{
delay(20);//延时去抖动,由于ARM11为流水线结构,这里只
//是一个大概的延时值
if(!(rGPFDAT&(1<<5)))//再次判断
return1;//返回“1”
else
return0;
}
else
return0;
}
voiddelay(inttime)//延时函数,用于扫描按键时去软件抖动
{
U8i,j,k;
for(i=0;i<time;i++)
or(j=0;j<255;j++)
}五、实验过程开发调试环境设置 (1)CodeWarrior开发环境设置(2)AXD调试环境设置为了向SDRAM中下载程序,并运行和调试程序,则需要在上电之初在AXD的CommandLineInterface中输入一系列的命令,这些命令可以直接操纵CPU内部的寄存器,进而完成对DRAM和看门狗的一些初始化工作,具体需要设置的内容如下: 将上面的这些内容输入一个text文件2440init.txt,并在AXD中进行设置,使其在打开之后自动运行这些初始化命令。(1)按照前面介绍的方法,在ADS下创建一个工程GPIO,并将前面示例程序加入工程。(注意将实验箱中的JP1402设置为2-3短接,即选择ARMICE模式)。创建工程如下:运行AXD加载生成的image文件,点击按钮,运用程序。观察程序执行的效果。并观察按键按下和松开跑马灯轮换的方向。结果如下:正向:反向:(2)实验过程中请记录并思考以下内容:1)如何访问寄存器并修改其中的1位或多位数据?通过与、或、非等关系来访问寄存器并修改其中的1位或者多位数据的。2)如何配置S3C2440的PIO端口?通过配置相应的寄存器。 3)在C语言中如何实现按键处理程序?在C语言中一定要通过延时按键延时消抖4)如何初始化DRAM,从而实现程序下载并在线调试?为了向SDRAM中下载程序,并运行和调试程序,则需要在上电之初在AXD的CommandLineInterface中输入一系列的命令,这些命令可以直接操纵CPU内部的寄存器,进而完成对DRAM和看门狗的一些初始化工作。(具体命令详见嵌入式开发实验手册)。5)尝试实现利用按键切换控制跑马灯的顺序轮换(不是控制其轮换方向,而是在有按键按下并松开后实现一次跑马灯切换)。可改变轮换方向。实验六ARM硬件接口实验—外部中断实验一、实验目的(1)
通过实验掌握ARM处理器的中断方式和中断处理。 (2)
熟悉S3C2440X的中断控制寄存器的使用; (3)
理解S3C2440X的中断处理机制 (4)
熟练掌握如何进行ARM处理器中断处理的软件编程方法。 (5)
掌握生成离线运行(Release模式)程序的开发环境设置方法。 (6)
掌握通过J-link向Norflash烧些程序的方法。 二、实验设备硬件:北京博创UP-TECH三合一实验箱,J-Link仿真器套件,PC机软件:ADS1.2集成开发环境三、实验内容硬件电路和前面的实验五完全相同。这里将按钮开关所连接的GPF5引脚设定为外部中断EINT5,中断模式位IRQ,在中断服务程序中完成LED灯的切换,即正常状态时LED5灯亮,按下按钮开关时LED6灯亮。四、实验原理1.ARM中断(1)中断源S3C2440具有56个中断源。这些中断源可以是来自片内外设的中断,比如DMA、UART、IIC等;也可以是处理器的外部中断输入引脚。在这些中断源中,部分中断源通过分支中断控制器来申请使用中断,这部分中断源包括(11个):INT_ADCADC转换中断 INT_TC触摸屏中断 INT_ERR2UART2收发错误中断INT_TXD2UART2发送中断INT_RXD2UART2接收中断 INT_ERR1UART1收发错误中断INT_TXD1UART1发送中断 INT_RXD1UART1接收中断 INT_ERR0UART0收发错误中断INT_TXD0UART0发送中断 INT_RXD0UART0接收中断(2)中断控制器实际上最初CPU内核只有FIQ(快速中断请求)和IRQ(通用中断请求)两种中断,其它中断都是各个芯片厂家在设计芯片时,通过加入一个中断控制器来扩展定义的,这些中断根据中断的优先级高低来进行处理,更符合实际应用系统中要求提供多个中断源的要求。例如,如果你定义所有的中断源为IRQ中断(通过中断模式寄存器设置),并且同时有10个中断发出请求,这时可以通过读中断优先级寄存器来确定哪一个中断将被优先执行。中断控制器(InterruptControlerLogic)的任务是在片内外围和外部中断源组成的多重中断发生时,选择其中一个中断通过FIQ或IRQ向CPU内核发出中断请求。当多重中断源请求中断时,硬件优先级逻辑会判断哪一个中断将被执行,同时,硬件逻辑将会执行位于0X18(或0X1C)地址处的指令,再由软件编程识别各个中断源,然后再根据中断源跳转到相应的中断处理程序。中断优先级仲裁电路如下图所示:S3C2440X中的优先级产生模块包含7个单元,1个主单元和6个从单元。两个从优先级产生单元管理4个中断源,四个从优先级产生单元管理6个中断源。主优先级产生单元管理6个从单元。每一个从单元有4个可编程优先级中断源和2个固定优先级中断源。这4个中断源的优先级是由ARB_SEL和ARM_MODE决定的。另外2个固定优先级中断源在6个中断源中的优先级最低。(3)中断控制寄存器中断控制器有5个控制寄存器:源挂起寄存器(SRCPND)、中断模式寄存器(INTMOD)、中断屏蔽寄存器(INTMSK)、中断优先权寄存器(PRIORITY)、中断挂起寄存器(INTPND)。中断源发出的中断请求首先被寄存器在中断源挂起寄存器(SRCPND)中,INTMOD把中断请求分为两组:快速中断请求(FIQ)和中断请求(IRQ),PRIORITY处理中断的优先级。1)中断源挂起寄存器(SRCPND)中断源挂起寄存器SRCPND共有32位,每一位对应着一个中断源,当中断源发出中断请求的时候,就会置位源挂起寄存器的相应位。反之,中断的挂起寄存器的值为0。SRCPND每一位的是否置1只与该位对应的中断源是否提出中断请求有关系,与该中断源是否被屏蔽没有关系。如果在中断服务过程中,为了允许同一源的其他中断源能够进一步引起中断,或者为了防止一次中断多次服务,用户可以清除相应的中断标志位,清除的方法是向相应的位写1(即:写1清0),写0是没有影响的。2)中断模式寄存器(INTMOD)中断模式寄存器INTMOD共有32位,每一位对应着一个中断源,当中断源的模式位设置为1时,对应的中断会由ARM920T内核以FIQ模式来处理。相反的,当模式位设置为0时,中断会以IRQ模式来处理。注意,中断控制寄存器中只有一个中断源可以被设置为FIQ模式,因此只能在紧急情况下使用FIQ。如果INTMOD寄存器把某个中断设为FIQ模式,FIQ中断不影响INTPND和INTOFFSET寄存器,因此,这两个寄存器只对IRQ模式中断有效。3)中断屏蔽寄存器(INTMSK)这个寄存器有32位,分别对应一个中断源。当中断源的屏蔽位设置为1时,CPU不响应该中断源的中断请求,反之,等于0时CPU能响应该中断源的中断请求。4)中断优先级寄存器(PRIORITY)中断优先级寄存器管理32个中断源的优先级仲裁规则以及是否允许优先级轮换。5)中断挂起寄存器(INTPND)中断挂起寄存器INTPND共有32位,每一位对应着一个中断源,当中断请求被响应的时候,相应的位会被设置为1。在某一时刻只有一个位能为1,因此在中断服务子程序中可以通过判断INTPND来判断哪个中断正在被响应,在中断服务子程序中必须在清零SRCPND中相应位后清零相应的中断挂起位,清零方法和SRCPND相同。注意:1.FIQ响应的时候不会影响INTPND相应的标志位2.向INTPND等于“1”的位写入“0”时,INTPND寄存器和INTOFFSET寄存器会有无法预知的结果,因此,千万不要向INTPND的“1”位写入“0”,推荐的清零方法是把INTPND的值重新写入INTPND。6)IRQ偏移寄存器中断偏移寄存器给出INTPND寄存器中哪个是IRQ模式的中断请求。7)子中断源挂起寄存器SUBSRCPND对于多合一的中断源,利用子中断源挂起寄存器SUBSRCPND来进一步标明提出请求的到底是哪个中断源。8)子中断源屏蔽寄存器INTSUBMSK用于控制子中断源是否被屏蔽。9)外部中断控制寄存器(EXTINTn)S3C2410X的24个外部中断有几种中断触发方式,EXTINTn配置外部中断的触发类型是电平触发、边沿触发以及触发的极性。其中EXTINT0寄存器管理外部中断源0-7,EXTINT1寄存器管理外部中断源8-15,EXTINT2寄存器管理外部中断源16-23。10)外部中断屏蔽寄存器EINTMASK11)外部中断挂起寄存器EINTPEND各中断源与上述各中断管理寄存器之间的关系如下图所示:2.中断程序设计要想正确地执行2440的外部中断,一般需要完成两个部分内容:中断初始化和中断处理函数。(1)中断初始化:在执行中断之前,要初始化好要用的中断。中断初始化工作包含几个部分:端口功能设定:2440的外部中断引脚EINT与通用IO引脚F和G复用,要想使用中断功能,就要把相应的引脚配置成中断模式。2)
中断模式选定:为INTMOD寄存器相关位设定合时的数值(0或1),将所使用的中断影射为FIQ或IRQ。 3)
中断优先级设定:为所使用的中断源设定合时的中断优先级。 4)
为外部中断选定合适的触发方式。 5)
关联相应的中断服务程序。 (2)中断使能:中断使能的工作有以下几部分1)清除当前的中断标志位,包括中断源挂起寄存器SRCPND,中断挂起寄存器INTPND,以及外部中断源挂起寄存器EINTPEND。注意要想清除某一中断标志,需要向相对应的位写1(写1清0)。2)打开有关中断屏蔽位,使能相关中断。方法是向中断屏蔽寄存器INTMSK和外部中断屏蔽寄存器EINTMASK相关位写0。(3)中断处理函数负责执行具体的中断指令,除此以外还需要把SRCPND和INTPND中的相应的位清零(通过置1来清零),因为当中断发生时,2440会自动把这两个寄存器中相对应的位置1,以表示某一中断发生,如果不在中断处理函数内把它们清零,系统会一直执行该中断函数。五、实验过程开发调试环境设置CodeWarrior开发环境设置通过J-Link烧写Norflash程序(1)按照2.3节介绍的方法,在ADS下创建一个工程ext_interrupt,并将前面示例程序加入工程。按照上面的介绍进行环境设置,并进行程序写入。创建工程如下:关掉实验箱电源,将其核心板上的拨动开关拨到右边Nor的位置,观察程序运行结果。按下INTKEY按钮,再次观察程序运行效果。结果如下:(2)实验过程中请记录并思考以下内容:
1)打开s2440addr.h头文件,观察并分析其内容。//%%%%%%%%%%%%%%s3c2440.h%%%%%%%%%%%%%%%%/*WOTCHDOGregister*/#defineWTCON(*(volatileunsignedlong*)0x53000000)/*SDRAMregisers*/#defineMEM_CTL_BASE0x48000000#defineSDRAM_BASE0x30000000/*NANDFlashregisters*/#defineNFCONF(*(volatileunsignedint*)0x4e000000)#defineNFADDR(*(volatileunsignedchar*)0x4e000008)#defineNFDATA(*(volatileunsignedchar*)0x4e00000c)#defineNFSTAT(*(volatileunsignedchar*)0x4e000010)/*GPIOregisters*/#defineGPBCON(*(volatileunsignedlong*)0x56000010)#defineGPBDAT#defineGPFCON#defineGPFDAT#defineGPFUP#defineGPGCON#defineGPGDAT#defineGPGUP#defineGPHCON#defineGPHDAT#defineGPHUP/*UARTregisters*/#defineULCON0#defineUCON0#defineUFCON0#defineUMCON0#defineUTRSTAT0#defineUTXH0#defineURXH0#defineUBRDIV0/*interruptregistes*/#defineSRCPND#defineINTMOD(*(volatileunsignedlong*)0x56000014)(*(volatileunsignedlong*)0x56000050)(*(volatileunsignedlong*)0x56000054)(*(volatileunsignedlong*)0x56000058)(*(volatileunsignedlong*)0x56000060)(*(volatileunsignedlong*)0x56000064)(*(volat
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025供暖工程合同范本
- 2025年电工(高级)考试试卷及答案
- 2025股票发行辅导合同
- 肾下垂的临床护理
- 肠系膜脂膜炎的临床护理
- 新质生产力杉杉股份
- 2025技术实施许可合同书
- 2025年天津市房屋租赁合同模板
- 2025地下车库租赁合同范本
- 2025家居智能小家电区域代理商销售合同书
- 人力资源规划案例分析题和答案解析
- 大棚建设钢结构工程监理实施细则安全监理细则范本模板
- 梨山老母玄妙真经
- 2《建筑机械使用安全技术规程》JGJ33-2012
- 病人呼吸心跳骤停抢救流程
- GB/T 4802.2-2008纺织品织物起毛起球性能的测定第2部分:改型马丁代尔法
- GB 14934-2016食品安全国家标准消毒餐(饮)具
- 英语高考3500词带音标
- 泥水平衡顶管施工方案(专家论证)
- 框架结构柱、梁板模板安装技术交底
- 呼吸衰竭临床表现及鉴别诊疗精编ppt
评论
0/150
提交评论