XGpio는 Xilinx에서 제공하는 GPIO(General Purpose Input/Output) 드라이버로, FPGA 기반 시스템에서 GPIO 장치를 제어하기 위한 API이다. 이 드라이버는 하드웨어 레지스터에 직접 접근하는 대신, 추상화된 함수를 통해 GPIO 핀의 입력/출력 방향 설정, 데이터 읽기, 데이터 쓰기 등이 가능하도록 한다.
XGpio hled;
XGpio_Initialize(&hled, XPAR_GPIO_0_DEVICE_ID);
XGpio_SetDataDirection(&hled, CHANNEL_1, 0X00);
XGpio_DiscreteWrite(&hled, CHANNEL_1, (1 << 0));
XGpio 함수를 사용하기 위해서는 우선 XGpio 핸들러를 선언해야 한다. XGpio는 Xilinx에서 제공하는 구조체(structure) 타입의 핸들러이다. 이 핸들러는 GPIO 장치의 상태와 설정을 관리하며, 관련 함수(XGpio_Initialize, XGpio_SetDataDirection 등)에서 이 핸들러를 참조하여 동작을 수행하게 된다.
#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"
#include "xparameters.h"
#include "xgpio.h"
#define LED_BASE_ADDR XPAR_AXI_GPIO_0_BASEADDR
#define LED_DATA_REG *(volatile uint32_t *)(LED_BASE_ADDR + 0X00)
#define LED_CTRL_REG *(volatile uint32_t *)(LED_BASE_ADDR + 0X04)
#define BTN_BASE_ADDR XPAR_AXI_GPIO_1_BASEADDR
#define BTN_DATA_REG *(volatile uint32_t *)(BTN_BASE_ADDR + 0X00)
#define BTN_CTRL_REG *(volatile uint32_t *)(BTN_BASE_ADDR + 0X04)
#define CHANNEL_1 1
#define CHANNEL_2 2
XGpio hled;
XGpio hbtn;
int main()
{
init_platform();
print("Hello World\n\r");
print("Successfully ran Hello World application");
XGpio_Initialize(&hled, XPAR_GPIO_0_DEVICE_ID);
XGpio_Initialize(&hbtn, XPAR_GPIO_1_DEVICE_ID);
XGpio_SetDataDirection(&hled, CHANNEL_1, 0X00);
XGpio_SetDataDirection(&hbtn, CHANNEL_1, 0X0f);
while(1){
if(XGpio_DiscreteRead(&hbtn, CHANNEL_1) & (1 << 0)){
XGpio_DiscreteWrite(&hled, CHANNEL_1, (1 << 0));
} else if(XGpio_DiscreteRead(&hbtn, CHANNEL_1) & (1 << 1)){
XGpio_DiscreteWrite(&hled, CHANNEL_1, (1 << 1));
} else if(XGpio_DiscreteRead(&hbtn, CHANNEL_1) & (1 << 2)){
XGpio_DiscreteWrite(&hled, CHANNEL_1, (1 << 2));
} else if(XGpio_DiscreteRead(&hbtn, CHANNEL_1) & (1 << 3)){
XGpio_DiscreteWrite(&hled, CHANNEL_1, (1 << 3));
}
}
return 0;
}
- XGpio_Initialize:
GPIO 장치를 초기화하고, 특정 디바이스 ID에 연결된 인스턴스를 설정. - XGpio_SetDataDirection:
GPIO 핀의 방향을 설정. (0x00: 출력, 0x0F: 입력 등) - XGpio_DiscreteRead:
GPIO 핀에서 데이터를 읽는다. - XGpio_DiscreteWrite:
GPIO 핀에 데이터를 쓴다.
XGpio 함수를 사용하지 않고, 아래와 같이 레지스터에 직접 접근할 수도 있다.
#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"
#include "xparameters.h"
#define LED_BASE_ADDR XPAR_AXI_GPIO_0_BASEADDR
#define LED_DATA_REG *(volatile uint32_t *)(LED_BASE_ADDR + 0x00) // 데이터 레지스터
#define LED_CTRL_REG *(volatile uint32_t *)(LED_BASE_ADDR + 0x04) // 제어 레지스터
#define BTN_BASE_ADDR XPAR_AXI_GPIO_1_BASEADDR
#define BTN_DATA_REG *(volatile uint32_t *)(BTN_BASE_ADDR + 0x00) // 데이터 레지스터
#define BTN_CTRL_REG *(volatile uint32_t *)(BTN_BASE_ADDR + 0x04) // 제어 레지스터
int main()
{
init_platform();
print("Hello World\n\r");
print("Successfully ran Hello World application");
// LED를 출력으로 설정 (0x00: 출력, 0x0F: 입력)
LED_CTRL_REG = 0x00;
// 버튼을 입력으로 설정
BTN_CTRL_REG = 0x0F;
while(1) {
// 버튼 상태 읽기 및 LED 제어
if (BTN_DATA_REG & (1 << 0)) {
LED_DATA_REG = (1 << 0); // LED 0번 켜기
} else if (BTN_DATA_REG & (1 << 1)) {
LED_DATA_REG = (1 << 1); // LED 1번 켜기
} else if (BTN_DATA_REG & (1 << 2)) {
LED_DATA_REG = (1 << 2); // LED 2번 켜기
} else if (BTN_DATA_REG & (1 << 3)) {
LED_DATA_REG = (1 << 3); // LED 3번 켜기
}
}
return 0;
}
'AMBA BUS > Vitis' 카테고리의 다른 글
Vitis - 06. FND 제어 (0) | 2025.03.12 |
---|---|
Vitis - 05. Common Code 작성 (0) | 2025.03.12 |
Vitis - 04. Driver Code 작성 (0) | 2025.03.10 |
Vitis - 03. 사용자 IP와 AXI4-Lite Interface 결합 (0) | 2025.03.10 |
Vitis - 01. Microblaze Platform 설정 (0) | 2025.03.07 |