1. gzyueqian
      18078865874
      首頁 > 新聞中心 > > 正文

      Windows CE下操作GPIO的方法

      更新時間: 2007-07-03 11:44:36來源: 粵嵌教育瀏覽量:916

      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下操作,也可以參考這個思路。

      免費預約試聽課

      亚洲另类欧美综合久久图片区_亚洲中文字幕日产无码2020_欧美日本一区二区三区桃色视频_亚洲AⅤ天堂一区二区三区

      
      

      1. 日本亚洲韩中文字幕 | 日韩国产亚洲欧美 | 亚洲理伦片免费观看 | 日本有码中文字幕第二页 | 最新国产人妖TS视频 | 亚洲美女在线一区二区 |