STM32F103C8T6 MiniをArduino IDEで使う

更新日 2025.05.27 登録日 2025.05.17

*

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本です。

Blue Pill 相当に改造

USBシリアルが不要な場合やST-LinkかSerialでダウンロードする場合にはこの作業は必要ありません。

USBインターフェースの基板実装

CH340非実装の場合、チップに隠れる部分にUSB接続のための22オームのダンピング抵抗2本用のパッドがあります。そこに0402サイズのチップ抵抗を載せます。あとPA12(D+)側に1.5kオームのプルアップ抵抗を力ずくで実装します。近くにCH340用の3V3端子があるのでそれを利用します。私は0805サイズのチップ抵抗しか持っていないので全部無理やり半田付けしました。1.5kオームが無かったので1.8kオームを付けています。
こんな感じです。

*

BOOT1の処理

STM32Duinoとして使うためにはBOOT1は常にGNDに落としておく必要があります。BOOT1はPB2に接続されるのでPB2をGNDに接続します。PB2は2列のピンの中に素のまま出ています。

以上でUSB-C端子のBlue Pill相当になりました。

Arduino IDEの設定

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ボタンを押す必要があるかもしれません。
どちらも見えない場合はドライバが不足している可能性があります。しばらく放置しておけば自動的にドライバがインストールされるかもしれません。どうにもならない場合は、 https://github.com/rogerclarkmelbourne/Arduino_STM32/tree/master/drivers/win へ行って install_drivers.bat を拾ってきて実行すると良くなるかもしれません。 実行には数分かかりますので終わるまで気長に待ちましょう。

スケッチの書き込み (ブートローダー導入&USB 経由)

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 経由)

  1. ブートローダーの書き込みと同様にPCとUSBシリアル変換モジュールとSTM32F103ボードを結線してArduino IDEを起動する。
  2. Upload method: "Serial" を選択する。
  3. シリアルポート: USBシリアル変換モジュールを接続したCOMポートを選択する。
  4. 基板のRSTボタンとBT0ボタンを同時に押してから、RSTを放して1~2秒後にBT0を放す。 (フィンガーダンス)
  5. 「マイコンボードに書き込む」ボタンでコンパイルして書き込み。
  6. RSTボタンを押す

毎回フィンガーダンスが必要になりますが、ブートローダーを導入しなくて済みます。

SerialクラスとシリアルモニタはUSBシリアル変換モジュールを接続したCOMポート(PA9/PA10)になります。USBシリアルは別途Serial4を定義する必要があります。

Serialからスケッチを書き込んだ場合PA15/PB3/PB4はJTAGデバッグ用に使われているので使えないらしい。USBコネクタ/ブートローダ経由なら使えるようです。詳しくはReferencesを参照。

スケッチの書き込み (ST-Link 経由)

  1. PCとST-LinkとSTM32F103ボードを結線してArduino IDEを起動する。
  2. Upload method: "STLink" を選択する。
  3. 「マイコンボードに書き込む」ボタンでコンパイルして書き込み。

ブートローダーを導入しなくて済みますが、ST-Linkの設定が必要です。SerialクラスとシリアルモニタはPA11/PA12になるのでチップ抵抗による改造をした方が良い。ST-Link用にピンを立てる手間を考えればブートローダーを導入を導入した方が楽なのでは?

CH340付きの基板について

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周波数カウンタに使用例を追記しました。

References

  • DEKOのアヤシいお部屋 STM32F103

  • <=Arduinoで電子工作に戻る
    <=Siliconvalley4066番地に戻る
    ゲストブックへ
    siliconvalley4066@yahoo.co.jp