search

고급 초기환경 설정 (STM32CubeIDE 활용)

이번 포스트에서는 Empty Project 말고 STM32CubeIDE에서 제공하는 기능을 이용해서 개발을 진행하는 고급 환경구성 방법을 다룬다.

🎯 고급 환경구성 개요

이제 Empty Project 말고 STM32CubeIDE에서 제공하는 것을 이용해서 개발을 진행한다.

이를 통해 더욱 체계적이고 효율적인 개발 환경을 구축할 수 있다.

⚙️ 1. RCC 설정

HSE와 HSI 비교

RCC 설정

HSI vs HSE:

  • HSI: 16MHz로 고정 (내부 클럭)
  • HSE: 외부 클럭 (8MHz, 우리가 사용하는 보드 외부 클럭은 8MHz)

설정 방법:

  • HSE를 사용하도록 설정
  • HSE를 8MHz로 설정

PLL 설정과 클럭 분배

해당 clock이 PLL 회로로 들어가 클럭을 100MHz로 뻥튀기한다.

HCLK이 APB Prescaler를 거쳐 Peripheral Clock이 된다:

  • Timer는 100MHz로 설정된다
클럭 분배

🔧 2. Debugging 설정

Serial Wire 설정

Debugging용 Wire를 Serial Wire로 설정한다.

디버깅 설정

Serial Wire Debug의 장점:

  • JTAG보다 적은 핀 사용
  • 효율적인 디버깅 인터페이스
  • STM32에서 표준으로 사용

📍 3. GPIO 설정

GPIO 핀 구성

다음과 같이 GPIO를 설정한다:

GPIO 설정 과정

설정 완료 확인

설정이 완료된 모습:

설정 완료

GPIO 설정 요점:

  • 사용할 핀들을 적절한 모드로 설정
  • Input/Output/AF/Analog 모드 선택
  • Pull-up/Pull-down 설정
  • Output 타입 및 속도 설정

⏰ 4. Timer 설정

Timer 기본 설정

다음과 같이 Timer를 설정한다:

Timer 설정

Timer 설정 목적:

  • 정확한 타이밍 제어
  • 주기적인 인터럽트 발생
  • PWM 신호 생성

NVIC 설정

Timer Interrupt를 활성화하기 위해 NVIC를 활성화한다:

NVIC 설정

NVIC(Nested Vectored Interrupt Controller):

  • 인터럽트 우선순위 관리
  • 중첩 인터럽트 처리
  • 효율적인 인터럽트 핸들링

📁 5. Project Manager 설정

Code Generator 설정

Code generator에서 **”Generate peripheral initialization as a pair of ‘.c/.h’ files per peripheral”**를 선택한다:

Project Manager 설정

이 설정의 장점:

  • 관련 파일이 각각 따로 만들어져 보기 편하다
  • 주변장치별로 파일이 분리되어 유지보수 용이
  • 코드 구조가 명확해짐

🚀 6. 프로젝트 생성

최종 생성

다 했으면 톱니바퀴 아이콘을 눌러서 프로젝트를 생성한다:

프로젝트 생성

생성 과정:

  1. 설정 검증
  2. 코드 생성
  3. 프로젝트 파일 구성
  4. 초기화 코드 생성

🛠️ 컴파일 환경 구성

STM32CubeCLT 설치

컴파일 하기 위한 프로그램 설치 (STM32CubeCLT_1.18.0):

STM32CubeCLT 설치

컴파일러 확인

컴파일러 (arm-none-eabi-gcc):

컴파일러

링커 (arm-none-eabi-ld):

링커

설치 확인

CMD에서 STM32와 Version 확인:

버전 확인

📊 생성된 프로젝트 구조

파일 구조

STM32CubeIDE가 생성하는 표준 프로젝트 구조:

Project/
├── Core/
│   ├── Inc/
│   │   ├── main.h
│   │   ├── stm32f4xx_hal_conf.h
│   │   ├── stm32f4xx_it.h
│   │   └── gpio.h (설정에 따라 생성)
│   └── Src/
│       ├── main.c
│       ├── stm32f4xx_hal_msp.c
│       ├── stm32f4xx_it.c
│       ├── system_stm32f4xx.c
│       └── gpio.c (설정에 따라 생성)
├── Drivers/
│   ├── CMSIS/
│   └── STM32F4xx_HAL_Driver/
└── Middlewares/ (필요시)

주요 파일 설명

main.c:

  • 메인 애플리케이션 로직
  • 사용자 코드 영역 제공

stm32f4xx_hal_msp.c:

  • MSP(MCU Support Package) 초기화
  • 저수준 하드웨어 초기화

stm32f4xx_it.c:

  • 인터럽트 핸들러 구현
  • 시스템 인터럽트와 사용자 인터럽트

gpio.c/gpio.h:

  • GPIO 초기화 코드
  • 주변장치별 파일 분리 시 생성

💡 고급 환경구성의 장점

1. 자동 코드 생성

  • 초기화 코드 자동 생성
  • 에러 없는 기본 설정
  • 표준 HAL 라이브러리 활용

2. 시각적 설정

  • GUI를 통한 직관적 설정
  • 실시간 설정 확인
  • 핀 충돌 자동 감지

3. 유지보수성

  • 설정 변경이 용이
  • 코드 재생성 가능
  • 표준화된 구조

4. 호환성

  • ST 공식 지원
  • 다양한 STM32 시리즈 지원
  • 업데이트와 버그 수정

📋 정리

이번 포스트에서는 STM32CubeIDE를 활용한 고급 초기환경 설정을 다뤘다:

  1. RCC 설정: HSE 사용과 PLL을 통한 클럭 설정
  2. 디버깅 설정: Serial Wire Debug 인터페이스 설정
  3. GPIO 설정: 시각적 인터페이스를 통한 핀 설정
  4. Timer 설정: Timer와 NVIC 인터럽트 설정
  5. 프로젝트 관리: 주변장치별 파일 분리 설정
  6. 컴파일 환경: STM32CubeCLT 도구 설치

핵심 장점:

  • 자동화된 코드 생성
  • 시각적이고 직관적인 설정
  • 에러 없는 기본 구성
  • 표준화된 프로젝트 구조

이제 초기환경 세팅의 전 과정을 완료했다. 다음 단계에서는 이를 바탕으로 더 복잡한 기능들을 구현할 수 있다.


이전 포스트: 6. SW Stack과 모듈화


🎉 초기환경 세팅 시리즈 완료!

축하한다! Cortex-M 초기환경 세팅의 모든 과정을 완료했다. 이제 다음 단계로 넘어가 더 고급 기능들을 구현해보자.

STM32CubeIDE 프로젝트 생성

이번 포스트에서는 STM32CubeIDE를 사용하여 새 프로젝트를 생성하고 기본적인 설정을 진행한다.

기본 프로젝트 설정

프로젝트 생성 단계

1. STM32CubeIDE 실행

  • STM32CubeIDE를 실행한다
  • “File → New → STM32 Project” 선택

2. MCU 선택

  • Target Selection에서 STM32F411RE 검색 및 선택
  • Nucleo-64 보드 선택

3. 프로젝트 설정

1. RCC (클럭) 설정

클럭 설정은 STM32 개발에서 가장 중요한 초기 설정 중 하나다.

1) 클럭 소스 이해

내부 클럭 (HSI - High Speed Internal)

  • 주파수: 16MHz 고정
  • 특징:
    • 외부 크리스털이 필요 없다
    • 온도나 전압 변화에 영향을 받을 수 있다
    • 정확도가 외부 클럭보다 낮다

외부 클럭 (HSE - High Speed External)

MCU 외부에 실제 크리스털 오실레이터 부품을 달아서 사용하는 클럭이며 보통 보드에 크리스털이나 클럭 모듈이 납땜되어 있음

  • 주파수: 8MHz (우리 보드 기준)
  • 특징:
    • 외부 크리스털 오실레이터를 사용한다
    • 높은 정확도와 안정성을 제공한다
    • 정밀한 타이밍이 필요한 애플리케이션에 적합하다

2) RCC 설정 방법

1. Clock Configuration 탭으로 이동

RCC 클릭

2. HSE 설정

RCC → High Speed Clock (HSE) → Crystal/Ceramic Resonator 선택

3. PLL 설정

  • HSE(8MHz)를 PLL 회로를 통해 100MHz로 증폭한다
  • 이 과정을 통해 시스템 클럭을 최대 성능으로 설정할 수 있다

4. 최종 클럭 설정

  • HCLK: 100MHz (시스템 클럭)
  • APB1: 50MHz (저속 주변장치)
  • APB2: 100MHz (고속 주변장치)
  • Timer Clock: 100MHz

중요: PLL을 사용하면 저주파수 입력을 고주파수로 변환하여 시스템 성능을 최대화할 수 있다.

2. SYS (시스템) 설정

Debug 설정

디버깅을 위한 시스템 설정을 진행한다.

Debug 인터페이스 선택:

SYS → Debug → Serial Wire 선택

Serial Wire Debug (SWD)의 장점:

  • 핀 수 절약: JTAG 대비 적은 핀 사용 (SWDIO, SWCLK만 필요)
  • 고속 디버깅: 효율적인 디버깅 인터페이스 제공
  • 실시간 추적: 실시간으로 프로그램 실행 상태를 모니터링할 수 있다

참고: SWD는 ARM Cortex-M 시리즈에서 표준으로 사용되는 디버깅 인터페이스다.

3. GPIO 설정

PA5 핀을 Output으로 설정

User LD2를 제어하기 위해 PA5 핀을 GPIO Output으로 설정한다.

설정 단계:

1. Pinout & Configuration 탭에서 PA5 핀 찾기

2. PA5 클릭 후 GPIO_Output 선택

3. GPIO 설정 확인

  • GPIO output level: Low (초기값)
  • GPIO mode: Output Push Pull
  • GPIO Pull-up/Pull-down: No pull-up and no pull-down
  • Maximum output speed: Low

GPIO 모드 설명

Output Type 옵션:

Push Pull

  • 기본 설정으로 대부분의 용도에 적합하다
  • HIGH/LOW 양방향으로 확실한 신호를 출력한다
  • LED 제어에 적합하다

Open Drain

  • 주로 I2C 통신이나 와이어드 OR 로직에 사용한다
  • HIGH 임피던스 상태와 LOW만 출력할 수 있다

Pull-up/Pull-down 옵션:

  • No pull: 외부 풀업/풀다운 저항을 사용할 때
  • Pull-up: 내부 풀업 저항 사용
  • Pull-down: 내부 풀다운 저항 사용

4. 설정 결과 확인

Clock Tree 확인

Clock Configuration 탭에서 최종 클럭 설정을 확인할 수 있다:

  • Input: HSE 8MHz
  • PLL: x12.5 (8MHz × 12.5 = 100MHz)
  • SYSCLK: 100MHz
  • AHB: 100MHz
  • APB1: 50MHz (÷2)
  • APB2: 100MHz (÷1)

GPIO 설정 확인

Pinout view에서 다음을 확인할 수 있다:

  • PA5가 녹색으로 표시된다 (GPIO_Output으로 설정됨)
  • 핀 라벨이 GPIO_Output으로 변경된다

간단한 테스트 코드

생성된 main.c에 LED 제어 코드를 추가해보자:

/* USER CODE BEGIN WHILE */
while (1)
{
    /* USER CODE END WHILE */
    
    // LED ON
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
    HAL_Delay(500);  // 0.5초 대기
    
    // LED OFF
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
    HAL_Delay(500);  // 0.5초 대기
    
    /* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */

정리

이번 포스트에서는 STM32CubeIDE를 사용한 프로젝트 생성과 기본 설정을 다뤘다:

다음 포스트에서는 개발에 필요한 도구들을 설치하고 빌드 환경을 구성해보겠다.


이전 포스트: 1. STM32 보드 소개
다음 포스트: 3. 개발 환경 구성

keyboard_arrow_up