"기능 구현보다 설계가 먼저다." C언어 기능 구현은 가능하지만, 하드웨어 의존적인 스파게티 코드로 고통받는 1~3년 차 펌웨어 개발자를 위한 아키텍처 강의 시리즈 목차입니다.
실무 1~3년 차를 위한
STM32 펌웨어 아키텍처 강의
본 시리즈는 STM32와 CubeIDE 환경을 기준으로 하지만, 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)와 데이터 패킷 처리 로직을 분리해라.
- HAL_UART_Transmit 직접 사용의 문제점 (Blocking)
- 계층 분리: Low Level -> Ring Buffer -> Packet Parser -> App
- 원형 버퍼(Ring Buffer)의 필요성
- PC 시뮬레이터 테스트 가능성
06강. 버튼 입력 처리: 폴링과 인터럽트
🔑 핵심 메시지: ISR(인터럽트 서비스 루틴)은 짧을수록 좋다. "치고 빠져라."
Part 3. 유지보수성을 높이는 고급 패턴
07강. 상태 머신(FSM) 패턴
🔑 핵심 메시지: 모든 시스템은 '상태(State)'를 가진다. 플래그(Flag) 변수 10개 대신 FSM을 써라.
- 중첩된 if-else 지옥 탈출하기
- FSM의 개념과 도식화
- [Code] switch-case와 enum을 활용한 구조 구현
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 도입 및 칩 변경에 대한 확장성
- 전체 소스 코드 공유 및 마무리 격려
각 강의 제목을 클릭하면 해당 포스팅으로 이동합니다.
(링크는 순차적으로 업데이트될 예정입니다.)

