Blue Pillとも呼ばれるSTM32F103C8T6基板はArduino IDEで使えるのですが、最近ではESP32やRaspberry Pi Picoに比べて処理速度やメモリ容量の点で見劣りします。しかしながら、ADC速度と周波数カウンタ機能においては他に抜きん出ています。そこで、ESP32-C3 Super MiniやRP2040-zeroの様なミニ基板がないかなと思っていたら、ちょっと毛色が違いますがAli expressやebayに有りました。それがSTM32F103C8T6 Miniです。特に名前が付いていないので勝手にそう呼んでます。 ピン配列が2列ずつになっているのでブレッドボードでは使いにくいですが、価格もそんなには高くないので適材適所で使えそうです。
STM32F103C6T6とSTM32F103C8T6があり、それぞれCH340のUSBシリアルインターフェース付と無しがあります。STM32F103C6T6はメモリ容量が少なく、TimerやI2CやUARTやSPIの数が少ないという弱点がありますが価格が安いのでプログラムが収まれば考慮してもいいかもしれません。
CH32V103C8T6もありますがプログラムのダウンロード方法が違うようなのでここでは除外します。
CPU | CH340 | ROM | RAM | 送料別価格 |
---|---|---|---|---|
STM32F103C6T6 | no | 32KB | 10KB | 146円 |
STM32F103C6T6 | yes | 32KB | 10KB | 186円 |
STM32F103C8T6 | no | 64KB(128KB) | 20KB | 238円 |
STM32F103C8T6 | yes | 64KB(128KB) | 20KB | 280円 |
価格は目安です。この中でお勧めなのはBlue Pillに一番近いSTM32F103C8T6のCH340無しです。足りないのはBOOT1のジャンパとUSB接続のための抵抗3本です。
USBシリアルが不要な場合やST-LinkかSerialでダウンロードする場合にはこの作業は必要ありません。
CH340非実装の場合、チップに隠れる部分にUSB接続のための22オームのダンピング抵抗2本用のパッドがあります。そこに0402サイズのチップ抵抗を載せます。あとPA12(D+)側に1.5kオームのプルアップ抵抗を力ずくで実装します。近くにCH340用の3V3端子があるのでそれを利用します。私は0805サイズのチップ抵抗しか持っていないので全部無理やり半田付けしました。1.5kオームが無かったので1.8kオームを付けています。
こんな感じです。
STM32Duinoとして使うためにはBOOT1は常にGNDに落としておく必要があります。BOOT1はPB2に接続されるのでPB2をGNDに接続します。PB2は2列のピンの中に素のまま出ています。
以上でUSB-C端子のBlue Pill相当になりました。
Arduino IDEは設定済みの前提です。Arduino IDE 1.8.19でもArduino IDE 2.3.6でも動かせるようです。ブートローダーが使えるようにするには、Microsoft StoreからインストールしたArduino IDEではだめなので、Arduino IDEのホームページのダウンロード版をインストールしてください。
開発環境は STM32F1xx/GD32F1xx boards by stm32duino version 2022.9.26 です。
Arduino IDEの環境設定で追加のボードマネージャのURLに
http://dan.drown.org/stm32duino/package_STM32duino_index.json
を追加すると、ボードマネージャで"stm"を検索すれば出てきます。
Roger Clark版のArduino_STM32よりもちょっと古いバージョンですが、ボードマネージャでインストールや削除が簡単にできるので便利です。Arduino SAM Boards (32-bits ARM Cortex-M3) をインストールする手間も省けます。更新が止まっているので更新を気にする必要もありません。
現在の主流はSTM32 HALベースの Arduino_Core_STM32のようですが、なんだかとっつきにくくてまだ使ったことがありません。
3.3V対応のUSBシリアル変換モジュールが必要になります。この手順は普通のBlue Pillとほぼ同じで、BOOT0ジャンパの差し替えの代わりにフィンガーダンスをすることになります。
ST-Linkでも出来ますが、ややこしいので端折ります。
rogerclarkmelbourne/STM32duino-bootloader へ行って binaries/generic_boot20_pc13.bin を保存する。
rogerclarkmelbourne/Arduino_STM32 へ行って tools/win/stm32flash.exe を同じフォルダに保存する。
同じフォルダにに以下のファイル writebootloader.cmd を作成します。
@echo off
SET COM_PORT=COM4
stm32flash.exe -f -v -w generic_boot20_pc13.bin %COM_PORT%
pause
上の"COM4"はお持ちの USBシリアル変換モジュールを接続したポートに合わせてください。
PCとUSBシリアル変換モジュールとSTM32F103ボードを結線する。USBシリアル変換モジュールが5Vのみの場合VCCは5V端子に接続します。A9/A10は5Vトレラント。
USBシリアル変換モジュール | STM32F103 ボード |
---|---|
VCC | 3V3 (+3.3V) |
GND | GND |
TXD | A10 |
RXD | A9 |
基板のRSTボタンとBT0ボタンを同時に押してから、RSTを放して1~2秒後にBT0を放すとISPブートモードになります。確認できないので以下が失敗するようならやり直します。
作成した writebootloader.cmd を実行するとコマンドウインドウが開いて処理結果が表示されます。確認後に何かキーを押せば閉じます。
ここで Flash : 128KiB とFlashメモリのサイズが分かります。
仕様上では64KBですが実際は128KBであることが多いようです。
USBシリアル変換モジュールの接続を外してPCとUSBケーブルで接続するとブートローダーの実行が始まります。
PCとUSBケーブルで接続する。当たり前ですが、充電専用ケーブルではなく、通信ができるケーブルを使いましょう。
デバイスマネージャーに
ポート(COM と LPT) -> Maple Serial (COM5)のように見えれば良いのですが、
libusb-win32 devices -> Maple DFUが出ているかもしれません。この場合は最初のスケッチ書き込みの際にRSTボタンを押す必要があるかもしれません。
STM32F103 ボードを USB ケーブルで PC と接続してArduino IDEを起動します。 しつこいですが、充電専用ケーブルではなく、通信ができるケーブルを使いましょう。
ボード: "Generic STM32F103C series"
Variant: "STM32F103C8 (20k RAM, 64k Flash)" または "STM32F103CB (20k RAM, 128k Flash)"
Upload method: "STM32duino bootloader"
CPU Speed(MHz): "72MHz (Normal)"
Optimize: "Smallest (default)"
シリアルポート: (Maple Mini) が見えていればそれを。初回はポートが見えていなくても書き込めるが、基板のRSTボタンを押す必要がある。
「ファイル | スケッチ例 | 01 Basics | Blink」を開く。LED_BUILTINはPC13と定義されているのでそのままでOK。
「マイコンボードに書き込む」ボタンでコンパイルして書き込み。
毎回フィンガーダンスが必要になりますが、ブートローダーを導入しなくて済みます。
SerialクラスとシリアルモニタはUSBシリアル変換モジュールを接続したCOMポート(PA9/PA10)になります。USBシリアルは別途Serial4を定義する必要があります。
Serialからスケッチを書き込んだ場合PA15/PB3/PB4はJTAGデバッグ用に使われているので使えないらしい。USBコネクタ/ブートローダ経由なら使えるようです。詳しくはReferencesを参照。
ブートローダーを導入しなくて済みますが、ST-Linkの設定が必要です。SerialクラスとシリアルモニタはPA11/PA12になるのでチップ抵抗による改造をした方が良い。ST-Link用にピンを立てる手間を考えればブートローダーを導入を導入した方が楽なのでは?
USBコネクタのポートはBulue PillのUSBシリアルではなくPA9/PA10のUARTシリアルポートになります。
CH340チップがUSBシリアル変換モジュールの役割をします。Bulue PillのUSBシリアルを使うためにはPA11/PA12に別途USBコネクタを接続しなければなりません。
USBシリアル変換モジュールが無くても使える点は便利ですが、Serial経由のスケッチの書き込みには毎回フィンガーダンスが必要になります。
ST-Linkで書き込めばその手間は省けますが、USBコネクタのポートがSerial1になるのでBlue Pillと使い勝手が変わってしまいます。コンパイルオプションで切り替えるにしても面倒なことになります。
(2025.05.27 追記) 別ページSTM32F103C8T6で192MHz周波数カウンタに使用例を追記しました。