실무 1~3년 차를 위한 STM32 펌웨어 아키텍처 강의

실무 1~3년 차를 위한 STM32 펌웨어 아키텍처 강의

"기능 구현보다 설계가 먼저다." C언어 기능 구현은 가능하지만, 하드웨어 의존적인 스파게티 코드로 고통받는 1~3년 차 펌웨어 개발자를 위한 아키텍처 강의 시리즈 목차입니다.

실무 1~3년 차를 위한
STM32 펌웨어 아키텍처 강의

본 시리즈는 STM32CubeIDE 환경을 기준으로 하지만, AVR/PIC 등 모든 임베디드 시스템에 통용되는 설계 원칙을 다룹니다. Coder를 넘어 Architect로 성장하고 싶은 분들을 위해 준비했습니다. 👩‍💻

Part 1. 스파게티 코드 탈출하기 (기초 설계)

01강. CubeMX가 만들어준 코드는 '완성'이 아니다

🔑 핵심 메시지: 자동 생성 코드는 '초기화'일 뿐, '비즈니스 로직'은 분리해야 한다.

  • User Code Begin 주석 사이에 모든 로직을 넣는 실수와 위험성
  • 핀맵/칩 변경 시 코드 유실 문제 지적
  • App_Init(), App_Process() 구조 제안 및 코드 비교

02강. 하드웨어 추상화(HAL) 개념 잡기

🔑 핵심 메시지: 벤더(ST)가 제공하는 HAL도 결국은 남의 코드다. 우리만의 방화벽(Wrapper)이 필요하다.

  • 레지스터 직접 제어 vs 벤더 라이브러리(HAL/LL) 비교
  • 임베디드 소프트웨어 계층 구조 (HW -> Drivers -> App)
  • 진정한 HAL이란? (HAL_GPIO_WritePin vs LED_On)
  • 의존성 역전 원칙(DIP) 맛보기

03강. C언어 구조체와 함수 포인터 재발견

🔑 핵심 메시지: C언어로도 객체지향(OOP)을 할 수 있다. (캡슐화의 마법)

  • 전역 변수 남발의 위험성 (데이터 오염)
  • 구조체(struct)로 관련 변수 묶기 (Class 멤버 변수처럼)
  • 함수 포인터를 활용한 인터페이스 구현 (다형성)
  • [Code] 단순 변수 나열 vs 구조체 모듈화 코드 비교

Part 2. 하드웨어 독립적인 드라이버 만들기 (OCP 실습)

04강. [실습] LED 드라이버 설계

🔑 핵심 메시지: 하드웨어가 바뀌어도 main.c는 몰라야 한다.

  • 시나리오: MCU 핀 부족으로 I2C Expander 사용 시?
  • 나쁜 예: main.c의 HAL 함수 직접 수정
  • 좋은 예: Led_On() 함수 내부만 수정 (OCP 적용)

05강. [실습] UART 통신 모듈화

🔑 핵심 메시지: 통신 매체(UART/SPI)와 데이터 패킷 처리 로직을 분리해라.

06강. 버튼 입력 처리: 폴링과 인터럽트

🔑 핵심 메시지: ISR(인터럽트 서비스 루틴)은 짧을수록 좋다. "치고 빠져라."

  • ISR 내부에서 HAL_Delay, printf 사용 금지
  • 올바른 설계: ISR은 Flag만, 처리는 main 루프에서
  • 소프트웨어 타이머로 채터링(Bouncing) 해결하기

Part 3. 유지보수성을 높이는 고급 패턴

07강. 상태 머신(FSM) 패턴

🔑 핵심 메시지: 모든 시스템은 '상태(State)'를 가진다. 플래그(Flag) 변수 10개 대신 FSM을 써라.

  • 중첩된 if-else 지옥 탈출하기
  • FSM의 개념과 도식화
  • [Code] switch-caseenum을 활용한 구조 구현

08강. 타이머와 스케줄러 (Non-blocking)

🔑 핵심 메시지: CPU를 멍때리게 하지 마라. (HAL_Delay 없이 멀티태스킹)

  • HAL_Delay(1000)의 문제점
  • millis() 타임스탬프를 이용한 비동기 처리
  • 간단한 라운드 로빈 스케줄러 구현

09강. 설정(Configuration)과 로직의 분리

🔑 핵심 메시지: 코드 수정 없이 '설정'만 바꿔서 재사용할 수 있어야 한다.

  • 하드코딩된 핀 번호(PA5) 제거
  • Config 구조체와 의존성 주입(Dependency Injection) 패턴
  • 하나의 파일로 여러 버튼 인스턴스 생성하기

Part 4. 품질 확보와 테스트

10강. 임베디드 단위 테스트(Unit Test)

🔑 핵심 메시지: 보드에 굽지(Flash) 않고도 내 로직을 검증할 수 있어야 고수다.

  • 수정-컴파일-다운로드의 무한 반복 끊기
  • PC(Visual Studio/GCC)에서 로직 테스트하기
  • Mocking(가짜 하드웨어)의 개념과 적용

11강. 전체 시스템 통합과 마무리

🔑 핵심 메시지: 설계된 코드는 배신하지 않는다.

  • 1강의 스파게티 코드 vs 11강의 아키텍처 비교
  • RTOS 도입 및 칩 변경에 대한 확장성
  • 전체 소스 코드 공유 및 마무리 격려

각 강의 제목을 클릭하면 해당 포스팅으로 이동합니다.
(링크는 순차적으로 업데이트될 예정입니다.)

다음 이전