[FreeRTOS] Hello World

 STM32 Cube IDE를 실행 하고 새 프로젝트를 만듭니다.

메뉴 > File > New > STM32 Project


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


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

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


IOC 파일 로딩


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를 추가 전과 후 입니다.

BeforeAfter


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 글자가 출력 됨을 확인 할 수 있습니다.


이 블로그의 인기 게시물