개인적으로 다양한 프로젝트에 사용하고자 이전부터 STM32 개발보드를 설계 제작해 왔다.
이전 포스트 #1: STM32 Pro Mini
이전 포스트 #2: STM32 Pro Mini Rev. 2
이후 이 개발 보드를 계속 만들고 사용하는 과정에서 다양한 수정 및 삽질이 있었다.
보드 사양 선정
개발 보드를 만들면서, 가장 우선으로 삼았던 것으로 다음 네 가지 목표가 있었다:
- ESP32-WROOM-32나, Arduino Pro Mini, Arduino Nano처럼 브레드보드에서 쉽게 테스트할 수 있으면서, 필수 회로가 모두 갖추어져 있어 추가적인 외부 소자 없이 바로 테스트할 수 있을 것
- 모든 부품은 JLCPCB에서 제공하는 부품 카탈로그 내에서만 사용하고, JLCPCB에서 최소한의 단가로 SMT까지 바로 완료할 수 있도록 할 것. (2층 PCB, 단면 SMT)
- Arduino Pro Mini의 기본적인 핀 배치와 폼 팩터를 따를 것
- 가능한 한 고사양의 STM32 프로세서를 사용할 것.
이 중 4번은 사실 제한이 있었는데, Arduino Pro Mini의 폼 팩터를 유지하면서 사용할 수 있는 STM32 프로세서는 48핀 계열 패키지가 전부였다. 2층 기판을 사용하는 한 BGA는 사용할 수 없었고, Arduino Pro Mini의 규격에 배치할 수 있는 가장 큰 프로세서는 7mm x 7mm의 패키지였다. 결국 LQFP48 또는 UFQFPN48계열 패키지로 출시되는 제품을 사용하게 되었다.
두 패키지를 사용하는 제품 중 안정적인 수급과 단가를 고려했을 때, 사용할 수 있는 제품은 다음 네 가지 뿐이다.
- STM32F103C8Tx (72 MHz, 64 KB Flash, 20 KB SRAM)
- STM32F103CBTx (72 MHz, 128 KB Flash, 20 KB SRAM)
- STM32F411CCUx (100 MHz, 256 KB Flash, 128 KB SRAM)
- STM32F411CEUx (100 MHz, 512 KB Flash, 128 KB SRAM)
이 포스트를 작성하는 지금은 STM32H5시리즈도 같은 패키지로 출시되고, ESP32-PICO같은 선택지가 추가되었으나 적어도 개발 보드를 제작하던 당시에는 다른 선택지가 없었다. 다행히도 네 칩은 내장 DC to DC 컨버터의 유무로 인한 VCAP핀을 빼면 핀 배치가 거의 완전히 동일했기 때문에, 보드의 설계를 거의 바꾸지 않고도 혼용할 수 있었고, 최종적으로는 STM32F411계열 칩을 선택했다.
PCB 프로토타입 제작
PCB 리비전이 올라갈수록 여러 가지 변화가 있었는데, 주로 개인적으로 필요했던 기능들을 구현하기 위한 회로를 추가하였다. 몇 가지 큰 변화는 LDO 레귤레이터의 변경, RTC 클럭의 추가와 아날로그부의 개선, USB 포트 추가가 있었다.
1. LDO 레귤레이터 변경
사실 이건 큰 변화라고 하기에는 민망하지만, 3V 리튬 건전지나 배터리를 사용하는 환경에서 대기모드로 장시간 유지되는 환경에서도 사용할 수 있는, 대기 전력이 최대한 낮은 개발보드를 만들고자 했다. 때문에 LDO는 SOT-23-5 패키지 제품 가운데에서 Iq가 최대한 낮은 제품을 선택했다.
2. RTC 클럭 추가
1번과 연결되는 변화인데, STM32를 STOP mode로 활용하거나, RTC를 활용할 수 있도록 하기 위해 32.768kHz의 LC 크리스탈을 추가했다.
3. USB 포트 추가
USB type A 포트를 추가해서 STM32 자체에 내장된 USB 기능을 활용할 수 있도록 했고, HID 드라이버를 함께 제작했다. USB Type A 포트 삽입부의 규격상 두께는 2mm가 넘는데, PCB만으로 두께를 맞추어 제작할 수 없었기 때문에 아무 곳에도 연결되지 않은 세라믹 캐패시터를 이용해 두께를 맞추었다 (…)
그렇게 해서 만들어진 최종 PCB의 렌더링이다.
그렇게 나온 PCB (v5)

그리고 다시 만든 PCB (v6)

자세한 사양 문서는 GitHub 레포지토리에서 확인할 수 있다.
USB HID 부트로더 제작
원래 STM32의 가장 큰 불편함 중 하나는 ST-Link나 Black Magic Probe와 같은 ARM 디버거를 통해 프로그래밍을 해야 한다는 점이다. 시리얼 프로그래밍을 하려면 BOOT0 핀을 조작해서 DFU 모드로 부팅해야 한다.
개인적으로 아두이노가 사용자 입장에서 가장 편리하다고 생각하는 것 중 하나는 시리얼 또는 USB 부트로더가 기본으로 탑재되어 있다는 것이다. 때문에 모든 아두이노 제품은 USB포트에 연결하거나, USB포트가 없는 일부 아두이노는 USB to Serial 단자를 연결하기만 하면 손쉽게 프로그래밍할 수 있다. 하지만 이 개발보드는 프로그램을 올리기 위해 무조건 ST-Link와 같은 하드웨어 디버거를 사용해야 한다.
다행히도 여기에는 해결책이 있다. 보드에 사용한 STM32F1와 STM32F4계열 디바이스는 하드웨어 USB 포트를 지원하기 때문에 USB에 직접 연결할 수 있고, USB를 통해 프로그램을 받아 업로드해줄 수 있는 부트로더가 들어 있다면 아두이노처럼 USB를 통해 바로 프로그래밍할 수 있다. 아두이노 중 Arduino Leonardo나 Arduino Micro와 같이 MCU 자체에 USB 기능이 내장되어 있는 제품이 이런 원리로 되어 있다. 오픈 소스 프로젝트 중에는 STM32를 HID디바이스로 인식시켜 어느 PC에서든 별도의 드라이버 설치 없이 프로그래밍 가능하게 해 주는 프로젝트가 있고, 이를 Fork해서 전용 드라이버를 만들었다.

아두이노 스타일 어댑터 제작
사실 다른 프로젝트에 임베딩해서 사용하는 형태라면 모르겠지만, 일반인(?)은 아두이노 미니나 마이크로같은 소형 모듈을 사용하는 것에 익숙하지 않을 것이다. 때문에 개발 보드를 가장 대중적인 아두이노 우노 규격으로 변환할 수 있는 어댑터를 만들었다. 다만 핀헤더를 붙이는 가격이 비싸서 어떻게 양산해야 할 지 고민이다.
아두이노 프로그래밍 환경 제작
결국 일반인(?)들은 STM32보다는 아두이노의 프로그래밍 환경에 익숙한 사람이 많을 거고, 아두이노 환경은 매우 다양한 라이브러리가 잘 갖추어져 있기 때문에 무조건 Arduino IDE에서 보드를 지원해야만 한다고 생각했다. 때문에 Arduino IDE를 사용해 프로그래밍 가능한 보드 설정을 함께 만들었다.
앞으로의 목표
- 이 개발 보드를 처음 설계할 당시에는 JLCPCB SMT 라이브러리에서 USB 포트 파트를 다양하게 제공하지 않았고, 때문에 PCB 자체에 부러뜨릴 수 있는 USB A 포트를 넣었다. 하지만 지금은 다양한 USB Type C 포트 부품이 추가되었기 때문에 언젠가는 Type C로 바꾸고 싶다는 생각이 있다.

- 원래 STM32는 BOOT0과 BOOT1 핀을 통해 부트 모드를 선택할 수 있다. 이상적인 건 당연히 DIP 스위치를 통해 쉽게 BOOT를 선택할 수 있도록 하는 것이지만, 공간상 보드 뒷면에 BOOT 핀을 넣을 수밖에 없었고, PCB 패턴을 긁거나 납을 바르는 형태로 BOOT를 선택해야 하는 구조이다. 언젠가는 바꿀 계획이 있지만…