上一篇文章寫的是linux下通過gcc完成程序源文件的編譯執行的過程。以及makefile文件的編寫,最后在終端平臺輸出myhello word!
有了這個基礎,這次學習的就是通過linux編譯生成的代碼在ARM上完成硬件實現。因為還不涉及到系統移植,所以還是裸板程序開發。


1.源代碼編寫

ARM裸板程序需要代碼原料主要包括:匯編文件,C文件,makefile文件。每個文件都有各自功能。
(1)匯編文件
完成關看門狗;配置時鐘;初始化sdram;設置棧;以及跳轉到C函數執行入口(相當于main函數),代碼如下(該例程不需要配置時鐘和sdram)。

@******************************************************************************
@ File:crt0.S
@ 功能:通過它轉入C程序
@******************************************************************************       

@注:正常匯編程序還需要初始化時鐘,SDRAM功能,但對于點亮LED不需要。直接使用12Mhz
.text
.global _start
_start:                                             @程序代碼段開始處,各段在鏈接腳本定義
                ldr     r0,=0x53000000  @看門狗控制寄存器地址(32位地址賦值語句,r0地址為0x53000000) 
                                      @ ldr和mov區別就是,ldr傳輸32位數據,而mov只能傳8位數
                mov     r1,  #0x0        @立即數賦值給r1寄存器
                str     r1,  [r0]       @把r1寄存器內的數據0x0給r0地址

              @以上三條語句為看門狗控制寄存器賦值為0

              ldr   sp,= 4*1024      @設置堆在大小為4K(NAND FLASH前4k)
                bl      main                        @跳轉 到main函數,同時保存了下一條指令地址
haltloop:

(2)C文件
匯編的代碼量相對較少,只執行一些必要的初始化功能,真正功能部分在C文件里。C文件主要執行:寄存器地址宏定義;外設初始化;功能實現等。

本例點亮的led引腳是GPF4,因此需要查詢2440的參考手冊,查看GPF的相關寄存器地址,主要配置的寄存器是GPFCON(控制寄存器)和GPFDAT(數據寄存器)。GPFCON主要控制引腳的工作模式(模式有:輸入,輸出,復用),其中每兩位控制一個引腳的狀態,從下圖可以看出:

引腳的高低電平由GPFDAT控制,每一位控制一個引腳,如圖:

所以學會看芯片手冊還是很重要的,明白各個寄存器并進行編程,同時應該掌握移位操作,在寄存器編程比較常用。該部分代碼如下:

#define GPFCON          (*(volatile unsigned long*)0x56000050)
#define GPFDAT          (*(volatile unsigned long*)0x56000054)
#define GPFUP         (*(volatile unsigned long*)0x56000058)
#define GPIO_Pin_0       ((volatile unsigned char)0x00)
#define GPIO_Pin_1       ((volatile unsigned char)0x01)
#define GPIO_Pin_2       ((volatile unsigned char)0x02)
#define GPIO_Pin_3       ((volatile unsigned char)0x03)
#define GPIO_Pin_4       ((volatile unsigned char)0x04)
int main()
{
    GPFCON =  0X01<<(GPIO_Pin_4*2);         //GPF_4輸出模式
    GPFDAT = ~(0X01 << (GPIO_Pin_4));      //GPF_4輸出0
    return 0;
}

(3)makefile文件
編寫編譯規則,和上篇文章原理一樣。linux有專門針對ARM的編譯工具,主要用到的有這個3個:

arm-linux-gcc:主要在文件編譯時,由(.C/.S)文件編程成.o目標文件時使用。
arm-linux-ls:主要對所有.o目標文件鏈接生成一個可執行文件
arm-linux-objcopy:主要對可執行文件進行二進制轉換成.bin可以燒錄用的文件

文件代碼如下:

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

上述的3個文件分別為:crt0.S,led_lighton.c,Makefile。這是最簡單的例程文件了,合適入門。代碼文件下載地址鏈接:
http://download.csdn.net/download/ludaoyi88/10151739

1.文件編譯鏈接

匯編文件和C文件需要編譯鏈接后生成可執行文件,可執行文件再轉換成.bin二進制文件,才能燒錄到開發板上執行。而這些編譯鏈接與轉換都在makefile里寫好,只需在linux終端輸入make命令執行即可。
通過secureCRE遠程登錄到linux主機(這里用虛擬機),FTP文件傳輸工具連接到linux主機,在Windows下編寫上述3個代碼文件,整個過程和上篇文章一樣,不再贅述。
將3個代碼文件上傳上linux主機的相關文件路徑下,在終端鍵入make命令,執行makefile文件,執行結果如下圖:

上述可以看到生成了led_on.bin的二進制文件,將此文件燒錄到開發板,燒錄方法可以用:oflash,dnw,tftpd,nfs等方法下載,前3種方法之前文章有講解使用方法。這里使用Windows下由dnw下載程序,先將二進制文件傳入window再下載(開發板應撥碼至nand)。如圖:

下載成功后,復位開發板,可以看到一個led燈變亮。效果如圖(成功咯O(∩_∩)O哈哈~)。這僅僅是裸板開發的入門,如果有其他外設話就復雜了,同志仍需努力!

更多關于云服務器域名注冊,虛擬主機的問題,請訪問三五互聯官網:m.shinetop.cn

贊(0)
聲明:本網站發布的內容(圖片、視頻和文字)以原創、轉載和分享網絡內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。郵箱:3140448839@qq.com。本站原創內容未經允許不得轉載,或轉載時需注明出處:三五互聯知識庫 » 嵌入式linux裸板開發--點亮LED

登錄

找回密碼

注冊

主站蜘蛛池模板: 人妻出轨av中文字幕| 国产精品国产三级国产av剧情 | 国产精品麻豆成人av网| 欧美人妻在线一区二区| a级国产乱理伦片在线观看al| 亚洲av无码之国产精品网址蜜芽 | 好吊妞| 岛国最新亚洲伦理成人| 亚洲AV成人无码久久精品四虎| 国产乱色国产精品免费视频| 野外做受又硬又粗又大视频√| 熟女女同亚洲女同中文字幕| 国产一区二区三区在线观看免费 | 99久久精品国产综合一区| 亚洲激情一区二区三区视频| 熟妇无码熟妇毛片| 狠狠躁夜夜躁人人爽天天5| 风骚少妇久久精品在线观看| 国内精品无码一区二区三区| 99中文字幕精品国产| 久久天天躁狠狠躁夜夜avapp| 欧美国产精品不卡在线观看| 一本无码在线观看| 德州市| 中文字幕乱码在线播放| 亚洲粉嫩av一区二区黑人| 无码一级视频在线| 国产成人AV一区二区三区无码| 亚洲午夜精品久久久久久抢| 国精偷拍一区二区三区| 亚洲成av人片不卡无码手机版| 国产激情艳情在线看视频| 国产av中文字幕精品| 少妇精品无码一区二区免费视频| 高清国产一区二区无遮挡| 天堂av网一区二区三区| 深夜av免费在线观看| 日韩人妻无码精品久久久不卡| 国内熟妇与亚洲洲熟妇妇| 人妻在线无码一区二区三区 | 起碰免费公开97在线视频|