资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,版权声明:本课件及其印刷物、视频的版权归成都国嵌信息技术有限公司所有,并保留所有权力:任何单,位或个人未经成都国嵌信息技术有限公司书面授权,不得使用该课件及其印刷物、视频从事商业、教学活,动。已经取得书面授权的,应在授权范围内使用,并注明,“,来源:国嵌,”,。违反上述声明者,我们将追究其,法律责任。,ARM,编程实例,Contents,ADS,集成开发环境,S3c2440 GPIO,LED,程序设计,必修实验,ADS,集成开发环境,学习目的:,学习开发板的连接,开发板工具的使用,如,ADS1.2,集成开发环境的使用,把裸机程序运行起来,宿主机,目标机,交叉开发模型,交叉开发模型,在嵌入式开发过程中有宿主机和目标机的角色之分:宿主机是执行编译、链接嵌入式软件的计算机;目标机是运行嵌入式软件的硬件平台。,ARM,裸机程序开发硬件连接模型,如何运行逻辑程序?,仿真器,JTAG,口,硬件连接,(,1,),JTAG,小板连,Mini2440,板的,10,针,JTAG,下载口;,(,2,),JTAG,小板的并口连宿主机并口,若主机无并口,则需要转换口;,(,3,),Mini440,板接电源,开机,一、,ADS,集成开发环境使用,1.H-JTAG,2.ADS,如何设置宿主机软件,H-JTAG,JTAG,是一种国际标准测试协议,最初是用来对芯片进行测试的,基本原理是在器件内部定义一个,TAP,(,Test Access Port,测试访问口),通过专用的,JTAG,测试工具对内部节点进行测试。现在,,JTAG,接口还常用于实现,ISP,(,In-system Programmable:,在线编程),对,FLASH,等器件进行编程。,H-JTAG,H-JTAG,是一款简单易用的的调试代理软件,包括三个工具软件:,H-JTAG Server,:实现调试代理的功能,H-Flasher,:实现,FLASH,烧写的功能,H-JTAG emulator,:仿真器,实例演示,安装、配置,H-JTAG,(,1,)安装,H-JTAG,(,2,)配置:,Setting,LPT,JTAG Setting,:,(,3,)设置初始化脚本:,把 光 盘“,Windows,平台工具,H-JTAG,”,目录中的,FriendlyARM2440.his,和,H-Flasher_mini2440.hfc,文件复制到,H-JTAG,的安装目录:,c:program filesH-JTAG,Init,Init Script,Load,打开“,FriendlyARM2440.his”,装载脚本,OK,(注意不要选中“,Enable Auto Init”,),;,再次检测硬件:,Control Detect Target,,显示成功检测到,ARM920T,ADS,ARM ADS,的全称为,ARM Developer Suite,,它是,ARM,公司推出的新一代,ARM,集成开发环境,我们使用的,ADS,为,1.2,版本。,ADS,由命令行开发工具、,GUI,(,Graphics User Interface,,图形用户界面)开发环境(,Code Warrior,和,AXD,)、支持软件组成。,Code Warrior,Code Warrior IDE,提供了一个简单通用的图形化用户界面用于管理项目。可以以,ARM,处理器为对象,利用,Code warrior IDE,开发,C,、,C+,和,ARM,汇编代码。,可编辑编译源文件,实例演示,Code Warrior,创建工程、编译工程,打开一个简单的汇编程序:,ads.s,,基于该汇编程序创建和编译工程,并调试程序,File,New,ARM Executable Image:,将,ads.s,文件拷贝到工程目录中,但并不代表已进入工程中,还需要添加:,Project,Add,Files,,将,ads.s,添加到工程中。,配置:,Edit,DebugRel,Settings,(参考,Mini2440,手册),编译:,Project Make,,在,hello_DataDebugRel,目录中生成了,hello.bin,可执行文件,AXD,AXD,是,ADS,软件中独立于,Codewarrior,IDE,的图形软件,,AXD,用于对程序进行调试,相当于,GDB,。,实例演示,AXD,调试汇编程序:,(,1,)启动,AXD,:,(,2,)配置:,Options,Configure,Target,:,添加:,Add,打开,C:Program FilesH-JTAG,目录,找到,H-,JTAG.dll,动态链接库:,如何使用,CodeWarrior,和,AXD,调试程序?,Project,Debug,:此时,CodeWarrior,自动将,AXD,启动起来,前提是前面配置好,此时,PC,指针指到汇编入口处:,Start,下面开始调试:单步工作,点击 ,程序开始单步运行,查看寄存器:,点击 ,查看寄存器值,,Register Value,,有,Current,、,User/System,、,FIQ,、,IRQ,、,SVC,、,Abort,、,Undef,、,CP15,等多种模式。查看当前模式:,随着程序运行,各个寄存器的值在改变,每运行一行代码,,PC,指针加,4,二、,S3C2440 GPIO,通过实例讲解如何通过裸机编程去控制硬件。,(一),GPIO,GPIO,,通用输入输出(,General Purpose I/O,)的简称,其引脚可以供编程使用。,嵌入式系统中,有数量众多但结构简单的外部设备,对这些设备的控制,有时只需要一位控制信号就够了,即只要开,/,关两种状态就够了。比如:灯亮与灭。,对于这些设备的控制,使用传统的串行口或并行口都不合适。因此在微控制芯片上一般都会提供一个,“,通用可编程,I/O,接口,”,,即,GPIO,。,S3C2440 GPIO,S3C2440,有,130,个,GPIO,口,分为,AJ,共,9,组:,GPA,、,GPB,、,GPC,、,、,GPJ,。,通过设置相应寄存器,可以选择某个,GPIO,口是用于输入、输出还是其他特殊功能。,例如:可以设置,GPH6,作为一般的输入、输出端口,或者用于串口。,设置,GPIO,每组,GPIO,(,GPAGPJ,),都可以通过,3,个寄存器来控制与访问,分别为:,GPxCON,:,GPIO,配置寄存器,GPxDAT,:,GPIO,数据寄存器,GPxUP,:上拉电阻使能寄存器,(其中,x,表示,A,、,B,、,C,、,D,、,E,、,F,、,G,、,H,、,I,、,J,),GPxCON,寄存器,属于配置(,Configure,)寄存器,用于选择,GPIO,口的功能。,其中,PORTA,与,PORTBPORTJ,在功能选择方面有所不同。,GPACON,中每一位对应一个,I/O,口(共,23,个)。当某位为,0,时,相应的,I/O,口为输出;为,1,时,相应的,I/O,引脚为地址线或用于地址控制。(,S3C2440,芯片手册,,”I/O PORTS”,),I/O PORTS,首先看,GPBCON,寄存器,,GPBCON,中每两位控制一条引脚:,00,输入;,01,输出;,10,特殊功能;,11,保留。,GPCCONGPJCON,类似。,GPxDAT,寄存器,GPxDAT,寄存器用于读,/,写引脚:,当引脚被设置为输入时,通过读该寄存器可知相应引脚电平状态是高还是低;,当引脚被设置为输出时,写该寄存器相应的位可令此引脚输出高电平或低电平。,以,GPB,为例,GPxUP,寄存器,GPxUP,:某位为,1,时,相应引脚无内部上拉电阻;为,0,时相应的引脚使用内部上拉电阻。,上拉电阻:由于管脚悬空时容易受到外界的电磁干扰,因此通过一个电阻来将此管脚与高电平相连,让其固定在高电平,这样的电阻称之为上拉电阻。,每位对应一个引脚,,0,相应引脚使用上拉;,1,无上拉,LED,程序设计,LED,是开发中最常用的状态指示设备,,Mini2440,开发板,具有,4,个用户可编程,LED,,它们直接与,CPU,的,GPIO,相连接,,低电平有效,(,点亮,),,详细的资源占用如下表:,Mini2440,硬件布局,LED,原理图,(,1,)先将相应的引脚设置为输出模式,通过设置控制寄存器来实现,(,2,)再向相应的引脚输出低电平即可点亮,LED,灯,通过向数据寄存器写入相应的值来实现,LED,设计思想,实例分析与演示,LED,全亮全灭控制程序,整个工程由四个文件组成,2440init.s,、,Main.c,、,2440lib.c,、,2440slib.s,2440init.s,是开发板上电后首先要运行的汇编程序,功能是配置相应的寄存器,包括对,CPU,内部的多个寄存器的配置,以实现对内存、中断、堆栈的配置,为,C,语言的运行建立环境。,C,语言运行是需要条件的,如首先要用到堆栈,如果不把堆栈设置好,,C,语言将无法运行。,Main.c,(1),Led_port_init,();,对,GPBCON,进行设置,,rGPBCON,11111111111111 00000000 1111111111,与,rGPBCON,进行“与”运算后赋值给,rGPBCON,寄存器,相当于将,D17D10,清零。,(2),控制亮灭:通过设置,GPBDAT,寄存器,点亮:使,GPB5GPB8,输出低电平,rGPBDAT,=rGPBDAT,=X X X X 0 0 0 0 X X X X X,熄灭:使,GPB5GPB8,输出高电平,rGPBDAT,=rGPBDAT|(LED1_OFF)|(LED2_OFF)|(LED3_OFF)|(LED4_OFF);,=X X X X 1 1 1 1 X X X X X,编译下载运行程序,新建一个工程文件,添加所有的源文件和头文件,设置编译链接选项:,DebugRel,Settings,编译、链接、下载到开发板,运行,实验一,实现跑马灯程序,以二进制方式依次显示,0-15,实验二,Contents,S3c2440 GPIO,LED,程序设计,ARM,中断与异常,按键程序设计,串口程序设计,CPU,运行过程中,如何知道各类外设发生,了某些不预期的事件,比如串口收到数,据、按键按下等?,ARM,中断机制,1.,查询方式,程序不断地查询各设备的状态,并做出相,应的反应。他实现比较简单,常用在比较,单一的系统中,比如一个温控系统中可以,实用查询方式不断检测温度的变化。缺点,是占用,CPU,资源过高,不适应多任务的系,统。,ARM,中断机制,2.,中断方式,当事件发生时,硬件会设置某个寄存器;,CPU,再每执行完一个指令时,通过硬件查看,这个寄存器,如果所关注的事件发生了,则中,断当前程序流程,跳转到一个固定的地址处理,这个事件,最后返回被中断的程序。它的实现,相对复杂,但是效率较高,是常用的方法。,ARM,中断机制,ARM,七种工作模式,1,、用户模式(,Usr,),用于正常执行程序,2,、快速中断模式,(FIQ),用于高速数据传输,3,、外部中断模式,(IRQ),用于通常的中断处理,ARM,七种工作模式,4.,管理模式(,svc,),操作系统使用的保护模式,5.,数据访问终止模式,(abt),当数据或指令预取终止时进入该模式,可用于虚拟存储及,存储保护。,6.,系统模式(,sys,),运行具有特权的操作系统任务。,7.,未定义指令中止模式(,und,),当未定义的指令执行时进入该模式,可用于支持硬件,每种工作模式下,使用不同的寄存器(图),不同的权限,触发条件,例,1,:同是,MOV R8,#1,指令,在不同的工作模式下对应不同的寄存器,好处是模式切换时,先前模式的寄存器内容就不用保存了。,例,2,:系统模式切换到快速中断模式时,首先要保护现场,即上一个模式的寄存器,由于快速中断模式中,R8R14,有自己的寄存器,故只需保存,R0R7,即可,体现了“快速”。,不同的权限,管理模式下可以访问所有的东西,体现为不同的权限,需要配合,MMU,来使用。,触发条件,上电后,,2440CPU,处于管理模式,svc,发生中断就进入,IRQ,模式,还可能出现其他情况,如数据访问终止、未定义指令终止等,中断,中断,举例:一个人在家里,怎样知道有客人来?,查询:每过,5,分钟开门查看,中断:客人来了按门铃,程序想知道按键是否被按下?,查询,中断,中断属于一种异常,发生了一场之后,会有哪些事情发生?,CPU,会强制进入异常模式,切换寄存器,PC,自动跳到异常入口,异常入口:固定的地址,分析,2440init.s,文件,b,ResetHandler,b,HandlerUndef,;handler for Undefined mode,b,HandlerSWI,;handler for SWI interrupt,b,HandlerPabort,;handler for,PAbort,b,HandlerDabort,;handler for,DAbort,b.;reserved,b,HandlerIRQ,;handler for IRQ interrupt,b,HandlerFIQ,;handler for FIQ interrupt,S3C2440,中断体系结构,中断处理过程,中断发生:保存“别人”的(被中断的)状态,中断处理,恢复“别人”的状态,中断处理流程:,(,1,)中断控制器汇集各类外设发出的,中断信号,然后告诉,CPU,。,(,2,),CPU,保存当前程序的运行环,境,然后调用中断服务程序(,ISR,)来,处理中断。,ARM,中断机制,ARM,中断机制,(,3,)在,ISR,中通过读取中断控制寄存器、外设,的相关寄存器来识别是哪个中断,并进行相应,的处理。,(,4,)清除中断:通过读写相关中断控制寄存器,和外设相关寄存器来实现。,(,5,)最后恢复被中断程序的环境,继续执行。,中断控制寄存器,1.SUBSRCPND,寄存器(,SUB SOURCE PENDING,),2.INTSUBMSK,寄存器(,INTERRUPT SUBMSK,),3.SRCPND,寄存器(,SOURCE PENDING,),4.INTMSK,寄存器(,INTERRUPT MASK,),5.INTMOD,寄存器(,INTRRUPT MODE,),6.PRIORITY,寄存器,7.INTPND,寄存器(,INTERRUPT PENDING,),8.INTOFFSET,寄存器(,INTERRUPT OFFSET,),SUBSRCPND,寄存器,(,SUB SOURCE PENDING,),SUBSRCPND,寄存器用来标识,INT_RXD0,,,INT_TXD0,等子中断是否发生。,S3C2440,有这样的,15,个子中断。每一位对应一个子中断。当这些子中断发生,并且子中断未被屏蔽,则它们当中的若干位则汇集在,SRCPND,上。,例如:,SUBSRCPND,寄存器中的,3,个中断,INT_RXD0,、,INT_TXD0,、,INT_ERR0,,只要有一个发生了,且没有被屏蔽,,则,SRCPND,的,INT_UART0,位被置,1.,清中断时只要往,SUBSRCPND,寄存器中某位写入,1,即可。,INTSUBMSK,寄存器用来屏蔽,SUBSRCPND,寄存器所标示的中断。,INTSUBMSK,寄存器中某位被设为,1,时,对,应的中断被屏蔽。设为,0,时,表示中断允,许。,INTSUBMSK,寄存器,(,INTERRUPT SUBMSK,),SRCPND,中每一位用来表示一个(或一类)中断,是否已经发生。,SRCPND,寄存器操作与,SUBSRCPND,寄存器相似,若想清除某一位,,往此位写入,1,。,SRCPND,各个位对应哪个中断,,参考,S3C2440,的数据手册,SRCPND,寄存器,(,SOURCE PENDING,),INTMSK,寄存器用来屏蔽,SRCPND,所标示的,中断。,INTMSK,某位被设置为,1,时,对应的中,断被屏蔽,设置为,0,时,中断允许。,INTMSK,只能屏蔽设为,IRQ,的中断,不能屏蔽设为,FIQ,的中断。,INTMSK,寄存器,(,INTERRUPT MASK,),INTMOD,寄存器,(,INTRRUPT MODE,),当,INTMOD,寄存器中某位被设置为,1,时,它对应的中断被,设为,FIQ,,即此中断发生时,,CPU,将进入快速中断模式,,这通常用来处理特别紧急的中断。当某位被置为,0,时,表,示为,IRQ,中断。,注意:同一时间里,,INTMOD,上只能有一位被设置为,1.,INTPND,寄存器,(,INTERRUPT PENDING,),经过中断优先级仲裁器选出优先级高的中断,后,这个中断在,INTPND,寄存器中的相应位,被置,1,,随后,,CPU,将进入中断处理模式处,理它。同一时间内,此寄存器只有一位被置,1,;在,ISR,中可以根据这个位确定是那个中,断。清除该中断时,往这个位写入,1,。,这个寄存器用来表示,INTPND,寄存器中哪位被,置,1,了,即,INTPND,寄存器中位,x,为,1,时,,INTOFFSET,寄存器的值为,x(x,为,031),。在清,除,SRCPND,、,INTPND,寄存器时,,INTOFFSET,寄存器被自动清除。,INTOFFSET,寄存器,b,ResetHandler,b,HandlerUndef,;handler for Undefined mode,b,HandlerSWI,;handler for SWI interrupt,b,HandlerPabort,;handler for,PAbort,b,HandlerDabort,;handler for,DAbort,b.;reserved,b,HandlerIRQ,;handler for IRQ interrupt,b,HandlerFIQ,;handler for FIQ interrupt,b,EnterPWDN,;Must be 0 x20.,Contents,S3c2440 GPIO,LED,程序设计,ARM,中断与异常,按键程序设计,串口程序设计,按键原理图,用户按键,使用中断方式设计一个按键程序,按,一次点亮一个,LED,实验一,使用查询方式设计一个按键程序,,按一次点亮一个,LED,实验二,Contents,S3c2440 GPIO,LED,程序设计,ARM,中断与异常,按键程序设计,串口程序设计,嵌入式,Linux,技术咨询,QQ,号,:550491596,嵌入式,Linux,学习交流,QQ,群,:65212116,通用异步收发器简称,UART,,即,“,Universal,Asynchronous Receiver Transmitter”,,它用来传,输串行数据:发送数据时,CPU,将并行数据写入,UART,,,UART,按照一定的格式在一根电线上串行发,出;接收数据时,,UART,检测另一根电线上的信号,,将串行数据放在缓冲区中,,CPU,可读取,UART,获得的,这些数据。,UART,基本原理,UART,基本原理,mini2440,的,UART,:,在使用,UART,之前要设置波特率、传输格式(有多少,个数据位、是否使用校验位、是奇校验还是偶校,验、有多少个停止位、是否使用流量控制);对于,S3C2440,,还要选择所涉及管脚为,UART,功能、选,择,UART,通道的工作模式为中断模式或者,DMA,模,式。设置好之后往某个寄存器写入数据即可发送,,读某个寄存器即可得到接收的数据,可以通过查询,状态寄存器或者设置中断模式来获知数据是否发送,或接收完毕。,UART,初始化,UART,寄存器,(,1,),UBRDIVn,寄存器,(,2,),ULCONn,寄存器,(,3,),UCONn,寄存器,(,4,),UFCON,寄存器,(,5,),UMCONn,寄存器,(,6,),UTRSTATn,寄存器,(,7,),UERSTATn,寄存器,(,8,),UTXHn,寄存器,(,9,),URXHn,寄存器,在,UART,模块中有三个,UART,波特率除数寄存器,UBRDIV0,,,UBRDIV1,和,UBRDIV2,。存储在波特率除,数寄存器,UBRDIVn,中的值用于决定波特率,如下:,UBRDIVn,=(,int,)(UART clock/(,buad,rate x 16)1,例如如果波特率为,115200bps,且,UART,时钟为,40MHz,,,UBRDIVn,=(,int,)(40000000/(115200 x 16)-1,UBRDIVn,寄存器,ULCON,寄存器,该寄存器用于选择,UART,时钟源、设置,UART,中断方式等。详见,S3C2440,的手册。,UCONn,寄存器,该寄存器用于设置是否使用,FIFO,,设置各,个,FIFO,的触发深度,本次试验中都未使用,该寄存器。如果不使用该寄存器,则触发深,度默认为,1,。,UFCONn,寄存器,UTRSTATn,寄存器,UTXHn,寄存器:,CPU,将数据写入这个寄存器,,UART,会,将它保存到缓冲区中,并自动发出去。,URXHn,寄存器:,当,UART,收到数据时,,CPU,读取这个寄,存器,即可获得数据。,嵌入式,Linux,技术咨询,QQ,号,:550491596,嵌入式,Linux,学习交流,QQ,群,:65212116,UART,收发缓冲寄存器,编写串口收发程序:首先向串口发,送十次,“,hello world”,,然后等待键,盘输入字符,R,,然后蜂鸣器连续响,5,次。,嵌入式,Linux,技术咨询,QQ,号,:550491596,嵌入式,Linux,学习交流,QQ,群,:65212116,实验一,改写实验一,实现串口的中断方式,接收数据,然后将接收的数据显示,在超级终端上。,实验二,习题,7,堆栈的工作原理是什么?堆栈有那几种类型?当使用,STMIA,、,LDMIA,指令操作堆栈时,堆栈属于什么类型?,8,请说出,MOV,指令与,LDR,指令的区别及用途。,9,调用子程序是用,B,指令还是,BL,指令?写出返回子程序的指令。,10,如何用其它指令实现,SWP R0,R1,R2,指令的功能?,11,什么是嵌入式系统中的交叉开发?交叉开发模型包括哪几部分?,12 ADS1.2,集成开发环境包含了那两个工具?它们的作用是什么?,习题,13 H-JTAG,工具软件起什么作用?,14 S3C2440,芯片共有多少个,GPIO,引脚,分为几组?每组可通过哪几个寄存器来控制和访问?,
展开阅读全文