Windows CE下操作GPIO的方法

來源:互聯網
上載者:User
GPIO 是ARM晶片最基本的輸入輸出通道,在ADS下操作就是一個單片機工作,直接讀寫其寄存器。在ARM9平台上,Windows CE系統將GPIO的真實位址(例如2410的GPIO的基地址為0x56000000)映射到虛擬位址空間(GPIO對應為0xB1600000),這 樣,通過對這段虛擬位址空間的操作,就能夠完成對GPIO或者其他片內資源的控制、輸入輸出工作。
要操作一個平台的GPIO,在其對應BSP 中按照基地址,找到虛擬位址,並且找到方便操作這個地址的資料結構就可以了,關鍵函數就是VirtualAlloc和VirtualCopy。並且CE的 方便之處就是使用者態的應用程式仍然可以使用這兩個函數來訪問所有這些虛擬空間,對於不太複雜的程式,甚至可以省略寫驅動直接在應用程式中操作,其實在 CE6之前,這些驅動也是工作在使用者態的。
下面以操作Samsung S3C2410的GPIO為例,講述這個步驟:
1.首先在BSP中的s2410.h檔案,找到虛擬位址映射以及操作GPIO的寄存器結構體(這個在自己製作一些特殊裝置的BSP時,會依據需要而發生更改)
//
// Registers : I/O port
//

#define IOP_BASE 0xB1600000 // 0x56000000
typedef struct {
unsigned int rGPACON; // 00
unsigned int rGPADAT;
unsigned int rPAD1[2];

unsigned int rGPBCON; // 10
unsigned int rGPBDAT;
unsigned int rGPBUP;
unsigned int rPAD2;

unsigned int rGPCCON; // 20
unsigned int rGPCDAT;
unsigned int rGPCUP;
unsigned int rPAD3;

unsigned int rGPDCON; // 30
unsigned int rGPDDAT;
unsigned int rGPDUP;
unsigned int rPAD4;

unsigned int rGPECON; // 40
unsigned int rGPEDAT;
unsigned int rGPEUP;
unsigned int rPAD5;

unsigned int rGPFCON; // 50
unsigned int rGPFDAT;
unsigned int rGPFUP;
unsigned int rPAD6;

unsigned int rGPGCON; // 60
unsigned int rGPGDAT;
unsigned int rGPGUP;
unsigned int rPAD7;

unsigned int rGPHCON; // 70
unsigned int rGPHDAT;
unsigned int rGPHUP;
unsigned int rPAD8;

unsigned int rMISCCR; // 80
unsigned int rDCKCON;
unsigned int rEXTINT0;
unsigned int rEXTINT1;
unsigned int rEXTINT2; // 90
unsigned int rEINTFLT0;
unsigned int rEINTFLT1;
unsigned int rEINTFLT2;
unsigned int rEINTFLT3; // A0
unsigned int rEINTMASK;
unsigned int rEINTPEND;
unsigned int rGSTATUS0; // AC
unsigned int rGSTATUS1; // B0
unsigned int rGSTATUS2; // B4
unsigned int rGSTATUS3; // B8
unsigned int rGSTATUS4; // BC

}IOPreg;
將這些複製備用。

2.在EVC中建立一個應用程式工程,由於VirtualCopy函數沒有在標頭檔中定義,但是在coredll.lib裡面提供了符號串連,所以我們這裡直接添加一個函數定義就OK了。
#ifdef __cplusplus
extern "C"
{
#endif

BOOL VirtualCopy( LPVOID, LPVOID, DWORD, DWORD );

#ifdef __cplusplus
}
#endif
同時將步驟1裡面的定義複製到這裡。

3.按照驅動程式裡面操作的方法在應用程式中寫GPIO操作函數
(1)定義一個寄存器結構體變數
volatile IOPreg *v_pIOPRegs;
(2)給這個變數分配空間並且映射到寄存器的空間上
v_pIOPRegs = (volatile IOPreg*)VirtualAlloc(0, sizeof(IOPreg), MEM_RESERVE, PAGE_NOACCESS);
if (v_pIOPRegs == NULL)
{
DEBUGMSG (1,(TEXT("v_pIOPRegs is not allocated/n/r")));
return TRUE;
}
if (!VirtualCopy((PVOID)v_pIOPRegs, (PVOID)IOP_BASE, sizeof(IOPreg), PAGE_READWRITE|PAGE_NOCACHE)) {
DEBUGMSG (1,(TEXT("v_pIOPRegs is not mapped/n/r")));
return TRUE;
}
DEBUGMSG (1,(TEXT("v_pIOPRegs is mapped to %x/n/r"), v_pIOPRegs));
這3個步驟之後,對v_pIOPRegs的操作將直接和GPIO的寄存器關聯
例如:設定GPB的控制寄存器為全部Output
v_pIOPRegs->rGPBCON=0x155555;
設定GPB的資料寄存器輸出高電平
v_pIOPRegs->rGPBDAT=0x3FF;

更多的操作,需要查閱ARM的datasheet以及WINCE的BSP源碼完成。

對於非ARM的平台,在CE下操作,也可以參考這個思路。

//******************************************************************************************************************
來源:http://www.gd-emb.org/detail/id-36867.html

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.