【嵌入式Linux+ARM】GPIO操作

來源:互聯網
上載者:User

標籤:嵌入式   arm   

1.GPIO介紹

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

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

        s3c2440中有130個I/O連接埠,分為A~J共9組,GPA、GPB、..... GPJ


2.GPIO寄存器

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

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

GPxDAT——用來讀寫引腳

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


3.原理圖

                                            LED:





                                            按鍵:



4.實驗代碼: >>使用組合語言實現點燈:

led_on.S

.text.global _start_start:LDR R0, =0x56000050    //GPFCON寄存器地址MOV R1, #0x00001500    //見技術手冊相應的配置,一般01為輸出引腳STR R1, [R0]           //設定為輸出LDR R0, =0x56000054    //GPFDAT寄存器MOV R1, #0x00000000STR R1, [R0]           //往GPFDAT寄存器寫值MAIN_LOOP:B MAIN_LOOP            //迴圈等待
Makefile:

led_on.bin:led_on.Sarm-linux-gcc -g -c led_on.S -o led_on.oarm-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語言實現點燈

使用c語言來寫,需要一個開機檔案,可以用來關閉看門口,設定堆棧等。

crt0.S

.text.global _begin_begin:LDR R0, =0x53000000    //看門狗寄存器地址MOV R1, #0x00000000    //寫0禁止看門狗STR R1, [R0]LDR SP, =1024*4        //設定堆棧,注意不能大於4K,因為現在可用的SRAM空間只有4KBL main                //調用main函數,最後注意,組合語言大小寫無所謂的_LOOP:B _LOOP


led_on_c.c

#define GPFCON *(volatile unsigned long *)0x56000050#define GPFDAT *(volatile unsigned long *)0x56000054int main(){GPFCON=0x00001500;//簡單的配置為輸出GPFDAT=0x00000000;//簡單的輸出0,通過上面的原理圖可知,相應的led會亮return 0;}


Makefile

led_on_c.bin : crt0.S  led_on_c.carm-linux-gcc -g -c -o crt0.o crt0.Sarm-linux-gcc -g -c -o led_on_c.o led_on_c.carm-linux-ld -Ttext 0x0000000 -g  crt0.o led_on_c.o -o led_on_c_elfarm-linux-objcopy -O binary -S led_on_c_elf led_on_c.binarm-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

>>使用按鍵+c語言實現點燈

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

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

crt0.S同上;

key_led.c

/*GPF4 GPF5 GPF6 --ledGPF0 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<<(4*2))#define GPF5_out (1<<(5*2))#define GPF6_out (1<<(6*2))#define GPF4_msk (3<<(4*2))#define GPF5_msk (3<<(5*2))#define GPF6_msk (3<<(6*2))#define GPF0_in (0<<(0*2))#define GPF2_in (0<<(2*2))#define GPG3_in (0<<(3*2))#define GPF0_msk (3<<(0*2))#define GPF2_msk (3<<(2*2))#define GPG3_msk (3<<(3*2))int main(){unsigned long dwDat;//1 output pin GPFCON &= ~(GPF4_msk | GPF5_msk | GPF6_msk);GPFCON |=  (GPF4_out | GPF5_out | GPF6_out);//input pinGPFCON &= ~(GPF0_msk | GPF2_msk);GPFCON |=  (GPF0_in | GPF2_in);GPGCON &= ~GPG3_msk;GPGCON |=  GPG3_in;while(1){dwDat = GPFDAT;if(dwDat & (1<<0))GPFDAT |= (1<<4);elseGPFDAT &= ~(1<<4);//lightif(dwDat & (1<<2))GPFDAT |= (1<<5);elseGPFDAT &= ~(1<<5);dwDat = GPGDAT;if(dwDat & (1<<3))GPFDAT |= (1<<6);elseGPFDAT &= ~(1<<6);}return 0;}

Makefile相應的修改即可;


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


註:原創文章,轉載請註明出處:http://blog.csdn.net/scottly1/article/details/38960309

【嵌入式Linux+ARM】GPIO操作

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.