劉光然
(湖北經(jīng)濟學(xué)院 電子工程系,湖北 武漢430205)
學(xué)習(xí)ARM,首先要清楚ARM為何物。
ARM的全稱Advanced RISC Machines。ARM是微處理器行業(yè)的一家知名企業(yè),設(shè)計了大量高性能、廉價、耗能低的RISC處理器、相關(guān)技術(shù)及軟件。技術(shù)具有性能高、成本低和能耗省的特點。適用于多種領(lǐng)域,比如嵌入控制、消費/教育類多媒體、DSP和移動式應(yīng)用等。ARM公司是專門從事基于RISC技術(shù)芯片設(shè)計開發(fā)的公司,作為知識產(chǎn)權(quán)供應(yīng)商,本身不直接從事芯片生產(chǎn),靠轉(zhuǎn)讓設(shè)計許可由合作公司生產(chǎn)各具特色的芯片,世界各大半導(dǎo)體生產(chǎn)商從ARM公司購買其設(shè)計的ARM微處理器核,根據(jù)各自不同的應(yīng)用領(lǐng)域,加入適當?shù)耐鈬娐?,從而形成自己的ARM微處理器芯片進入市場。目前,全世界有幾十家大的半導(dǎo)體公司都使用ARM公司的授權(quán),因此既使得 ARM技術(shù)獲得更多的第三方工具、制造、軟件的支持,又使整個系統(tǒng)成本降低,使產(chǎn)品更容易進入市場被消費者所接受,更具有競爭力。
說這么多,只用記住ARM是一個公司名字,也是一種處理器的通稱(運用ARM公司技術(shù),生產(chǎn)的處理器,統(tǒng)稱為ARM處理器)。
其次弄清楚ARM與單片機的聯(lián)系與區(qū)別。
單片機是屬于微控制器,ARM是微處理器,單片機更多的是強調(diào)在控制領(lǐng)域的使用,可以使用匯編語言或者c語言編程。而ARM在某種意義上來說它是一種高級的單片機,其各項功能更加強大,編程使用arm匯編語言或者arm匯編語言與c語言混合編程,也就是必須使用匯編語言,增加了開發(fā)難度。
(1)看電路原理圖,確定硬件電路模塊的連接方式;
(2)查看電路中各個芯片的芯片手冊,了解芯片的工作原理;
(3)編寫代碼。
為了讓初學(xué)者能夠順利入門,本文選取了一個簡單的硬件電路,采用ARM芯片點亮三盞LED燈,如圖1所示,3個發(fā)光二極管分別通過3個限流電阻連接到了arm9芯片上的3個管腳,分別是GPF4,GPF5,GPF6。
發(fā)光二極管的工作原理(只看GPF4這一路):電源VCC(3.3V)到發(fā)光二極管D1,再通過限流電阻,接到arm芯片“GPF4”這個管腳上。只要“GPF4”輸出低電平,D1兩端才會有電流流過,這樣 D1 才會亮。即“GPF4=0”時,D1 亮;“GPF4=1”時,由于LED1兩端電壓一樣,沒有壓差,所以沒電流,則不會亮。
圖1 :ARM與發(fā)光二極管硬件原理圖
上小節(jié)討論的電路的工作原理,那么如何來控制GPF4管腳的電平呢?這就需要查閱電路中芯片的說明書——芯片手冊,打開芯片手冊s3c2440芯片手冊,搜索GPF4。通過定位找到第九章I/O port,發(fā)現(xiàn)需要配置“配置寄存器”(GPFCON)和“數(shù)據(jù)寄存器”(GPFDAT)這兩個寄存器來達到控制引腳的目的。
配置寄存器GPFCON:ARM芯片的同一個管腳可以實現(xiàn)不同的功能,即你給它配置的參數(shù)不一樣,它所對應(yīng)的功能也就不一樣,可以是“輸出”也可以是“輸入”,再或者是其他功能(中斷等)。而芯片手冊告訴我們GPFCON的具體用法如圖2所示:
圖2 :GPFCON功能表
如果我們想要GPF4具有輸出功能,以便接下來給管腳輸出高低電平的話,我們就要配置“GPFCON[9:8]”這兩位,使其等于“01”,這樣GPF4功能就是“Output”,也就是輸出功能。
數(shù)據(jù)寄存器GPFDAT:此寄存器的功能就是讓我們設(shè)置GPF各個管腳的電平,通過查芯片手冊如圖3所示:
圖3 :GPFDATE寄存器
芯片手冊上說,當引腳被設(shè)置成“輸出引腳”時,“GPFDAT”中的比特0就對應(yīng)于“GPF0”,比特1就對應(yīng)GPF1,比特2就對應(yīng)GPF2…比特7對應(yīng)GPF7。
假如想GPF4上接的二極管亮的話,我們就要配置比特4,對比特4置數(shù)0。
通過上面的敘述,我們已經(jīng)明確了在ARM上點亮LED燈的具體操作方法,那我們?nèi)绾斡贸绦驅(qū)崿F(xiàn)上面的操作呢。由于程序是arm匯編語言和c語言混合編程,因此在下一節(jié)詳細介紹程序代碼。
程序包括crt0.S,leds.c,makefile三個文件。
由于makefile關(guān)于編譯生成二進制文件。對于理解arm裸板編程原理暫時忽略。
首先分析crt0.S.
1-3行是匯編語言的語法格式,表示匯編的開始。
第4行把地址0x53000000裝入r0寄存器中,第5行把數(shù)值0裝入寄存器r1中,第6行,把數(shù)值0裝入到地址0x53000000。地址0x53000000是arm處理器中的看門狗寄存器地址,通過給這個寄存器賦值0,關(guān)閉看門狗功能。
第7行設(shè)置堆棧地址的值為4k,堆棧是向下生長的。
第8行匯編程序跳至c語言中的main函數(shù)。
第9-10行表示匯編中的死循環(huán)。
這個匯編程序的作用就是關(guān)看門狗,設(shè)置堆棧,然后跳到c中的main函數(shù)。
再來分析leds.c:
程序解釋如下:
1-2行是宏定義將GPFCON定義為物理地址0x56000050里面的內(nèi)容。將GPFDAT定義為物理地址0x56000054里面的內(nèi)容。
3-5行宏定義GPF4_out,GPF5_out,GPF6_out為GPFCON中分別對應(yīng)GPF4,GPF5,GPF6引腳所對應(yīng)的比特位。
6-9行為一個延時程序。
10-22行為主函數(shù)。
第12行定義一個無符號的長整型變量i,為下面輸入GPFDAT中的數(shù)據(jù)服務(wù)。
第13行用GPFCON這個寄存器配置引腳功能,使得GPF4,GPF5,GPF6引腳的功能為輸出。
14-18行是一個while循環(huán)。
第16行,通過設(shè)置GPFDAT,使 GPF4,GPF5,GPF6引腳輸出高電平1,發(fā)光二極管燈滅。
第17行,通過設(shè)置GPFDAT,使 GPF4,GPF5,GPF6引腳輸出高電平0,發(fā)光二極管燈亮。
目前的教材和出版文獻對于講授arm裸板編程入門并沒有一個很好的解決辦法,本文通過一個簡單實例發(fā)光二極管的裸板程序?qū)崿F(xiàn),實現(xiàn)了零基礎(chǔ)的arm裸板編程,降低了學(xué)習(xí)門檻,便于初學(xué)者入門。
附錄A
Makefile程序代碼:
[1]韋東山.嵌入式Linux應(yīng)用開發(fā)完全手冊[M].北京:人民郵電出版社,2008,(8).
[2]杜春雷.ARM體系結(jié)構(gòu)與編程[M].北京:清華大學(xué)出版社,2003.
[3]詹榮開.嵌入式系統(tǒng)BootLoader技術(shù)內(nèi)幕[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].北京:電子工業(yè)出版社,2010,(2).