게시글 상세
목록으로STM32 디버거에서 변수 출력 방법
조회수: 114
작성자: june9152
등록일: 2025-08-23 04:11
수정일: 2025-12-20 19:46
STM32 디버거에서 변수 출력 방법
마이크로컨트롤러 디버깅을 위한 종합 가이드
개요
STM32 마이크로컨트롤러를 디버깅할 때 변수 값을 확인하는 것은 필수적인 과정입니다. 본 문서에서는 효율적이고 실용적인 변수 출력 방법들을 체계적으로 소개합니다.
1. SWD/JTAG 디버거를 활용한 방법
방법 A: 실시간 변수 감시 (Live Variable Watch)
- IDE(STM32CubeIDE, Keil, IAR)에서 디버그 세션 시작
- "Expressions" 또는 "Watch" 창 열기
- 감시할 변수명 입력
- 디버깅 중 실시간으로 값 업데이트 확인
방법 B: 중단점을 활용한 변수 검사
- 변수 확인이 필요한 지점에 중단점(breakpoint) 설정
- 디버거 실행 (F5)
- 중단점에서 변수에 마우스 오버하거나 "Variables" 창에서 확인
방법 C: 메모리 브라우저 활용
- "Memory Browser" 창 열기
- 변수 주소 입력 (&variable 형식)
- 원시 메모리 내용 확인
2. 시리얼 출력 (UART/ITM/SWO) 방법
방법 A: UART 디버그 출력
UART를 통한 printf 함수 리다이렉션:
#include // printf를 UART로 리다이렉션 (main() 함수 이전에 추가) int _write(int fd, char *ptr, int len) { HAL_UART_Transmit(&huart1, (uint8_t*)ptr, len, HAL_MAX_DELAY); return len; } // 사용 예시 printf("변수 값: %d\n", my_var);
주의사항: UART 초기화 필요 (예: huart1)
방법 B: ITM (Instrumentation Trace Macrocell) - SWO 핀 활용
- STM32CubeMX에서 "Debug" 설정에서 ITM 활성화
- ITM을 통한 printf 사용:
#include "stm32f4xx_hal.h" void ITM_SendChar(uint32_t ch) { ITM->PORT[0].u32 = ch; } // 사용 예시 (ITM 설정 시) printf("값: %d\n", my_var);
출력은 SWV ITM Data Console(STM32CubeIDE) 또는 Keil의 Debug (printf) Viewer에서 확인
3. Segger RTT (Real-Time Transfer) 방법
UART보다 빠른 대안:
- 프로젝트에 Segger RTT 라이브러리 추가
- 다음과 같이 사용:
#include "SEGGER_RTT.h" SEGGER_RTT_printf(0, "변수: %d\n", my_var);
J-Link RTT Viewer 또는 STM32CubeIDE Terminal에서 출력 모니터링
4. ST-Link GDB 서버 (명령행 디버깅)
OpenOCD/GDB 사용 시:
# GDB에서: (gdb) monitor reset halt (gdb) print my_var (gdb) watch my_var # 변수 변경 시 중단
방법별 비교표
| 방법 | 속도 | 실시간성 | 설정 복잡도 | 추천 용도 |
|---|---|---|---|---|
| IDE 변수 감시 | 보통 | 높음 | 낮음 | 중단점 디버깅 |
| UART 출력 | 느림 | 보통 | 보통 | 일반적인 로깅 |
| ITM/SWO | 빠름 | 높음 | 보통 | 실시간 모니터링 |
| Segger RTT | 매우 빠름 | 높음 | 높음 | 고성능 로깅 |
권장사항
- 실시간 모니터링: ITM(SWO) 또는 Segger RTT 사용
- 중단점 디버깅: IDE Watch Expressions 활용
- 저부하 로깅: UART 대신 SWO 또는 RTT 선택
- 성능 최적화: 디버깅 코드는 릴리즈 빌드에서 제거 권장
본 문서는 STM32 개발 효율성 향상을 위한 기술 가이드입니다.