STM32CubeIDE에서 새로운 프로젝트를 생성하는 가장 간단한 방법은 STM32 프로젝트 마법사를 사용하는 것입니다. 기본적으로 이 도구는 여러 드라이버 파일, 시스템 파일, 그리고 내장된 STM32CubeMX 편집기로 편집 가능한 코드 생성 설정 파일인 .ioc 파일이 포함된 STM32Cube 프로젝트를 생성합니다. 그러나 개발자가 어떤 이유로든 완전히 빈 상태에서 프로젝트를 시작하기를 원한다면, MCU를 구동하는 데 필수적인 파일만 포함된 빈 프로젝트를 생성할 수 있습니다. 이 프로젝트에는 링커 스크립트(linker script), 시작 코드(startup code), 그리고 기본적인 main.c 파일이 포함됩니다.
STM32CubeIDE에서 빈 프로젝트를 생성하는 것은 매우 간단하지만, 추가 드라이버가 없으면 양질의 코드를 작성하기가 상당히 어렵습니다. 최소한, 대상 소자에 해당하는 CMSIS 헤더 파일을 다운로드하여 프로젝트에 포함시켜야 장치에 대한 레지스터 정의를 사용할 수 있습니다. 아래 설명에서는 STM32L152RE MCU를 예시로 사용하지만, 모든 STM32 시리즈에 동일한 절차를 적용할 수 있습니다.
빈 프로젝트 생성하기
-
STM32CubeIDE에서 File > New > STM32 Project를 선택합니다.
-
Target Selection 창을 통해 STM32 소자를 선택합니다. 본 예시에서는 목록 중 "STM32L152RE"를 선택하였습니다 - MCU/MPU Selector 탭의 검색 창을 사용하면 쉽게 찾을 수 있습니다. Next를 클릭합니다.
-
그림 1과 같이, 프로젝트 이름을 지정하고 Targeted Project Type을 Empty로 변경합니다. Finish를 클릭합니다.
CMSIS 헤더 파일 추가
엄밀히 말하자면, 이 시점에서도 프로젝트는 정상적으로 컴파일되기 때문에 이 단계는 선택 사항입니다. 그러나 추가 드라이버 및/또는 레지스터 정의가 없으면, 프로그래머는 다음과 같은 하드코딩된 주소를 사용하여 레지스터 수준의 프로그래밍만 할 수 있습니다:
/* Set output pin PA5 high */
*((uint32_t*)0x40020014) |= (1 << 5);
당연하게도, 이렇게 작성된 코드는 이해하기 어렵고 이식성이나 유지 보수성이 떨어지기 때문에 양질의 코드를 만들 수 없습니다. 프로그래머가 모든 레지스터 주소와 비트 필드를 직접 정의할 수도 있지만, 이러한 정의는 이미 STM32Cube MCU 패키지에서 제공되는 CMSIS 헤더 파일에 포함되어 있습니다. 프로젝트에 해당 헤더 파일을 포함시키면 레지스터 수준의 코드를 다음과 같이 작성할 수 있습니다:
/* Set output pin PA5 high */
GPIOA->ODR |= GPIO_ODR_ODR_5;
참고: 각 STM32 MCU 시리즈(STM32F4, STM32G0, STM32L1 등)의 해당 MCU 패키지는 ST의 웹사이트와 STMicroelectronics 깃허브 리포지토리에서 다운로드할 수 있습니다.
아래 절차에서도 계속해서 STM32L152RE 소자를 예시로 사용합니다. 물론 다른 대상 소자를 선택하였다면, 아래에서 "STM32L1"이 포함된 디렉터리나 파일 이름은 여러분이 선택한 대상 소자의 디렉터리나 파일을 의미합니다.
-
ST의 웹사이트 또는 STMicroelectronics 깃허브 리포지토리에서 프로젝트의 대상 MCU용 STM32Cube 펌웨어 패키지를 다운로드합니다. 적절한 디렉터리에 패키지의 압축을 풀거나 복제합니다. 이 예제에서는
STM32Cube_FW_L1_V1.10.3
디렉터리를C:\Users\Matt
디렉터리에 복사했습니다. -
STM32CubeIDE의 Project Explorer에서 프로젝트 이름을 마우스 오른쪽 버튼으로 클릭한 후, Import를 선택합니다.
-
General 카테고리 아래의 File System 가져오기(Import) 마법사를 선택한 후, Next를 클릭합니다.
-
From directory 텍스트 상자에 압축을 푼 펌웨어 패키지의 경로를 입력합니다. 이 예제에서 경로는 그림 2와 같이
C:\Users\Matt\STM32Cube_FW_L1_V1.10.3
입니다. -
파일 탐색 창을 사용하여 가져올 CMSIS 파일을 선택합니다. 그림 2와 같이
STM32Cube_FW_L1_V1.10.3/Drivers/CMSIS/Core/Include
와STM32Cube_FW_L1_V1.10.3/Drivers/CMSIS/Device/ST/STM32L1xx/Include
디렉터리 옆의 박스를 체크합니다. Finish를 클릭합니다.
[highlight]참고: 이 시점에서 STM32Cube_FW_L1_V1.10.3/Drivers/CMSIS/Device/ST/STM32L1xx/Source/Templates/system_stm32l1xx.c
파일을 복사하여 프로젝트 내 적절한 위치에 복사하여 붙여 넣는 것도 좋은 방법입니다. STM32L152RE 소자에 반드시 필요한 것은 아니지만, 하드웨어 FPU(Floating Point Unit, 부동소수점 연산 장치)를 사용하는 소자에서는 SystemInit()
함수의 정의가 필요합니다. HAL 드라이버도 이 파일을 필요로 합니다.
- 가져온 디렉터리를 프로젝트의 include 경로 목록에 추가합니다. Project Explorer에서 각
Include
폴더를 마우스 오른쪽 버튼으로 클릭한 후, 그림 3과 같이 *Add/remove include path…**를 선택합니다. 팝업 창에서 Debug 와 Release 설정이 모두 선택되어 있는지 확인하고 OK를 클릭합니다.
그림 3:
Drivers/CMSIS/Core/Include
및 Drivers/CMSIS/Device/ST/STM32L1xx/Include
디렉터리를 프로젝트의 [include] 경로 목록에 추가하기.
- Project Explorer를 사용하여
Drivers/CMSIS/Device/ST/STM32L1xx/Include
디렉토리를 확장합니다.stm32l1xx.h
파일을 더블 클릭하여 엽니다. 아래로 스크롤하여 대상 소자 목록을 찾고(그림 4) 프로젝트의 대상 소자에 해당하는 것을 확인합니다. 여기에서는, “STM32L152xE” 소자입니다.
이 소자 정의를 프로젝트의 Symbols 목록에 추가합니다. Project Explorer에서 프로젝트 이름을 마우스 오른쪽 버튼으로 클릭하고 Properties를 선택합니다. Properties 창 왼쪽에서 C/C++ General > Paths and Symbols로 이동합니다. Symbols 탭에서 Add를 클릭한 뒤, Name 텍스트 상자에 정의(즉, STM32L152xE
)를 입력합니다. OK를 클릭하고, 그림 5와 같이 목록에 심볼(STM32L152xE
)이 추가되었는지 확인합니다. Apply and Close를 클릭합니다.
- 마지막으로, 레지스터 정의가 필요한 소스 파일에
#include "stm32l1xx.h"
를 추가하고 코딩을 시작하십시오!