s3c2440的GPIO驅(qū)動
S3C2440包含有130多個通用的GPIO,同時這些端口也擁有一些復(fù)用功能(如ADC輸入),有部分端口只能輸入,有部分端口只能輸出,今天我們來看看如何設(shè)置一個GPIO的輸出電平以及如何獲取一個端口的GPIO電平
對GPIO進行操作分為以下幾步
1.功能設(shè)置,GPXCON寄存器,針對于2440addr.h,分別為
rGPACON,rGPBCON,rGPCCON,rGPDCON,rGPECON,rGPFCON,rGPGCON,rGPHCON,rGPJCON
通過設(shè)置不同的值來選著不同的功能,輸入,輸出,復(fù)用,等
2.數(shù)據(jù)讀寫,GPXDAT寄存器,在輸入模式下,dat寄存器相應(yīng)位代表相應(yīng)引腳的當(dāng)前電平,在輸出模式下, dat寄存器相應(yīng)位代想要設(shè)置的相應(yīng)電平
(注,2440addr.h中的寄存器前面都有一個小寫r開頭).
3.內(nèi)部上拉寄存器GPXUP寄存器,可以設(shè)置相應(yīng)位的內(nèi)部上拉是否打開
設(shè)置好這三位之后,GPIO就可以正常操作了
以下是GPIO輸出LED,使用GPB5-GPB8
Led.c
#include"led.h"voidLedInit(void){//GPB01為輸出模式,先清零寄存器為00rGPBCON&=~((3<<10)|(3<<12)|(3<<14)|(3<<16));//10b512b614b716b8//設(shè)置相應(yīng)寄存器為01rGPBCON|=((1<<10)|(1<<12)|(1<<14)|(1<<16));//禁止上拉,因為是輸出rGPBUP&=~((1<<5)|(1<<6)|(1<<7)|(1<<8));//設(shè)置初始化為1led處于熄滅狀態(tài)rGPBDAT|=((1<<5)|(1<<6)|(1<<7)|(1<<8));}voidLedSet(u8ch,u8value){switch(ch){case0:if(value)rGPBDAT|=(1<<5);elserGPBDAT&=~(1<<5);break;case1:if(value)rGPBDAT|=(1<<6);elserGPBDAT&=~(1<<6);break;case2:if(value)rGPBDAT|=(1<<7);elserGPBDAT&=~(1<<7);break;case3:if(value)rGPBDAT|=(1<<8);elserGPBDAT&=~(1<<8);break;}}
Led.h
#ifndef__LED_H#define__LED_H#include"2440addr.h"#include"def.h"voidLedInit(void);voidLedSet(u8ch,u8value);#endif
以下是GPIO輸入按鍵檢測,使用GPIOF 0 1 2 4
Key.c
#include"key.h"u8keyValue=0;voidKeyInit(void){rGPFCON&=~((3<<2)|(3<<8)|(3<<4)|(3<<0));//對GPFCON[10:17]清零rGPFUP&=~((1<<1)|(1<<4)|(1<<2)|(1<<0));//設(shè)置上拉功能rGPFDAT|=(1<<1)|(1<<4)|(1<<2)|(1<<0);//設(shè)定初始值}//按鍵按下,相關(guān)端口為0,沒有按鍵按下時,不會自動清零,會保持最后一次的狀態(tài),需要用戶自己去清零u8GetKeyValue(void){u32temp=rGPFDAT;if(!(temp&(1<<0)))//如果相關(guān)端口為0{keyValue=KEY_UP;returnkeyValue;}if(!(temp&(1<<1))){keyValue=KEY_DOWN;returnkeyValue;}if(!(temp&(1<<2))){keyValue=KEY_LEFT;returnkeyValue;}if(!(temp&(1<<4))){keyValue=KEY_RIGHT;returnkeyValue;}return0;}
Key.h
#ifndef__KEY_H#define__KEY_H#include"2440addr.h"#include"def.h"http://按鍵全部上拉//key1對應(yīng)F1//key2對應(yīng)F4//key3對應(yīng)F2//key4對應(yīng)F0#defineKEY_UP1#defineKEY_DOWN2#defineKEY_LEFT3#defineKEY_RIGHT4externu8keyValue;voidKeyInit(void);u8GetKeyValue(void);#endif