JTAG로 하드웨어 연결을 검사하고 임베디드 코드를 디버깅하는 방법
JTAG의 IEEE 1149.1 표준 구조와 TAP, Boundary Scan 동작을 정리하고 임베디드 디버깅·플래시 프로그래밍·PCB 테스트 활용을 다룬다.
2026-08-14 · 최초 발행 2026-01-02
보이지 않는 핀을 검사하는 인터페이스
장치가 소형화될수록 IC 핀 밀도는 높아지고 내부 핀에 직접 접근하기는 어려워진다. 테스트 포인트도 줄어들기 때문에 회로 기판을 조립한 뒤 연결 상태를 검증하거나 실행 중인 하드웨어를 디버깅하는 일이 복잡해진다.
JTAG(Joint Test Action Group)은 이런 상황에서 MCU에 연결된 시리얼 포트, LCD, 플래시 메모리, 센서 등의 핀 신호를 확인하기 위한 표준 인터페이스다. IEEE 1149.1 표준과 Boundary Scan 기술을 기반으로 하며, 외부에서 내부 회로의 상태를 확인하거나 제어할 수 있다. 임베디드 시스템에서는 하드웨어 디버거 연결과 플래시 메모리 다운로드에 널리 쓰인다.
소형화 문제에서 시작된 Boundary Scan
JTAG은 IC 핀 밀도 증가, 내부 핀 접근의 어려움, 테스트 포인트 감소라는 문제에 대응하기 위해 등장했다. JTAG 그룹은 1985년에 결성됐고, 1990년에 IEEE 1149.1 표준이 제정됐다. Boundary Scan 기술은 이후 산업 표준으로 확산됐다.
이 인터페이스가 맡는 일은 크게 세 방향이다.
- 회로 기판 조립 후 칩 간 연결을 확인하고 단락이나 개방 회로를 검출한다.
- 프로그램 실행 중 레지스터와 메모리를 읽고 쓰며, 브레이크포인트와 단계 실행으로 상태를 추적한다.
- 플래시 메모리에 펌웨어를 기록하고 FPGA/CPLD 설정을 다운로드하거나 업데이트한다.
포트와 칩 내부의 테스트 경로
JTAG의 기본 포트는 TDI, TDO, TCK, TMS로 구성된다. TDI(Test Data In)는 명령과 데이터를 직렬로 입력하고, TDO(Test Data Out)는 테스트 결과를 직렬로 내보낸다. TCK(Test Clock)는 동기화 신호를 제공하며, TMS(Test Mode Select)는 TAP 상태 머신의 모드를 선택한다. TRST(Test Reset)는 TAP 초기화에 쓰는 선택적 핀이다.
칩 내부에서는 TAP(Test Access Port)이 JTAG 인터페이스를 구현한다. TAP Controller는 TMS 신호에 따라 상태를 바꾸는 상태 머신으로, 16개 상태를 통해 테스트 모드를 제어한다. 초기화에는 Test-Logic-Reset, 대기에는 Run-Test/Idle, 데이터 레지스터 이동에는 Shift-DR, 명령어 레지스터 이동에는 Shift-IR 상태가 사용된다.
각 I/O 핀에 연결된 Boundary Scan Cell은 핀 상태를 캡처하거나 구동한다. 정상 모드에서는 핀이 칩 내부 로직에 연결되고, 테스트 모드에서는 Boundary Scan Cell이 핀을 제어한다. 이 셀들은 직렬 체인으로 연결된다.
개발 중에는 실행 상태를 멈추고 들여다본다
하드웨어 디버거를 연결하면 프로그램을 실행·정지·단계 실행하고 브레이크포인트나 리셋을 설정할 수 있다. CPU 레지스터, 메모리, 프로그램 카운터(PC)를 읽고 쓰는 작업도 가능하다. 명령어 실행 추적, 데이터 접근 모니터링, 프로파일링도 이 경로에서 수행한다.
소스 수준 디버깅과 하드웨어 브레이크포인트를 사용할 수 있으며, 프로그램을 변경하지 않는 Non-intrusive 방식이라는 점이 특징이다.
플래시 프로그래밍에서는 JTAG로 MCU에 접근한 뒤 플래시 컨트롤러를 제어하고, 데이터를 블록 단위로 기록한 다음 검증한다. MCU 플래시 메모리 기록뿐 아니라 FPGA/CPLD 설정 다운로드와 EEPROM 프로그래밍에도 활용된다. 별도 프로그래머 없이 개발 보드에서 직접 다운로드할 수 있는 In-System Programming(ISP) 방식이다.
PCB 연결 검증에도 쓰인다
Boundary Scan 테스트는 PCB 위 칩 사이의 연결을 점검한다. Boundary Scan Cell에 테스트 패턴을 입력해 I/O 핀으로 출력하고, 다음 칩의 Boundary Scan Cell에서 이를 캡처한 뒤 기대값과 비교한다. 이 과정으로 단락(Short)과 개방(Open) 회로를 검출할 수 있다.
제조 테스트와 품질 검증, 고장 진단이 대표적인 활용처다. 필드 서비스에서는 고장 진단, 원격 디버깅, 펌웨어 업데이트에도 연결된다.
개발 환경에서 만나는 디버거와 도구
J-Link(Segger)는 ARM 프로세서를 지원하며 높은 성능과 다양한 IDE 지원을 제공한다. ST-Link(STMicroelectronics)는 STM32 마이크로컨트롤러에서 쓰이며 저가형 디버거와 플래시 다운로드 용도로 활용된다. OpenOCD는 다양한 하드웨어와 GDB 인터페이스를 지원하는 오픈 소스 디버거다.
IDE에서도 JTAG 디버거를 연결할 수 있다.
- Eclipse + GDB는 오픈 소스 개발 환경에서 JTAG 디버거를 연동해 소스 수준 디버깅을 제공한다.
- Keil MDK는 ARM 개발 환경으로 ULINK 디버거와 상용 툴을 제공한다.
- IAR Embedded Workbench는 다양한 MCU와 I-jet 디버거를 지원하며 고성능 디버깅에 사용된다.
MCU, FPGA, 제조 현장에서의 활용
MCU 개발 보드에서는 코드 다운로드, 실시간 디버깅, 변수 모니터링에 JTAG를 쓴다. Arduino, Raspberry Pi Pico, STM32, ESP32 개발 보드에는 JTAG 헤더가 포함될 수 있다.
FPGA/CPLD 개발에서는 Xilinx와 Altera(Intel) 장치에 JTAG로 설정을 다운로드하고 Bitstream을 프로그래밍한다. HDL 코드 작성(Verilog, VHDL) 후 합성(Synthesis), 배치 및 배선(Place & Route)을 거쳐 FPGA에 다운로드하고 테스트와 디버깅을 진행하는 흐름이다.
제조 이후에는 Boundary Scan으로 PCB 연결을 확인하고 불량을 검출해 수율 향상에 활용한다.
설계할 때 함께 봐야 할 제약
JTAG는 IEEE 1149.1 표준을 기반으로 여러 칩을 지원하고 호환성을 제공한다. 프로그램 변경 없이 실시간 디버깅을 수행할 수 있으며, 테스트·디버깅·프로그래밍을 하나의 인터페이스로 처리해 비용을 줄일 수 있다. 소형화된 장치에서도 내부 핀 상태에 접근할 수 있다는 점도 장점이다.
반면 4-5개 핀이 추가로 필요해 소형 패키지에서는 부담이 될 수 있다. 직렬 통신이므로 데이터 전송 속도는 수십 kbps ~ 수 Mbps이며, 대용량 다운로드에는 시간이 걸린다. JTAG 포트를 통해 펌웨어를 추출할 수 있어 역공학 위험도 존재하므로 제품에서는 비활성화를 권장한다. TAP 추가에 따른 칩 면적 증가와 디버거 하드웨어 비용도 고려 대상이다.
핀 수와 목적에 따라 고르는 대안
ARM Cortex-M 전용 SWD(Serial Wire Debug)는 SWDIO와 SWCLK의 2핀 인터페이스를 사용하며, JTAG보다 적은 핀과 더 빠른 속도를 제공한다.
cJTAG(Compact JTAG)는 IEEE 1149.7 표준으로, 2핀 또는 4핀 모드를 제공하면서 JTAG 호환성을 유지해 소형 장치에 적합하다.
SPI나 UART 디버깅은 소프트웨어 디버깅과 로그 출력에 사용할 수 있는 간단한 인터페이스지만 성능에는 제한이 있다.