ARM GPIO口位操作

 問:wince上面能不能定義位變量,,就像51那樣,
sbit led=P2^0;這種,操作led這個變量就是操作那個引腳了,,,
arm上面有沒有類似的定義??用宏也行
     答:   1。ARM上沒有位運算的變量,不過可以通過控制IO寄存器來實現某個IO口操作。
在CE下的話還需要編寫符合微軟規範的驅動程序。

    2。在WinCE上要想操作GPIO口,就得寫驅動程序,通過虛擬地址映射來控制IO口,樓主可以先探索一下如何控制IO口吧,可以參考一下如何寫GPIO流驅動。

    3。GPFDAT &=~(1<<0);//GPF0 置低
          GPFDAT |=(1<<0); //GPF0 置高

    4。一、定義一個字節(8位)的位變量,既可按字節訪問也可按位進行訪問
union flag // 先定義一個聯合flag
{
  unsigned char val; // 再定義該聯合中的一個字節型變量val
  struct // 定義一個結構型數據,構成位域。  
  {
  unsigned char B0:1; // B0~B7爲每一位的名稱,可用其他名稱替換,例如B0可寫成FLAG0。
  unsigned char B1:1; // B1可寫成FLAG1
  unsigned char B2:1; // B2可寫成FLAG2
  unsigned char B3:1; // B3可寫成FLAG3

  unsigned char B4:1; // B4可寫成FLAG4
  unsigned char B5:1; // B5可寫成FLAG5
 unsigned char B6:1; // B6可寫成FLAG6
  unsigned char B7:1; // B7可寫成FLAG7 
  } bits; // 再定義該聯合中的另一個結構型變量bits
};
volatile union flag flag; // 最後,定義該聯合的變量flag,注意這句話中有兩點要弄清楚,關鍵字volatile的本意是“易變”,在C30中一般不能省略;第一個flag是聯合的名稱,第二個flag是該聯合的變量,這第二個flag可寫成其他任意名稱,例如lcd_ctrl等等。
有了上述定義就可以引用了,引用方法如下:
當按字節操作時,例如這樣:flag.val = 0xAA; //變量flag被賦值:0xAA。
當按位操作時,例如這樣:flag.bits.B0 = FALSE; // 0
  flag.bits.B1 = TRUE; // 1
  flag.bits.B2 = FALSE; // 0
  flag.bits.B3 = TRUE; // 1
  flag.bits.B4 = FALSE; // 0
 flag.bits.B5 = TRUE; // 1
  flag.bits.B6 = FALSE; // 0
  flag.bits.B7 = TRUE; // 1
在上述定義中,C30在內存中只分配一個字節的變量flag,因而操作起來極爲方便,如果將上述定義中的volatile關鍵字去掉,也可應用於keil c51中,以解決51單片機中位變量有限(20H~2FH共128個位)的矛盾。
二、定義一個字(16位)的位變量,既可按字訪問也可按位進行訪問
這和定義字節位變量的方法相同,請看:
union flag // 先定義一個聯合flag
{
  unsigned int val; // 再定義該聯合中的一個字變量val

  struct // 定義一個結構型數據,構成位域。  
  {
  unsigned char B0:1; // B0~B7爲每一位的名稱,可用其他名稱替換,例如B0可寫成FLAG0。
  unsigned char B1:1; // B1可寫成FLAG1
  unsigned char B2:1; // B2可寫成FLAG2
  unsigned char B3:1; // B3可寫成FLAG3
unsigned char B4:1; // B4可寫成FLAG4
unsigned char B5:1; // B5可寫成FLAG5
unsigned char B6:1; // B6可寫成FLAG6
unsigned char B7:1; // B7可寫成FLAG7  
unsigned char B8:1; // B8寫寫成FLAG8
 unsigned char B9:1; // B9可寫成FLAG9
 unsigned char B10:1; // B10可寫成FLAG10
 unsigned char B11:1; // B11可寫成FLAG11
unsigned char B12:1; // B12可寫成FLAG12
unsigned char B13:1; // B13可寫成FLAG13
unsigned char B14:1; // B14可寫成FLAG14

unsigned char B15:1; // B15可寫成FLAG15  
} bits; // 再定義該聯合中的另一個結構型變量bits
};
volatile union flag flag; // 最後,定義該聯合的變量flag。
當按字操作時,例如這樣:flag.val = 0x55AA; // 變量flag被賦值:0x55AA。
當按位操作時,例如這樣:flag.bits.B0 = FALSE;// 0
 flag.bits.B12 = TRUE;// 1
在上述定義中,C30在內存中分配一個字變量flag。 
這是摘錄的東西。可以用這種方法定義位變量。用共用體的方式對IO口進行操作是經常使用的一個手段。建議樓主查一下相關的資料。這個問題就很容易解決。看一下定義管腳是如何實現的。
另外,需要用流驅動的方式來調用你的底層。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章