刘光然
(湖北经济学院 电子工程系,湖北 武汉430205)
学习ARM,首先要清楚ARM为何物。
ARM的全称Advanced RISC Machines。ARM是微处理器行业的一家知名企业,设计了大量高性能、廉价、耗能低的RISC处理器、相关技术及软件。技术具有性能高、成本低和能耗省的特点。适用于多种领域,比如嵌入控制、消费/教育类多媒体、DSP和移动式应用等。ARM公司是专门从事基于RISC技术芯片设计开发的公司,作为知识产权供应商,本身不直接从事芯片生产,靠转让设计许可由合作公司生产各具特色的芯片,世界各大半导体生产商从ARM公司购买其设计的ARM微处理器核,根据各自不同的应用领域,加入适当的外围电路,从而形成自己的ARM微处理器芯片进入市场。目前,全世界有几十家大的半导体公司都使用ARM公司的授权,因此既使得 ARM技术获得更多的第三方工具、制造、软件的支持,又使整个系统成本降低,使产品更容易进入市场被消费者所接受,更具有竞争力。
说这么多,只用记住ARM是一个公司名字,也是一种处理器的通称(运用ARM公司技术,生产的处理器,统称为ARM处理器)。
其次弄清楚ARM与单片机的联系与区别。
单片机是属于微控制器,ARM是微处理器,单片机更多的是强调在控制领域的使用,可以使用汇编语言或者c语言编程。而ARM在某种意义上来说它是一种高级的单片机,其各项功能更加强大,编程使用arm汇编语言或者arm汇编语言与c语言混合编程,也就是必须使用汇编语言,增加了开发难度。
(1)看电路原理图,确定硬件电路模块的连接方式;
(2)查看电路中各个芯片的芯片手册,了解芯片的工作原理;
(3)编写代码。
为了让初学者能够顺利入门,本文选取了一个简单的硬件电路,采用ARM芯片点亮三盏LED灯,如图1所示,3个发光二极管分别通过3个限流电阻连接到了arm9芯片上的3个管脚,分别是GPF4,GPF5,GPF6。
发光二极管的工作原理(只看GPF4这一路):电源VCC(3.3V)到发光二极管D1,再通过限流电阻,接到arm芯片“GPF4”这个管脚上。只要“GPF4”输出低电平,D1两端才会有电流流过,这样 D1 才会亮。即“GPF4=0”时,D1 亮;“GPF4=1”时,由于LED1两端电压一样,没有压差,所以没电流,则不会亮。
图1 :ARM与发光二极管硬件原理图
上小节讨论的电路的工作原理,那么如何来控制GPF4管脚的电平呢?这就需要查阅电路中芯片的说明书——芯片手册,打开芯片手册s3c2440芯片手册,搜索GPF4。通过定位找到第九章I/O port,发现需要配置“配置寄存器”(GPFCON)和“数据寄存器”(GPFDAT)这两个寄存器来达到控制引脚的目的。
配置寄存器GPFCON:ARM芯片的同一个管脚可以实现不同的功能,即你给它配置的参数不一样,它所对应的功能也就不一样,可以是“输出”也可以是“输入”,再或者是其他功能(中断等)。而芯片手册告诉我们GPFCON的具体用法如图2所示:
图2 :GPFCON功能表
如果我们想要GPF4具有输出功能,以便接下来给管脚输出高低电平的话,我们就要配置“GPFCON[9:8]”这两位,使其等于“01”,这样GPF4功能就是“Output”,也就是输出功能。
数据寄存器GPFDAT:此寄存器的功能就是让我们设置GPF各个管脚的电平,通过查芯片手册如图3所示:
图3 :GPFDATE寄存器
芯片手册上说,当引脚被设置成“输出引脚”时,“GPFDAT”中的比特0就对应于“GPF0”,比特1就对应GPF1,比特2就对应GPF2…比特7对应GPF7。
假如想GPF4上接的二极管亮的话,我们就要配置比特4,对比特4置数0。
通过上面的叙述,我们已经明确了在ARM上点亮LED灯的具体操作方法,那我们如何用程序实现上面的操作呢。由于程序是arm汇编语言和c语言混合编程,因此在下一节详细介绍程序代码。
程序包括crt0.S,leds.c,makefile三个文件。
由于makefile关于编译生成二进制文件。对于理解arm裸板编程原理暂时忽略。
首先分析crt0.S.
1-3行是汇编语言的语法格式,表示汇编的开始。
第4行把地址0x53000000装入r0寄存器中,第5行把数值0装入寄存器r1中,第6行,把数值0装入到地址0x53000000。地址0x53000000是arm处理器中的看门狗寄存器地址,通过给这个寄存器赋值0,关闭看门狗功能。
第7行设置堆栈地址的值为4k,堆栈是向下生长的。
第8行汇编程序跳至c语言中的main函数。
第9-10行表示汇编中的死循环。
这个汇编程序的作用就是关看门狗,设置堆栈,然后跳到c中的main函数。
再来分析leds.c:
程序解释如下:
1-2行是宏定义将GPFCON定义为物理地址0x56000050里面的内容。将GPFDAT定义为物理地址0x56000054里面的内容。
3-5行宏定义GPF4_out,GPF5_out,GPF6_out为GPFCON中分别对应GPF4,GPF5,GPF6引脚所对应的比特位。
6-9行为一个延时程序。
10-22行为主函数。
第12行定义一个无符号的长整型变量i,为下面输入GPFDAT中的数据服务。
第13行用GPFCON这个寄存器配置引脚功能,使得GPF4,GPF5,GPF6引脚的功能为输出。
14-18行是一个while循环。
第16行,通过设置GPFDAT,使 GPF4,GPF5,GPF6引脚输出高电平1,发光二极管灯灭。
第17行,通过设置GPFDAT,使 GPF4,GPF5,GPF6引脚输出高电平0,发光二极管灯亮。
目前的教材和出版文献对于讲授arm裸板编程入门并没有一个很好的解决办法,本文通过一个简单实例发光二极管的裸板程序实现,实现了零基础的arm裸板编程,降低了学习门槛,便于初学者入门。
附录A
Makefile程序代码:
[1]韦东山.嵌入式Linux应用开发完全手册[M].北京:人民邮电出版社,2008,(8).
[2]杜春雷.ARM体系结构与编程[M].北京:清华大学出版社,2003.
[3]詹荣开.嵌入式系统BootLoader技术内幕[OL].http://www.ibm.com/developerworks/cn/linux/l-btloader/.
[4]徐海兵.GNU make中文手册[Z].
[5]Samsung electronics.S3C2440A USER’S MANUAL[Z].
[6]GNU Make.Richard M.Stallman,Roland McGrath,Paul D.Smith.
[7]Arthur Griffith.GCC:The Complete Reference.McGraw-Hill/Osborne.
[8]葛中海,尤新芳.Protel Dxp2004简明教程与考证指南[M].北京:电子工业出版社,2010,(2).