ZYNQ學習之——MIO


1、GPIO基礎知識

  Zynq7000 系列芯片有 54 個 MIO(multiuse I/O) ,它們分配在 GPIO 的 Bank0 和Bank1 隸屬於 PS 部分, 這些 IO 與 PS 直接相連。 不需要添加引腳約束, MIO 信號對 PL部分是不可見,即PL不能對這部分IO信號進行任何操作。 所以對 MIO 的操作可以看作是純 PS 的操作。 參考芯片手冊看到

  Bank0:MI0[31:0]
  Bank1:MI0[52:53]
  Bank2:EMI0[31:0]
  Bank3:EMI0[63:32]

GPIO 的控制寄存器地址空間

很多寄存器,但是一般的操作關注部分寄存器就可以了。

DATA_RO: 此寄存器使能軟件觀察 PIN 腳, 當 GPIO 被配置成輸出的時候, 這個寄存器的值會反應輸出的 PIN 腳情況。
DATA:此寄存器控制輸出到 GPIO 的值, 讀這個寄存器的值可以讀到最后一次寫入該寄存器的值。
MASK_DATA_LSW:位操作寄存器, 寫入 GPIO 16bit 其他沒有改變的位置保存原先的狀態
MASK_DATA_MSW:位操作寄存器, 寫入 GPIO 16bit 其他沒有改變的位置保存原先的狀態
DIRM:此寄存器控制輸出的開關, 當 DIRM[x]=0 時候, 禁止輸出
OEN: 輸出使能, 當 OEN[x]=0 的時候輸出關閉, PIN 腳處於三態
因此, 如果要讀 IO 狀態就得讀 DATA_RO 的值, 如果是對某一位進行操作就是寫
MASK_DATA_LSW/MASK_DATA_MSW
具體的相關參數請參考技術手冊 ug585-Zynq-7000-TRM.pdf

2、FPGA硬件創建。

  MIO的操作硬件創建比較簡單,外置只需添加MIO外置就可以了。

 

 然后編譯導出硬件到SDK軟件中。

3、SDK軟件

  首先就是要創建一個APP工程,這里就不做講解了。看一下軟件設計,就是純C開發了。

    

           

 #include "xgpiops.h"
 #include "sleep.h"
 int main()
 {
    static XGpioPs psGpioInstancePtr;
    XGpioPs_Config* GpioConfigPtr;
    int iPinNumber= 7; //板子的LED連接的是MIO7,這個根據板子的硬件設計做對應修改
    u32 uPinDirection = 0x1; //設置IO方向。1表示輸出,0表示輸入
    int xStatus;

  //--MIO的初始化
    GpioConfigPtr = XGpioPs_LookupConfig(XPAR_PS7_GPIO_0_DEVICE_ID);
    if(GpioConfigPtr == NULL)
    return XST_FAILURE;

    xStatus = XGpioPs_CfgInitialize(&psGpioInstancePtr,GpioConfigPtr, GpioConfigPtr->BaseAddr);
    if(XST_SUCCESS != xStatus)
    print(" PS GPIO INIT FAILED \n\r");
  //--MIO的輸入輸出操作
    XGpioPs_SetDirectionPin(&psGpioInstancePtr, iPinNumber,uPinDirection);//配置MIO輸出方向
    XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, iPinNumber,1);//配置MIO的第7位輸出

    //以下是庫函數的操作方式。
    /* while(1)
    {
      XGpioPs_WritePin(&psGpioInstancePtr, iPinNumber, 1);//點亮MIO的第7位輸出1
      usleep(500000); //us延時
      XGpioPs_WritePin(&psGpioInstancePtr, iPinNumber, 0);//熄滅MIO的第7位輸出0
      usleep(500000); //us延時
    }*/

 

    //以下是寄存器的操作方式。

    while(1)

    {
      XGpioPs_WriteReg(0xE000A000,0x00000000, 0xFF7FFFFF&0xFFFF0080);
      usleep(500000); //us延時
      XGpioPs_WriteReg(0xE000A000,0x00000000, 0xFF7FFFFF&0xFFFF0000);
      usleep(500000); //us延時
    }
  return 0;
}

 

 分析以下一些Xilinx的函數:

GpioConfigPtr = XGpioPs_LookupConfig(XPAR_PS7_GPIO_0_DEVICE_ID);  查找對應ID設備是否存在,如果不存在出錯,如果存在就可以做下一步的初始化。

可以查到

/* Definitions for peripheral PS7_GPIO_0 */
#define XPAR_PS7_GPIO_0_DEVICE_ID 0
#define XPAR_PS7_GPIO_0_BASEADDR 0xE000A000  //這個就是MIO的基地址
#define XPAR_PS7_GPIO_0_HIGHADDR 0xE000AFFF  //這個結束地址不需要管

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM