#include <stdio.h>
#include "xgpio.h"
#include "xgpiops.h"
int main()
{
static XGpio GpioInstance_ptr;
static XGpioPs psGpioInstance_ptr;
XGpioPs_Config *GpioConfigPtr;
u8 count = 0;
int xStatus;
int BtnPinDirection = 0, BtnPinNumber = 50;
int Readstatus = 0, OldReadstatus = 0;
xStatus = XGpio_Initialize(&GpioInstance_ptr, XPAR_AXI_GPIO_0_DEVICE_ID);
if (XST_SUCCESS != xStatus)
print("GPIO INIT FAILDED \n\r");
// AXI GPIO Set
XGpio_SetDataDirection(&GpioInstance_ptr,1,0);
// PS GPIO Initialization
GpioConfigPtr = XGpioPs_LookupConfig (XPAR_PS7_GPIO_0_DEVICE_ID);
if (GpioConfigPtr == NULL)
return XST_FAILURE;
xStatus = XGpioPs_CfgInitialize(&psGpioInstance_ptr, GpioConfigPtr, GpioConfigPtr->BaseAddr);
if (XST_SUCCESS != xStatus)
print("PS GPIO INIT FAILED \n\r");
XGpioPs_SetDirectionPin(&psGpioInstance_ptr,BtnPinNumber,BtnPinDirection);
XGpioPs_SetOutputEnablePin(&psGpioInstance_ptr,BtnPinNumber,0);
while(1)
{
Readstatus = XGpioPs_ReadPin(&psGpioInstance_ptr,BtnPinNumber);
if((Readstatus == 1) && (OldReadstatus == 0))
{
print("BTN PUSH Button pressed \n\r");
count++;
XGpio_DiscreteWrite(&GpioInstance_ptr,1,count);
}
OldReadstatus = Readstatus;
}
return 0;
}
Xilinx의 GPIO (General Purpose Input/Output) 드라이버를 사용하여 AXI GPIO와 PS GPIO를 초기화하고 제어하는 예제입니다.
XGpio
와 XGpioPs
타입의 두 개의 GPIO 인스턴스를 초기화합니다. 이들은 각각 AXI GPIO와 PS GPIO를 나타냅니다.
XGpio_Initialize
함수를 사용하여 AXI GPIO를 초기화합니다. 초기화가 실패하면 에러 메시지를 출력합니다.
XGpio_SetDataDirection
함수를 사용하여 AXI GPIO의 데이터 방향을 출력으로 설정합니다.
XGpioPs_LookupConfig
함수를 사용하여 PS GPIO의 설정을 찾습니다. 설정을 찾지 못하면 함수는 실패를 반환합니다.
XGpioPs_CfgInitialize
함수를 사용하여 PS GPIO를 초기화합니다. 초기화가 실패하면 에러 메시지를 출력합니다.
XGpioPs_SetDirectionPin
과 XGpioPs_SetOutputEnablePin
함수를 사용하여 특정 핀의 방향과 출력 가능 상태를 설정합니다.
무한 루프 내에서, XGpioPs_ReadPin
함수를 사용하여 특정 핀의 상태를 읽습니다. 이전 상태가 0이고 현재 상태가 1이면, 즉 버튼이 눌렸으면, "BTN PUSH Button pressed" 메시지를 출력하고 카운트를 증가시킵니다. 그리고 XGpio_DiscreteWrite
함수를 사용하여 AXI GPIO에 카운트 값을 씁니다.
이 코드는 FPGA 보드의 GPIO를 제어하여 버튼 입력을 감지하고, 해당 입력에 따라 GPIO의 출력을 변경하는 기능을 수행합니다.
xgpio.h
: GPIO PL (LED) 사용을 위한 header file; AXI GPIO 제어u8
: unsigned 8-bit integer
XGpio GpioInstance_ptr
: 이 변수는 AXI GPIO 인스턴스를 나타냅니다.
XGpio_Initialize
함수를 통해 초기화되며, XGpio_SetDataDirection
및 XGpio_DiscreteWrite
함수에서 사용됩니다.
XGpio_Initialize()
함수Xilinx FPGA 보드의 AXI GPIO 인스턴스를 초기화하는 데 사용됩니다. 이 함수는 두 개의 매개변수를 받습니다.
XGpio *InstancePtr
: 초기화할 GPIO 인스턴스에 대한 포인터입니다.u16 DeviceId
: 초기화할 GPIO 디바이스의 ID입니다.이 함수는 성공적으로 GPIO 인스턴스를 초기화하면 XST_SUCCESS를 반환하고, 실패하면 에러 코드를 반환합니다. 이 함수를 호출한 후에는 GPIO 인스턴스를 사용하여 GPIO 핀의 방향을 설정하거나 핀의 상태를 읽고 쓸 수 있습니다.
XGpio_SetDataDirection()
함수Xilinx FPGA 보드의 AXI GPIO 인스턴스에서 특정 채널의 데이터 방향을 설정하는 데 사용됩니다. 이 함수는 세 개의 매개변수를 받습니다.
XGpio *InstancePtr
: 데이터 방향을 설정할 GPIO 인스턴스에 대한 포인터입니다.
unsigned Channel
: 데이터 방향을 설정할 채널 번호입니다. 대부분의 경우 1을 사용합니다.
u32 DirectionMask
: 설정할 데이터 방향을 나타내는 비트 마스크입니다. 0은 출력, 1은 입력을 나타냅니다.
이 함수를 호출하면 지정된 채널의 GPIO 핀들의 데이터 방향이 설정됩니다. 예를 들어, XGpio_SetDataDirection(&GpioInstance_ptr, 1, 0)
을 호출하면 GpioInstance_ptr
인스턴스의 첫 번째 채널의 모든 GPIO 핀들이 출력으로 설정됩니다.
XGpio_DiscreteWrite()
함수Xilinx FPGA 보드의 AXI GPIO 인스턴스에서 특정 채널에 대해 이산 값(Discrete Value)을 쓰는 데 사용됩니다. 이 함수는 세 개의 매개변수를 받습니다.
XGpio *InstancePtr
: 값을 쓸 GPIO 인스턴스에 대한 포인터입니다.
unsigned Channel
: 값을 쓸 채널 번호입니다. 대부분의 경우 1을 사용합니다.
u32 Data
: 쓸 값을 나타냅니다.
이 함수를 호출하면 지정된 채널의 GPIO 핀들에 값이 쓰여집니다. 예를 들어, XGpio_DiscreteWrite(&GpioInstance_ptr, 1, count)
를 호출하면 GpioInstance_ptr
인스턴스의 첫 번째 채널의 모든 GPIO 핀들에 count 값이 쓰여집니다. 이 함수는 주로 GPIO 핀들을 통해 외부 장치에 신호를 보내는 데 사용됩니다.