본문 바로가기
임베디드 개발/STM32 (ARM Cortex-M)

STM32 , printf 디버깅에 사용 & 변수 값 그래프로 출력하기 2편 ( SWV / ITM )

by eteo 2022. 6. 6.

 

이번엔 SWV (Serial Wire Viewer) / ITM (Instrumentation Trace Macrocell 를 통한 printf 사용방법에 대해 소개한다.

 

이전글 참고 : 2022.06.06 - [MCU/STM32 (ARM Cortex-M)] - STM32 , printf 디버깅에 사용하기 1편 ( UART 통신 )

 

 

 

1. CubeMX에서 클락설정 먼저 해준다.

 

 

 

 

2. 표준입출력 헤더파일을 포함한다.

/* USER CODE BEGIN Includes */
#include <stdio.h>
/* USER CODE END Includes */

 

 

 

 

 

3. _write 함수를 ITM에 리다이렉션하는 것으로 재정의 해준다.

/* USER CODE BEGIN PFP */
int _write(int file, char* p, int len){
	for(int i=0; i<len; i++){
		ITM_SendChar((*p++));
	}
	return len;
}
/* USER CODE END PFP */

 

 

 

 

 

 

 

4. 테스트를 위한 소스코드 작성

  /* USER CODE BEGIN 2 */
  uint8_t count=0;
  float f = 0.5;
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
	  printf("hello : %d %f\r\n", count, f);
	  count++;
	  f += 1.5;
	  HAL_Delay(1000);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */

 

 

 

 

 

 

 

 

5. 다음과 같이 Debug Configuration 설정 후 디버그한다.

Debugger 탭 클릭

 

Debug probe는 (ST-LINK GDB Server)여야 한다.

 

 

 

 

스크롤을 내려

 

Serial Wire Viewr (SWV) 의 Enable 을 체크하고,

 

Core Clock 은 Clock Configuration 의 값을 그대로 써준다.

 

내 경우엔 180MHz

 

 

 

 

6. Window - Show View - SWV - SWV ITM Data Console 과 SWV Data Trace Timeline Graph 창을 열고, 둘 중 아무거나 오른쪽에 있는 공구모양의 트레이스 설정 아이콘을 클릭한다.

 

 

 

 

 

 

 

 

7. 아래와 같이 SWV 세팅을 하고 Start Trace 버튼을 눌러 활성화 한 뒤 Resume키를 누른다.

 

 

Printf 출력만 확인 하려면 ITM 포트 0번만 열어도 된다.

 

그래프까지 확인하고 싶으면 그 위에 데이터 트레이스 Comparator에 활성화 체크하고 변수명을 넣는다.

아까 설정버튼 오른쪽에 있는 빨간 버튼을 누른 뒤 디버그 재개

 

 

 

아래와 같이 그래프를 통해 볼 수 있다.

각 변수에 대한 그래프 색깔이 다르고 y축의 값도 다르다.

 

 

 

출처 : https://www.youtube.com/watch?v=sPzQ5CniWtw