1. 程式人生 > >Mini2440上的第一個程序——點亮Led

Mini2440上的第一個程序——點亮Led

動力 源文件 意思 mov ram 共享文件夾 sha linux下 相差

手頭的Mini2440擱置了兩年半之後,我再次決定拿出它,重新嘗試嵌入式Linux的學習。

我使用的是友善之臂的Mini2440開發板、韋東山的《嵌入式Linux應用開發完成手冊》及其視頻教程。所以,本篇文章中所涉及到的各種軟件均可在以下兩處找到:

  1. Mini2440開發板的配套光盤
  2. 韋東山JZ2440開發板的光盤

JZ2440是韋東山出品的開發板,作為《嵌入式Linux應用開發完全手冊》的配套硬件,它和Mini2440相差無幾,所以我這裏用的是Mini2440。

一、目標

動手之前先確定好一個小目標——這一次,我們的目標是在Mini2440上點亮LED,怎麽樣,聽起來很簡單吧。
但是做起來,可並不是很簡單喏,主要是因為會涉及到比較多的軟件,下一節會對各軟件做個大致的介紹,你只要知道各個軟件是用來做什麽的就可以了,先不必細究。

二、開發環境

硬件平臺:Mini2440 (64M Nand flash)

軟件編譯平臺:Ubuntu 9.10
以下是你接下來會依次接觸到的軟件或是工具:

  • vi或是vim: Linux下的文本編輯器,你可以把它想象成Windows下的記事本。我們會使用它來編寫代碼和Makefile文件。
  • Makefile: Makefile是一個文本文件,它裏面的內容描述了如何根據源文件生成目標文件,即我們所需要的bin文件。在第2.2節會讓你編寫Makefile文件。
  • make: make是一個工具,它以Makefile作為其輸入,根據Makefile內描述的規則,生成目標文件。
  • VMWare tools: VMWare tools是VMWare裏面的一項工具,我們這裏用它來實現Windows和Ubuntu虛擬機之間的文件共享,它在1.2節會提及。
  • Terminal: 終端。類似於Windows中的命令行,在2.3節我們會使用到它。
  • Jlink:Segger公司出品的仿真器,本文中我們僅用它來燒錄Mini2440開發板上的Nor Flash。
  • supervivi: 友善之臂開發的類似於u-boot的程序,它通常被燒錄至Mini2440開發板上的Nand Flash或是Nor Flash中。
  • dnw:與supervivi配合使用,完成向開發板下載程序的工具軟件。

三、操作步驟

1. 搭建編譯環境

1.1 VMWare與Ubuntu9.10 的下載與安裝

下載JZ2440的配套光盤,光盤裏面有VMWare和已經安裝好編譯工具鏈的Ubuntu。

下載完成之後安裝VMWare,然後用VMWare打開Ubuntu。整個過程比較簡單,網上有很多教程。

介紹一下大致的工作流程:

我們將Windows作為主機,在Windows上,我們可以通過VMWare訪問虛擬機Ubuntu。而Ubuntu僅僅作為編譯環境,其余的大部分操作還是在Windows上完成。使用Ubuntu的最終目的是生成可供下載至Mini2440的bin文件,然後在Windows上通過相應的工具將這個bin文件燒錄至2440開發板。

那麽,你可能要問了,這兩個不同的操作系統之間,可以互相訪問嗎,生成的bin文件要如何在兩者之間傳遞呢?

不著急,我們接下來就會來解決這個問題了。

1.2 在Windows與Ubuntu之間設置共享文件夾

接下來在主機(通常是Windows)與虛擬機(這裏是Ubunbu)之間設置共享文件夾,主要是安裝VMWare tools,這裏不再贅述,網絡上有相應的教程。

剛才一口氣做了這麽多事,讓我們先來休息一會兒,想一想我們都已經完成了哪些事了。

到現在為止,我們已經在Windows上安裝好了VMWare,通過VMWAre我們可以使用Ubuntu系統,接下來,我們將在Ubuntu中編寫點亮Led的代碼,以及描述如何生成可供下載至Mini2440的bin文件。通過在1.2節設置的共享文件夾,在Windows上,我們可以取到這個bin文件,並通過相應的工具將它燒錄至Mini2440。

2. 編寫led程序和Makefile

2.1 通過vi輸入led_on.s

你可能是頭一次聽說vi,還不知道如何使用。關於vim,網上也很大把的教程,同時,這裏也有vi的視頻教程。你只需要掌握幾個簡單的操作,例如如何新建文件,如何輸入並保存文件即可。

在你學會使用vi後,請新建一個名為led_on.s的文件,它的內容如下:

.text
.global _start
_start:
    LDR R0,=0x56000010
    MOV R1,#0x00015400
    STR R1,[R0]

    LDR R0,=0x56000014
    MOV R1,#0x000000C0
    STR R1,[R0]
MAIN_LOOP:
    B   MAIN_LOOP

以上匯編代碼主要做了兩件事:

  1. 將位於0x56000010地址的GPBCON寄存器的內容寫為0x00015400,什麽意思呢?GPBCON寄存器是用來配置GPB的控制寄存器,通過它,可以分別指定GPB上每一位的功能——是作為輸入引腳,或是作為輸出引腳,抑或是其它的功能。

    通過查看Mini2440的原理圖,我們可以看到,開發板上的4個led分別連接到了CPU(S3C2440)的GPB5/GPB6/GPB7和GPB8。

    所以,我們需要在GPBCON寄存器上,需要將GPB5/6/7/8配置為輸出功能。
  2. 將位於0x56000014地址的GPBDAT寄存器的內容寫為0x000000C0。GPBDAT寄存器是用來控制各個引腳上的電平的,是高電平1還是低電平0.

如果你仍然有些疑惑,那你可以看看這個視頻教程的前半小時的內容。當然,對於這段代碼的內容不太理解也沒有關系,知道它大致做了些什麽事情就可以啦!

2.2 通過vim輸入Makefile

使用vi新建一個名為Makefile的文件,它的內容如下:

led_on.bin:led_on.s
    arm-linux-gcc -g -c -o led_on.o led_on.s
    arm-linux-ld -Ttext 0x00000000 -g led_on.o -o led_on_elf
    arm-linux-objcopy -O binary -S led_on_elf led_on.bin
clean:
    rm -f led_on.bin led_on_elf *.o

同樣地,前面的視頻教程也有對這個Makefile文件的講解。

2.3 生成可執行文件led_on.bin

在Ubuntu中打開終端,cd至led_on.s和Makefile所在的目錄,執行以下命令,生成led_on.bin。

make

至此,我們已經生成了將要下載到Mini2440開發板中的led_on.bin文件。

3 Mini2440的啟動模式

Mini2440有兩種啟動模式,分別是從Nand Flash啟動和從Nor Flash 啟動,兩種啟動模式通過開關S2控制。

在 NAND Flash 啟動模式下,上電之後,Nand Flash 最前面的4K 空間的內容會被拷貝至S3C2440 (Mini2440開發板上的主芯片)中的片內SRAM中,接著從SRAM的0地址處開始執行。

在 Nor Flash 啟動模式下(非 Nand Flash 啟動模式),Nor Flash 起始處就被映射為 0地址,接著從Nor Flash的0地址處開始執行。

在本文中,我們將使用Nor Flash模式啟動,通過燒錄至Nor Flash的Supervivi,將2.3生成的led_on.bin燒錄至SDRAM處執行。

SDRAM 地址空間: 0x30000000 ~ 0x34000000

4 燒錄supervivi至Nor Flash

4.1 判斷Nor Flash中是否已經燒錄supervivi

使用直連串口線連接Mini2440開發板的串口 0 和 PC 機的串口,在Windows上打開並設置好串口助手(115200,8N1),將Mini2440上的開關S2撥至Nor Flash啟動模式,然後將開發板上電,如果串口助手上沒有打印出以下內容,則需要根據4.2及其以後的步驟燒錄supervivi至Nor Flash.
技術分享圖片

4.2通過JLink將supervivi燒錄至Nor Flash

技術分享圖片

4.2.2 安裝JFlash(配合JLink使用)

在Mini2440光盤裏可以找到安裝文件

4.2.3 通過JFlash燒錄supervivi至Nor Flash

打開JFlash,依次打開Options->Project settings…,按照下圖配置。
技術分享圖片

通過File->Open data file…導入supervivi-64M.bin(註意區分應該選64M還是128M的,我的Mini2440上的Nand Flash是64M的),地址填寫0,表示bin文件將燒錄至Nor Flash的0地址處。
技術分享圖片

依次選擇Target->Auto,等待燒錄完成。

4.2.4 在Windows上安裝dnw

參照Mini2440用戶手冊的2.2.3節安裝dnw

4.2.5 燒錄led_on.bin至SDRAM並執行
4.2.5.1 打開dnw,依次選擇Configuration,在Download Address處填寫0x32000000,表示接下來的supervivi將被燒錄至0x32000000,即SDRAM處。

技術分享圖片

4.2.5.2 開發板上電,串口助手將打印以下信息,輸入d

技術分享圖片

4.2.5.3 在dnw中依次選擇USB Port->Transmit/Restore,在彈出的窗口中選擇led_on.bin,等待下載完成。

技術分享圖片
技術分享圖片

4.2.5.4 觀察開發板上的LED。

4個Led中,Led1和Led4應該是被點亮,而Led2和Led3則是熄滅的。



至此,總算是把Led給點亮了,雖然整個過程有一些繁瑣,但是並沒有多大的難度,主要是涉及到比較多的工具軟件,如果有哪個步驟卡住了,你可以先嘗試在網絡上搜索一下,如果自己無法解決,歡迎留言。





技術分享圖片

如果你看了這篇文章,覺得有一點點收獲,那就給點打賞,給我更大的寫作動力吧。

Mini2440上的第一個程序——點亮Led