劉光然
(湖北經濟學院 電子工程系,湖北 武漢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).