약 2분 소요
개요
지난 포스팅(AMBA AXI – GPIO IP 설계(2))에 이어서, Vitis IDE에서 작업을 이어가보자.
버튼을 누르면 해당 자리수의 LED가 켜지도록 구현할 것
소스 코드 작성
#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
#include <stddef.h>
#include "xparameters.h"
#include "sleep.h"
typedef struct
{
volatile uint32_t MODER;
volatile uint32_t IDR;
volatile uint32_t ODR;
} GPIO_TypeDef;
#define GPIOA_BASEADDR XPAR_GPIO_0_S00_AXI_BASEADDR
#define GPIOB_BASEADDR XPAR_GPIO_1_S00_AXI_BASEADDR
#define GPIOA ((GPIO_TypeDef *) GPIOA_BASEADDR)
#define GPIOB ((GPIO_TypeDef *) GPIOB_BASEADDR)
int main() {
GPIOA->MODER = 0x0f;
GPIOB->MODER = 0x00;
int btn_state = 0;
while(1) {
btn_state = GPIOB->IDR;
GPIOA->ODR = btn_state;
usleep(200000);
}
return 0;
}
- xparameters.h 헤더를 include 해야 메모리 맵의 주소를 가져올 수 있음
- XPAR_GPIO_0_S00_AXI_BASEADDR 주소 등이 매크로로 선언되어 있음
GPIOA->MODER = 0x0f;: GPIOA(LED) 4개에 대해서 모두 출력으로 선언GPIOB->MODER = 0x00;: GPIOB(BTN) 4개에 대해서 모두 입력으로 선언- 버튼의 IDR레지스터로부터 값을 읽어와서 ODR에 그대로 출력 후 0.2초 sleep
빌드 및 실행
빌드

상단의 망치 모양 또는 프로젝트 우클릭 후 Build Project 클릭
실행 및 실행 결과 확인



결론
각 자리수 별 버튼 입력에 맞게 LED 4개가 모두 ON/OFF되는 것을 확인