[FreeRTOS] Hello World
STM32 Cube IDE를 실행 하고 새 프로젝트를 만듭니다.
메뉴 > File > New > STM32 Project

타겟 보드의 파트넘버를 입력하고 아이템을 선택한 뒤 Next 버튼을 클릭 합니다.

프로젝트 이름을 입력하고, Finish를 클릭 합니다.

Perspective Open 팝업창에서는 Yes를 눌러 줍시다.


IOC 파일이 오픈되면, Middleware > FREERTOS 를 클릭하고 CMSIS_V1 을 선택 한 뒤,
Ctrl + S 를 눌러서 저장을 합니다.
![]() | ![]() |
Code Generation 과 Perspective 를 묻는 팝업에 'Yes'를 클릭하여 진행 해 줍니다.
![]() | ![]() |

Core/Src/main.c 파일을 열어서 <stdio.h> 헤더를 include 해 주고, printf 함수를 호출 해 봅니다.

프로젝트에서 우클릭을 누르고, 빌드를 시작하고 Run을 해 봅시다.

하지만, 아무것도 나타나지 않습니다.
HelloWorld.ioc 파일을 다시 열어서 USART2를 클릭하고, Ctrl + S 를 누르고 Code Generation을 해 줍니다.

USART2를 추가 전과 후 입니다.
Before | After |
![]() | ![]() |
main.c 파일에 다음과 같이 UART 관련 변수와 함수가 추가 된 것을 확인 할 수 있습니다.

그럼 다시 빌드를 하고 실행을 해 보지만, 안나옵니다...
ioc 파일에 변경이 발생하면, 소스코드가 리셋이 됩니다.
다시 <stdio.h> 헤더파일도 추가하고 printf 함수 호출도 추가하고 빌드하고 실행해 봅시다.

어? 그래도 안나오네.. 도대체 뭐가 문제지?
이유는 printf 함수를 호출하게 되면 함수 내부에서 syscalls.c 의 _write 함수를 호출하게 되는데,
__io_putchar 함수에서 문자를 UART인터페이스를 사용하여 전송하도록 재 정의가 되어 있지 않기 때문입니다.
Core/Src/syscalls.c |
![]() |
main.c 파일에 __io_putchar 함수를 재 정의 해줍시다.
Private user code 주석의 USER CODE BEGIN 과 USER CODE END 사이에 코드를 넣어 줍니다.
Core/Src/main.c |
![]() |
int __io_putchar(int ch)
{
if ( ch == '\n' )
{
HAL_UART_Transmit(&huart2, (uint8_t*)&"\r", 1, HAL_MAX_DELAY);
}
HAL_UART_Transmit(&huart2, (uint8_t*)&ch, 1, HAL_MAX_DELAY);
return ch;
}
다시 빌드하고 실행을 해 보면, 시리얼 포트를 통해 Hello World 글자가 출력 됨을 확인 할 수 있습니다.
