MicroBlaze에서 외부 4비트 버튼 입력을 AXI GPIO로 읽고, UART를 통해 실시간으로 출력
Diagram
사용 코드
#include <stdio.h> // 표준 입출력 함수
#include "platform.h" // 플랫폼 초기화 및 종료 함수
#include "xil_printf.h" // UART 출력용 함수 (xil_printf)
#include "xparameters.h" // 하드웨어 주소 및 파라미터 정의
#include "xgpio.h" // AXI GPIO 제어용 헤더
#include "sleep.h" // sleep 함수 (초 단위)
#define BTN_ADDR XPAR_XGPIO_0_BASEADDR // AXI GPIO의 기본 주소
#define BTN_CHANNEL 1 // 버튼이 연결된 채널 번호 (채널 1)
int main()
{
init_platform(); // 플랫폼 초기화 (UART, 캐시, 인터럽트 등)
print("Hello World\n\r");
print("Successfully ran Hello World application\n\r");
XGpio_Config *cfg_ptr; // GPIO 설정 구조체 포인터
XGpio btn_device; // 버튼용 GPIO 인스턴스
u16 data = 0; // 버튼 입력값 저장 변수 (최대 16비트)
// GPIO 디바이스 설정 정보를 가져옴
cfg_ptr = XGpio_LookupConfig(BTN_ADDR);
// GPIO 디바이스 초기화
XGpio_CfgInitialize(&btn_device, cfg_ptr, cfg_ptr->BaseAddress);
// 채널 1을 입력으로 설정 (0: 출력, 1: 입력 → 0b1111 = 4비트 모두 입력)
XGpio_SetDataDirection(&btn_device, BTN_CHANNEL, 0b1111);
while(1){
// 버튼 상태 읽기 (AXI GPIO에서 4비트 입력 읽음)
data = XGpio_DiscreteRead(&btn_device, BTN_CHANNEL);
// UART로 버튼 값 출력 (터미널에서 확인 가능)
xil_printf("Button : %d\n\r", data);
// 1초 대기 (버튼 polling 주기)
sleep(1);
}
cleanup_platform(); // 플랫폼 정리 (실제로는 도달하지 않음)
return 0;
}
동작 영상
결과
버튼비트 위치바이너리 값UART 출력 (%d)
btn[0]
bit 0
0001
1
btn[1]
bit 1
0010
2
btn[2]
bit 2
0100
4
btn[3]
bit 3
1000
8
누른 버튼 조합바이너리출력 값
btn[0] + btn[1]
0011
3
btn[2] + btn[3]
1100
12
btn[0] + btn[2]
0101
5
btn[1] + btn[3]
1010
10
모두 누름
1111
15
XGpio_DiscreteRead()는 각 버튼의 상태를 비트별로 읽어 정수로 반환되는 것을 확인 할 수 있다,
각 버튼은 2의 제곱수 단위 값(1, 2, 4, 8)을 가지고. 따라서 단일 버튼을 눌렀을 때 출력되는 값은 해당 버튼의 비트 위치에 따라 결정되는 것을 확인 할 수 있다.