환경 구축이란
개발 환경 구축이 완료되었다는 것은 두 가지 조건이 충족된 상태를 의미한다.
- 컴파일 후 Hello World가 출력되는 상황
- 디버깅이 가능한 상황 (단축키 설정, UI 설정 포함)
환경 구축은 원래 오래 걸린다. 임베디드는 특히 유난히 오래 걸리는 편이다. "Hello World를 출력하면 80%는 되었다"고 보는 개발자도 있을 정도다. 임베디드에서의 "Hello World"는 GPIO를 제어하는 것이라고 할 수 있다.
IDE란
IDE(Integrated Development Environment, 통합 개발 환경)는 개발에 필요한 도구들을 하나로 묶어놓은 프로그램이다. 모든 상황에서 IDE를 사용하는 것은 아니지만, 이 강의에서는 IDE 환경에서 개발을 진행한다.
IDE는 보통 다음 네 가지 요소로 구성된다.

- 소스코드 편집기: 코드를 작성하는 공간
- 컴파일러: 작성한 코드를 기계어로 변환
- 빌드 자동화: 컴파일 과정을 자동화 (C의 Makefile, 안드로이드의 Gradle 등)
- 디버거: 코드 실행 중 오류를 추적
모든 IDE에 위 네 가지가 전부 포함되어 있는 것은 아니다. 자신이 사용하는 IDE에 어떤 것이 빠져 있는지 인지하고 대처할 수 있는 능력이 개발자에게 필요하다.
각 언어와 플랫폼에는 대표적인 IDE가 있다. Java는 이클립스, 윈도우 개발은 비주얼 스튜디오가 대표적이다. 어떤 언어나 프레임워크에 적합한 IDE를 찾는 것도 개발자의 능력이다.
STM32CubeIDE를 선택한 이유
STM32CubeIDE는 이클립스 기반으로 만들어진 IDE다. 이클립스는 Java 기반의 오픈소스 IDE로, 소스가 공개되어 있어 많은 IDE가 이클립스를 기반으로 만들어졌다.
강사가 이 IDE를 선택한 이유는 다음과 같다.
- 무료
- 직접 사용해본 경험이 있음
- ST 제품은 세팅만으로 기본 코드가 자동 생성되어 편리
- 기존에 사용하던 IAR Embedded Workbench는 유료이고, 위 3번의 장점이 없음
STM32CubeIDE 버전 안내
강의에서는 1.17 버전을 사용한다. 그러나 2026년 3월 현재 최신 버전은 2.1.1이며, 강의 시점과 버전 차이가 있어서 그대로 따라가면 문제가 생길 수 있다. 아래에 버전별 이슈를 정리한다.
이 내용은 강의에 포함되지 않은, 내가 직접 겪거나 조사한 내용이다. 2026년 초 기준으로 이 강의를 수강하는 사람에게 도움이 되었으면 한다.
1.19 미만 버전의 이슈
1.17 등 1.19보다 낮은 버전에서는 프로젝트 생성 시 Targeted Project Type에서 STM32Cube를 선택하지 못하는 이슈가 있다. 강의는 STM32Cube를 통해 진행되기 때문에 이 버전에서는 강의를 따라갈 수 없을 가능성이 있다.

참고 링크:
- https://community.st.com/t5/stm32cubeide-mcus/stm32-targeted-project-type-is-empty-and-its-not-generating-ioc/td-p/819652/page/5
- https://community.st.com/t5/stm32cubeide-mcus/targeted-project-type-empty/td-p/825003
1.19 버전 (강사 권장)
강사가 1.19 버전까지 테스트를 완료했고, 이 버전으로 업데이트해서 강의를 진행하도록 안내했다. IDE와 MX가 하나의 프로그램에 통합되어 있어 강의를 그대로 따라가기에 가장 편한 선택이다.

2.0.0 이상 버전 (2.1.1 포함)
2.0.0 버전부터는 기존에 IDE 안에 통합되어 있던 STM32CubeMX가 별도 프로그램으로 분리되었다. 즉, 강의에서 IDE 하나만 설치하면 되었던 것과 달리 STM32CubeIDE와 STM32CubeMX 두 프로그램을 각각 다운로드해서 설치해야 한다.

참고 링크:
- https://community.st.com/t5/stm32cubeide-mcus/ide-version-2-0-0-why-remove-mx/td-p/862691
- https://www.reddit.com/r/embedded/comments/1p2fnzq/stm32cubeide_v200_whats_new_stm32cubemx_is_now_a/
정리하면, 강의를 가장 수월하게 따라가려면 1.19 버전을 사용하는 것이 좋다. 최신 버전인 2.1.1을 사용하고 싶다면 STM32CubeMX를 별도로 설치해야 하며, 강의와 화면 구성이 다를 수 있음을 감안해야 한다.
2.1.1 버전에서 프로젝트 생성하기
2.0.0 이상 버전에서는 STM32CubeMX가 IDE에서 분리되었기 때문에 프로젝트 생성 과정이 다르다. 아래는 2.1.1 버전 기준의 프로젝트 생성 방법이다. 1.19 버전을 사용하는 경우 이 섹션을 건너뛰어도 된다.
1) STM32CubeMX에서 프로젝트 시작
STM32CubeIDE가 아닌 STM32CubeMX를 먼저 실행한다. 홈 화면에서 "Start My project from MCU" → "ACCESS TO MCU SELECTOR"를 선택한다.

2) MCU 선택
MCU/MPU Selector에서 강의에서 사용하는 칩을 검색하여 선택한 후, "Start Project"를 클릭한다.

3) 핀 설정 화면 확인
칩을 선택하면 Pinout & Configuration 화면이 나타난다. 이 화면은 1.19 버전에서 .ioc 파일을 열었을 때와 동일한 화면이다. 여기서 GPIO 설정 등을 진행할 수 있다.

4) Project Manager에서 코드 생성
상단 탭에서 "Project Manager"를 선택한다. Project Name, Project Location을 설정하고, Toolchain / IDE 항목을 확인한 후 우측 상단의 "GENERATE CODE"를 클릭한다.

5) 생성된 프로젝트를 STM32CubeIDE에서 열기
코드가 생성되면 지정한 Project Location에 1.19 버전과 동일한 폴더 구조로 파일이 생성된다. Core, Drivers 폴더와 함께 .project, .cproject, .ioc 등의 파일을 확인할 수 있다.

이 중 .project 파일을 STM32CubeIDE로 열면 1.19 버전에서 프로젝트를 생성한 것과 동일한 환경에서 작업할 수 있다. 이후의 강의 내용은 버전에 관계없이 동일하게 따라갈 수 있다.
프로젝트 생성 (1.19 기준)
이후 내용은 1.19 버전을 기준으로 설명한다. 1.19 버전 사용자는 강의를 따라 똑같이 프로젝트를 생성하면 된다.
STM32CubeIDE에서 프로젝트 생성
STM32CubeIDE를 실행하고 새 프로젝트를 생성한다. File → New → STM32 Project를 클릭하고 칩은 STM32F103C8T6, Targeted Project Type에서 STM32Cube를 선택한다.

프로젝트가 생성되면 main.c 파일이 자동으로 만들어진다. 여기서 중요한 규칙이 있다.
코드는 반드시 USER CODE BEGIN ~ USER CODE END 사이에 작성한다.
/* USER CODE BEGIN Includes */
// 이 안에 코드를 작성
/* USER CODE END Includes */
이 범위 밖에 코드를 작성하면 STM32CubeMX에서 코드를 재생성할 때 작성한 코드가 날아간다. 또한 주석은 한글로 달지 않는 것이 좋다.
ST-LINK 펌웨어 업데이트
보드를 PC에 연결한 후, ST-LINK의 펌웨어를 업데이트해야 한다. IDE 메뉴에서 Help → ST-LINK Upgrade를 통해 진행할 수 있다.

GPIO 간단 제어
GPIO(General Purpose Input/Output)는 사용자의 의도에 따라 입출력이 제어될 수 있는 범용 입출력 포트다. 다른 핀들과 달리 특정 목적이 미리 정의되지 않으며, 사용자가 설정하기 전에는 사용할 수 없다.
D2 LED 깜빡이기
보드의 회로도를 보면 D2 LED는 PC13 핀에 연결되어 있다. 여기서 PC13이란 GPIO 그룹 C의 13번 핀이라는 뜻이다.

핀 이름 규칙: PXY (P = GPIO Pin, X = GPIO 그룹, Y = 해당 그룹 내 핀 번호)
설정 과정은 다음과 같다.
- STM32CubeMX(또는 IDE의 .ioc 파일)에서 PC13을 GPIO_Output으로 설정
- User Label을 "GPIO_LED"로 지정
- 저장하면 main.c에 MX_GPIO_Init() 함수가 자동 생성됨

while문 내부에 아래 코드를 작성한다.
/* USER CODE BEGIN WHILE */
while (1)
{
HAL_GPIO_WritePin(GPIOC, GPIO_LED_Pin, GPIO_PIN_RESET);
HAL_Delay(100);
HAL_GPIO_WritePin(GPIOC, GPIO_LED_Pin, GPIO_PIN_SET);
HAL_Delay(100);
/* USER CODE END WHILE */
}
GPIO_LED_Pin 대신 GPIO_PIN_13을 사용할 수도 있는데, 이는 ((uint16_t)0x2000)으로 정의되어 있으며 13번 핀을 제어한다는 의미다.
디버깅 시 HAL_GPIO_WritePin에 브레이크포인트를 걸면 D2 LED가 켜진 상태로 멈추는 것을 확인할 수 있고, 브레이크포인트를 해제하고 실행하면 0.1초 간격으로 LED가 깜빡인다.

스위치로 LED 제어하기
이번에는 보드의 스위치(PA0)를 입력으로 사용하여 LED를 제어한다.
- STM32CubeMX에서 PA0을 GPIO_Input으로 설정
- User Label을 지정

while문 내부에 아래 코드를 작성한다.
/* USER CODE BEGIN WHILE */
while (1)
{
if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET)
{
HAL_GPIO_WritePin(GPIOC, GPIO_LED_Pin, GPIO_PIN_RESET);
}
else
{
HAL_GPIO_WritePin(GPIOC, GPIO_LED_Pin, GPIO_PIN_SET);
}
/* USER CODE END WHILE */
}
주의할 점은, GPIO가 읽었을 때 Low가 1인지 High가 1인지는 회로도에 따라 다르다는 것이다. 이 보드에서는 GPIO_PIN_RESET(0)을 넣으면 LED가 켜진다.

'Embedded' 카테고리의 다른 글
| [오제이 튜브 임베디드 강의] 07. GPIO제어 부셔먹기 (0) | 2026.04.25 |
|---|---|
| [오제이 튜브 임베디드 강의] 06. 혼자서 임베디드 고수되는 방법 (0) | 2026.04.25 |
| [오제이 튜브 임베디드 강의] 04. 전기 기본 상식 (0) | 2026.04.25 |
| [오제이 튜브 임베디드 강의] 03. 실무자는 어떻게 칩을 고르나요? (0) | 2026.04.25 |
| [오제이 튜브 임베디드 강의] 02. 임베디드가 뭔가요? (0) | 2026.04.25 |