嵌入式Linux ARM GPIO操作

2021-06-25 07:56:01 字數 3438 閱讀 8969

gpio(general purpose i/o ports)意思為通用輸入/輸出埠,通俗的說就是一些引腳。

我們可以通過它們輸出高低電平 或 讀入引腳的狀態。

s3c2440中有130個i/o埠,分為a~j共9組,gpa、gpb、..... gpj

既然要操作gpio,必須對相應的暫存器進行操作,2440中gpio暫存器有:

gpxcon——選擇引腳功能(輸入、輸出、保留等)

gpxdat——用來讀寫引腳

gpcup ——某一位是1時,相應的引腳無內部上拉電阻;為0時,有內部上拉電阻

按鍵:

ldr r0, =0x56000050 //gpfcon暫存器位址

mov r1, #0x00001500 //見技術手冊相應的配置,一般01為輸出引腳

str r1, [r0] //設定為輸出

ldr r0, =0x56000054 //gpfdat暫存器

mov r1, #0x00000000

str r1, [r0] //往gpfdat暫存器寫值

main_loop:

b main_loop //迴圈等待

makefile:

led_on.bin:led_on.s

arm-linux-gcc -g -c led_on.s -o led_on.o

arm-linux-ld -ttext 0x00000000 -g led_on.o -o led_on_elf //-ttext表示設定連線位址

arm-linux-objcopy -o binary -s led_on_elf led_on.bin //把elf檔案轉換為.bin檔案

clean:

rm -rf *.bin *.o *elf

使用c語言來寫,需要乙個啟動檔案,可以用來關閉看門口,設定堆疊等。

crt0.s

.text

.global _begin

_begin:

ldr r0, =0x53000000 //看門狗暫存器位址

mov r1, #0x00000000 //寫0禁止看門狗

str r1, [r0]

ldr sp, =1024*4 //設定堆疊,注意不能大於4k,因為現在可用的sram空間只有4k

bl main //呼叫main函式,最後注意,組合語言大小寫無所謂的

_loop:

b _loop

led_on_c.c

#define gpfcon *(volatile unsigned long *)0x56000050

#define gpfdat *(volatile unsigned long *)0x56000054

int main()

makefile

led_on_c.bin : crt0.s  led_on_c.c

arm-linux-gcc -g -c -o crt0.o crt0.s

arm-linux-gcc -g -c -o led_on_c.o led_on_c.c

arm-linux-ld -ttext 0x0000000 -g crt0.o led_on_c.o -o led_on_c_elf

arm-linux-objcopy -o binary -s led_on_c_elf led_on_c.bin

arm-linux-objdump -d -m arm led_on_c_elf > led_on_c.dis //把elf檔案轉換為反彙編檔案

clean:

rm -f led_on_c.dis led_on_c.bin led_on_c_elf *.o

看上面的原理圖,原理就是把按鍵的引腳配置為輸入引腳,以讀取引腳的狀態;

但按鍵被按下時,引腳讀到的是低電平;當按鍵鬆開時,讀取到高電平;

crt0.s同上;

key_led.c

/*

gpf4 gpf5 gpf6 --led

gpf0 gpf2 gpg3 --key

*/#define gpfcon (*(volatile unsigned long *)0x56000050)

#define gpfdat (*(volatile unsigned long *)0x56000054)

#define gpgcon (*(volatile unsigned long *)0x56000060)

#define gpgdat (*(volatile unsigned long *)0x56000064)

#define gpf4_out (1<

#define gpf5_out (1<

#define gpf6_out (1<

#define gpf4_msk (3<

#define gpf5_msk (3<

#define gpf6_msk (3<

#define gpf0_in (0<

#define gpf2_in (0<

#define gpg3_in (0<

#define gpf0_msk (3<

#define gpf2_msk (3<

#define gpg3_msk (3<

int main()

return 0;

}

makefile相應的修改即可;

上面的程式編譯都會得到bin檔案,我們把它燒錄進nand flash中即可,燒錄可以使用工具,也可以通過固化在nor flash中的uboot來燒錄,方法很多,燒錄後,上電,2440cpu會自動把nand flash前4k的內容,拷貝到2440片內4k的sram中執行,這塊記憶體俗稱stepping stone區。

初識嵌入式 嵌入式開發概述

1 什麼是嵌入式技術 1 嵌入式軟體與非嵌入式軟體的區別?答 嵌入式軟體是結合作業系統之上做的開發 非嵌入式軟體是做的裸機開發。裸機 沒有作業系統 2 嵌入式開發與微控制器開發的區別?答 區別 是否有作業系統。拓展 答 優點 解決了軟體的移植性 解決了開發人員的能力的劃分問題。提供了豐富的網路協議 ...

如何學習嵌入式 嵌入式如何入門?

學習嵌入式,該學習什麼基本的知識呢?嵌入式如何入門?其次,應該對作業系統有所了解,這對你對硬體和軟體的理解,絕對有很大的幫助。應該把系統的管理理解一下,比如程序 執行緒,系統如何來分配資源的,系統如何來管理硬體的,當然,不是看書就能把這些理解透,如果不是一時能理解,沒關係,多看看,結合以後的專案經驗...

非嵌入式與嵌入式的區別

非嵌入式是通過軟體控制硬體,軟硬體之間直接聯絡來實現要求。但是一旦硬體發生改變軟體也要改變,為了降低這種偶合度過高的問題,出現了嵌入式。嵌入式在軟體和硬體之間新增了作業系統,軟體通過控制作業系統進而控制硬體,硬體發生改變並不會導致軟體也發生改變,這為軟體開發人員節約了很多時間,並且嵌入式能在已有的硬...