vitis helloworld.c
#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"
#include "xparameters.h"
#include "xil_io.h"
#include "sleep.h"
// IP 주소 정의 (my_platform에서 새로 생성된 주소 사용)
#if defined(XPAR_UART_IP_0_S00_AXI_BASEADDR)
#define UART_BASEADDR XPAR_UART_IP_0_S00_AXI_BASEADDR
#elif defined(XPAR_UART_IP_V1_0_0_S00_AXI_BASEADDR)
#define UART_BASEADDR XPAR_UART_IP_V1_0_0_S00_AXI_BASEADDR
#else
#define UART_BASEADDR XPAR_UART_IP_0_S00_AXI_BASEADDR
#endif
// 레지스터 오프셋
#define REG0_DIVISOR 0x00
#define REG1_STATUS 0x04
#define REG2_TX_DATA 0x08
#define REG3_RX_DATA 0x0C
// 상태 비트
#define STATUS_TX_FULL 0x01
#define STATUS_RX_EMPTY 0x02
int main()
{
init_platform();
xil_printf("\n\r=== FPGA UART Loopback Test (Final) ===\n\r");
// Baud Rate 설정 (9600)
Xil_Out32(UART_BASEADDR + REG0_DIVISOR, 651);
char send_char = 'A';
while(1) {
// [TX] 보내기
u32 status = Xil_In32(UART_BASEADDR + REG1_STATUS);
if ((status & STATUS_TX_FULL) == 0) {
Xil_Out32(UART_BASEADDR + REG2_TX_DATA, send_char);
xil_printf("TX: %c\n\r", send_char);
send_char++;
if(send_char > 'Z') send_char = 'A';
sleep(1);
}
// [RX] 받기
status = Xil_In32(UART_BASEADDR + REG1_STATUS);
if ((status & STATUS_RX_EMPTY) == 0) {
u32 recv_data = Xil_In32(UART_BASEADDR + REG3_RX_DATA);
xil_printf(" RX: %c\n\r", recv_data & 0xFF);
}
}
cleanup_platform();
return 0;
}


결과 영상
https://youtu.be/nhza9jAm08A
화면을 보면 TX: E 다음에 RX: D가 나오는 것처럼 약간의 '한 박자 지연'이 보입니다. 이는 지극히 정상입니다.
Loop 1: 'D'를 보냄 (TX: D) -> 1초 대기 -> RX 확인 (아직 도착 안 했거나 읽는 타이밍 차이로 못 읽음)
Loop 2: 'E'를 보냄 (TX: E) -> 1초 대기 -> RX 확인 (아까 보낸 'D'가 와있음!) -> RX: D 출력
Loop 3: 'F'를 보냄 (TX: F) -> ... -> 아까 보낸 'E' 수신 -> RX: E 출력
즉, 보낸 데이터가 정확하게 돌아오고 있으므로(Data Integrity), 기능상 100% 성공입니다.
IP 버전이 안맞아 맞추고, 변경한거 적용하는데 애먹음
지금 상황은 "부팅 담당(FSBL)은 3.1로 맞췄는데, 메인 CPU(Cortex-A9)는 아직 3.0을 쓰고 있어서" 서로 버전이 안 맞아 싸우는 것입니다
Explorer에서 my_platform -> zynq_fsbl -> zynq_fsbl_bsp -> system.mss 열기.
generic 드라이버 버전을 찾아서 3.0을 3.1로 고치고 저장(Ctrl+S).
PARAMETER DRIVER_NAME = generic
PARAMETER DRIVER_VER = 3.1
Explorer에서 my_platform -> ps7_cortexa9_0 -> standalone_ps7_cortexa9_0 -> bsp -> system.mss 열기.
여기도 3.0을 3.1로 고치고 저장(Ctrl+S).
4단계: 플랫폼 빌드