STM32/간단한팁

STM32 NUCLEO BOARD printf 사용하기

원원 2025. 1. 20. 00:38

안녕하세요.
오늘은 stm32에서 printf 함수를 사용해보겠습니다.

사용할 보드는 NUCLEO-F103RB입니다.
ST LINK가 Virtual com port를 지원하고 회로도를보면 STM32F103RB의 UART2에 연결되어있습니다.
그래서 별도의 usb to uart없이도 pc와 uart통신이 가능합니다.

그래서 그런지 NUCLEO-F103RB 프로젝트를 만들면 기본적으로 UART2가 활성화되어있습니다.
프로젝트를 생성하고나서 HAL_UART_Transmit함수를 이용해서 TX가 가능합니다. 
해당 방법을 사용하는 데는 문제는 없지만 불편하므로 printf가 이용하기 편리하므로 printf를 이용해 보겠습니다.

printf를 이용해보겠습니다. 경고가 발생합니다. printf는 <stdio.h>에 선언되어있는데 <stdio.h>를 include하지않아서 경고가 발생했습니다.

 

stdio.h를 include하고 빌드를하면 워닝은 발생하지않는데, "UART TEST"가 출력되지않습니다.
printf 함수에서 uart2로 출력하도록 알려줘야합니다.

해당 C라이브러리에서는 printf가 _write함수를 호출하게 되어있습니다. 
디버깅을 해보면 _write함수로 들어오면 ptr포인터에 문자열이 저장되어있고 __io_putchar함수로 문자하나씩 전달해주고있습니다. __io_putchar는 weak로 정의되어있으므로 이 곳에 uart2로 출력하도록 해주면 됩니다.
extern int __io_putchar(int ch) __attribute__((weak));


__io_putchar 함수에 uart2 출력을 넣으면 정상적으로 동작하는 것을 볼 수 있습니다.


결론적으로 NUCLEO 프로젝트를 만들고나서 printf를 사용하는 방법은 두단계입니다.
1. printf가 들어있는 헤더파일 include
#include <stdio.h>

2. __io_putchar 함수 정의
int __io_putchar(int ch)
{
  HAL_UART_Transmit(&huart2, (uint8_t*)&ch, 1, HAL_MAX_DELAY);
  return ch;
}