STM32F103

STM32F103 に関する記事です。



STM32F103

STMicroelectronics 社の STM32F103 搭載ボードは Arduino ではないのですが、Arduino IDE で Arduino ライクな使い方ができます。

以下、STM32F103 シリーズのバリエーションです。

ピン数
T C R V Z
36pin 48pin 64pin 100pin 144pin

メモリ (FLASH / SRAM)
4 6 8 B C D E F G
16K / 6K 32K / 10K 64K / 20K 128K /20K 256K / 64K 384K / 64K 512K / 64K 768K / 96K 1M / 96K

パッケージ
H T U Y
BGA LQFP QFN CSP

6 7
-40℃~85℃ -40℃~105℃

STM32F103C8T6 だと LQFP 48pin で、FLASH が64K、SRAM が 20K、動作温度は -40℃~85℃という事になります。

See Also:


購入

Blue Pill (STM32F103 minimum development board)

Amazon で買えます (購入時価格: ¥290)。STM32F103 minimum development board は Maple Mini のコピーのようですね。Blue Pill と呼ばれているようです。

この製品には STM32F103C8T6 が載っています。

...ですが、メモリ (FLASH) は 128KB 使えるという話です。最初、STM32F103CBT6 が載っているのではないかと思いましたが、画像の通り C8 でした。そして Blue Pill の殆どは FLASH サイズが 128KB だそうです。



Blue Pill 各部詳細

製品にはピンヘッダが付属していました (ハンダ付けはされていない)。ブレッドボードに挿して実験できるようにするため、ピンヘッダは秋月の細ピンヘッダを使いました。流石に片側 20 ピンもあると細ピンヘッダでないと抜き差しが大変です。

実は 2 個買ったのですが、もう一つは Arduino UNO のようにピンソケットを立ててみました。ピンソケットは分割しやすい秋月の分割ロングピンソケットを使いました。

Blue Pill の各部詳細はこのような感じです。

四本足の MicroUSB コネクタは好印象ですね...ですが、そのランドに詰まっているのは本当にハンダですか?フラックスではないですか?

ピンアウト

ピンアウトは以下のようになっています。

BOOT ジャンパ

起動モードを設定します。デフォルトでは BOOT 0 / BOOT 1 ジャンパ共に 0 側 (FLASH Boot) です。

MODE BOOT 0 (上) BOOT 1 (下)
FLASH 0 0
0 1
ISP 1 0
SRAM 1 1

SWD (Serial Wire Debug) コネクタ

デバッグ用の SWD コネクタです。ST-Link 等を繋げるためのもので、一般的な USB<->シリアル変換モジュールを接続するものではありません。

Pin 名称
4 GND
3 DCLK
2 DIO
1 3V3

See Also:



セットアップ

この記事の趣旨は STM32F103 ボードを Arduino ライクに使うというという事なので、細かい説明は抜きにして STM32F103 ボードを Arduino IDE で使えるようにします。

但し何も考えずに USB で接続するとこんなのを拝むハメになりますので、以下の手順をよく確認してください。

Arduino SAM Boards の導入

Arduino SAM Boards パッケージを導入します。このパッケージに含まれるコンパイラを利用するためです。

  1. Arduino IDE を起動
  2. [ツール | ボード | ボードマネージャ]
  3. "Arduino SAM Boards (32-bits ARM Cortex-M3)" を探してインストール

Arduino_STM32 の導入

Arduino_STM32 を導入します。Arduino IDE から STM32F ボードが使えるようになります。

  1. https://github.com/rogerclarkmelbourne/Arduino_STM32 へ行く
  2. [Clone or Download] ボタンを押し、[Download ZIP] でダウンロード
  3. アーカイブを適当な場所に解凍
  4. <Arduino IDE インストールフォルダ>\hardware フォルダに Arduino_STM32 サブフォルダを作成
  5. ここへ解凍したアーカイブの中身を移動
  6. 移動先の examples フォルダ直下に空の boards.txt を作成
  7. drivers\win フォルダにある install_drivers.bat を ([管理者として実行] で) 実行し、USB DFU / Serial ドライバをインストールする。

STM32duino ブートローダーの導入 (シリアル経由)

STM32duino ブートローダーを導入します。このブートローダーを STM32F103 へ書き込むと MicroUSB 経由でスケッチを転送できるようになります...が、ブートローダーの書き込みには任意の USB<->シリアル変換モジュールが必要となります。

  1. https://github.com/rogerclarkmelbourne/STM32duino-bootloader へ行く
  2. [Clone or Download] ボタンを押し、[Download ZIP] でダウンロード
  3. アーカイブを適当な場所に解凍。ここでは C:\BOOTLOADER に解凍したものとする
  4. stm32flash.exe をダウンロードし、C:\BOOTLOADER\STM32F1\binaries へコピーする
  5. USB<->シリアルと STM32F103 ボードを結線する。
    USB<->シリアル変換モジュール STM32F103 ボード
    VCC 3.3 (+3.3V) / 5V (+5V)
    GND GND
    TXD A10 (PA_10)
    RXD A9 (PA_9)
    ※A9 / A10 は 5V トレラント。
  6. STM32F103 ボードの BOOT 0 ジャンパを 1 側にセットする (ISP ブートモード)
  7. USB<->シリアル変換モジュールを PC に接続し、COM ポート番号を調べる
  8. C:\BOOTLOADER\STM32F1\binaries に以下のファイル (writebootloader.cmd) を作成します。
    @echo off
    SET COM_PORT=COM4
    stm32flash.exe -f -v -w generic_boot20_pc13.bin %COM_PORT%
    赤字の所は環境に応じて書き換えてください。ブートローダーに generic_xxxxxx_pc13.bin を指定しているのは、このボードのオンボード LED が PC13 だからです。
  9. writebootloader.cmd を実行します
    C:\BOOTLOADER\STM32F1\binaries>writebootloader.cmd
    
    stm32flash.exe -f -v -w generic_boot20_pc13.bin COM4
    stm32flash 0.5
    
    http://stm32flash.sourceforge.net/
    
    Using Parser : Raw BINARY
    Interface serial_w32: 57600 8E1
    Version      : 0x22
    Option 1     : 0x00
    Option 2     : 0x00
    Device ID    : 0x0410 (STM32F10xxx Medium-density)
    - RAM        : 20KiB  (512b reserved by bootloader)
    - Flash      : 128KiB (size first sector: 4x1024)
    - Option RAM : 16b
    - System RAM : 2KiB
    Write to memory
    Erasing memory
    Wrote and verified address 0x08001c14 (100.00%) Done.
    このようなログが出ていれば OK です (Flash の部分に実際の FLASH サイズが表示される事を覚えておきましょう)。
  10. STM32F103 ボードの BOOT 0 ジャンパを 0 側にセットする (FLASH ブートモードに戻しておく)
  11. USB<->シリアル変換モジュールと STM32F103 ボードの結線を外し、STM32F103 ボードを PC に接続してみる。デバイスマネージャにエラーが出ていなければ OK。

スケッチの書き込み

ここまでくれば普通の Arduino と何ら変わりません。試しにオンボード LED で L チカしてみましょう。

  1. STM32F103 ボードを Micro USB ケーブルで PC と接続 (BOOT ジャンパはどちらも 0 側: FLASH ブートモード)
  2. Arduino IDE を起動
  3. ボードを以下のように設定する

    ボードの指定を間違うと STM32Duino のブートローダーを簡単にフッ飛ばしますので注意してください。
  4. [ファイル | スケッチ例 | 01.Basics | Blink] を開きます
  5. STM32F103 ボードのオンボード LED は PC13 なので、LED_BUILTIN (または 13) となっている所を PC13 (または 32) で書き換えます (3か所)。
  6. [マイコンボードに書き込む] ボタンでスケッチをコンパイル&転送します。

以降は Arduino ライクに使う事ができます。お疲れさまでした。

See Also:



トラブルシューティング

STM32F103 ボードで USB 経由のスケッチ書き込みがうまくいかない場合のトラブルシューティングです。

永続ブートローダーモード (Blue Pill)

ブートローダーを書き込んだ後、初回の USB 経由のスケッチ書き込みで失敗する事があります。これは初回スケッチ書き込み時に永続ブートローダーモード (Perpetual Bootloader Mode) になっていない事が原因で、以下の手順で回避できるようです。

  1. C14 を 10kΩ抵抗でプルアップ (C14 と 3.3V を10kΩ抵抗で繋ぐ)
  2. STM32F103 ボードを Micro USB ケーブルで PC と接続 (BOOT ジャンパはどちらも 0 側: FLASH ブートモード)
  3. リセットボタンを押す
  4. PC13 がずっと点滅し続ける (永続ブートローダーモード)
  5. 空のスケッチを書き込む (blink とかでもいいが紛らわしいのでやめたほうがいい)。この時点では COM ポートが見えない (シリアルポートとして認識されていない) と思うが、スケッチは書き込める。
  6. 抵抗を取り外す
  7. リセットボタンを押す
  8. PC13 が少し点滅した後に止まる
  9. 抵抗を外した状態でスケッチを書き込めれば OK

Maple Mini だとユーザーボタンとリセットボタンを使って永続ブートローダーモードにできたようですね。スケッチを一度正しく書き込めれば次回以降は上記手順は不要です。

逆にブートローダーをフッ飛ばして、再度ブートローダーを書き込んだ直後には永続ブートローダーモードになっていると思うので、「あれ!COM ポートが見えない...壊したか?」 と焦らないようにしてください。PC13 LED がずーっと点滅していませんか?

See Also:

USB の不具合対策 (Blue Pill)

USB 経由でうまく書き込めない時には基板裏の R10 に実装されている 10kΩ抵抗 (103) または 4.7kΩ抵抗 (472) を 1.5kΩ抵抗 (152) に取り換える必要があるかもしれません。

ポリイミドテープで保護しながらやれば、チップ抵抗交換はそう難しくはありません。

チップ抵抗のサイズは 1608 (0603) です。もしチップ抵抗を取り換えるのが難しいのであれば、A12 と 3.3V を 1.8kΩ抵抗で繋ぐ方法もあるようです。一旦ブレッドボードで試すといいかもしれませんね。

この件は、USB ホスト側がイレギュラーな抵抗値を許容できるかできないかの違いが相性問題のように見えるという事なので、個人的には問答無用で交換した方がいいと思っています。本当に R10 が原因なのかを調べるには、

このいずれかを試し、状況が改善するかどうかを確認してください。

なお、Black Pill と呼ばれるボードにはこの問題は存在しないようですが、ボードが一回り大きいのと値段がちょっとだけ高いようです。Blue Pill と同サイズの Red Pill にもこの問題はないようですが、電源周りが弱いのと USB コネクタが壊れやすいようです (現状ではそもそも入手困難)。

See Also:



Flash loader demonstrator

STM32duino ブートローダーの導入 (シリアル経由) では、フラッシュプログラムに stm32flash.exe を使いました。STMicroelectronics には Flash loader demonstrator という純正のツールがあるのに、です。何故かというと...

STMicroelectronics (My ST) にアカウントを持っていればそんなに敷居は高くないのですが...一応、以下に Flash loader demonstrator を使った STM32duino ブートローダーの導入方法を書いておきます。

  1. USB<->シリアル変換モジュールとの接続方法やブートローダーファイルの入手方法は STM32duino ブートローダーの導入 (シリアル経由) と同じ。
  2. STM32F103 ボードの BOOT 0 ジャンパを 1 側にセットする (ISP ブートモード)
  3. http://www.st.com/ja/development-tools/flasher-stm32.html から Flash loader demonstrator を DL してインストール
  4. Flash loader demonstrator を起動
  5. COM ポートを選択して [NEXT] ボタンを押す
  6. そのまま [NEXT] ボタンを押す
  7. そのまま [NEXT] ボタンを押す
  8. Download Device にチェックを入れ、Download From Filegeneric_boot20_pc13.bin を指定する (このファイルの入手方法と保存場所は STM32duino ブートローダーの導入 (シリアル経由) 参照の事)。

    ブートローダーファイルを指定したら [NEXT] ボタンを押す
  9. ブートローダーが書き込まれる
  10. STM32F103 ボードの BOOT 0 ジャンパを 0 側にセットする (FLASH ブートモードに戻しておく)

Flash loader demonstrator を DL してインストールして...とやるくらいなら stm32flash.exe を使った方が早いというのがお分かり頂けるかと思います。ただ、stm32flash.exe は 64bit 版しか公開されていないので、32bit Windows ではこちらを使う必要があるかと思います。



ST-Link を使ってみる

STM32F103 ボードを Arduino IDE で Arduino と同じような使い方をする分には ST-Link は必要ありません (必須ではありません)。

万が一を考えて (?) 私も買ってはみました (購入時価格: ¥350)。色が違うのがありますが、カラーバリエーションが無駄に 9 色もあるようです。もちろん性能に違いはなく、赤が 3 倍速いとかもありません。

ST-Link USB ドライバの導入

ST-Link のドライバは STMicroelectronics のサイトから DL できます。

DL にはメアド登録が必要で...(以下略)。ドライバのアーカイブが DL できたら、解凍してドライバをインストールします。

これで ST-Link を書き込み装置として使う事ができるようになりました。

ST-Link を使ってスケッチを書き込む

ST-Link を使ってスケッチを書き込んでみます。これは Pro Mini + USB<->FTDI USB<->シリアルFTDI USB<->シリアルでスケッチを書き込むのとよく似ています。

  1. STM32F103 ボードと ST-Link を結線する
    STM32 ST-Link
    4 GND 4 GND
    3 DCLK 6 SWCLK
    2 DIO 2 SWDIO
    1 3V3 8 3.3V
  2. STM32F103 ボードを PC と接続 (BOOT ジャンパはどちらも 0 側: FLASH ブートモード)
  3. Arduino IDE を起動
  4. ボードを以下のように設定する
  5. [ファイル | スケッチ例 | 01.Basics | Blink] を開きます
  6. STM32F103 ボードのオンボード LED は PC13 なので、LED_BUILTIN (または 13) となっている所を PC13 で書き換えます (3か所)。
  7. [マイコンボードに書き込む] ボタンでスケッチをコンパイル&転送します。

この方法でも難しくはないですが、結線の手間もあるのでやはり面倒に感じます...STLink を繋ぎっぱなしでいいなら話は別ですが。



ST-Link で STM32duino ブートローダーを導入してみる

STM32duino のブートローダー を ST-Link 経由で書き込むには ST-LINK Utility というツールが必要になります。STMicroelectronics のサイトから DL できます。

DL にはメアド登録が必要で...(以下略)。アーカイブが DL できたら、解凍してユーティリティをインストールします。

ST-LINK ファームウェアのアップデート

  1. ST-Link を PC に挿さずに ST-LINK Utility を起動。
  2. まず、ST-Link 自身のファームウェアをアップデートします。これをやらないと ST-LINK Utility が正しく動作しない可能性があります。
  3. [ST-LINK | Firmware update]
  4. ST-Link を PC に挿したらすぐに [Device Connect] ボタンを押す
  5. [YES >>>>] ボタンが有効になるので押す。
  6. ファームウェアが更新される。

STM32duino ブートローダーの導入 (ST-Link 経由)

  1. ST-LINK Utility を起動。
  2. ST-Link に STM32F103 ボードを接続する。
  3. STM32F103 ボードの BOOT 0 ジャンパを 1 側にセットする (ISP ブートモード)
  4. [Target | Program & Verify...]
  5. File path に generic_boot20_pc13.bin を指定する (このファイルの入手方法と保存場所は STM32duino ブートローダーの導入 (シリアル経由) 参照の事)。
  6. [START] ボタンを押す。
  7. ブートローダーが書き込まれる
  8. STM32F103 ボードの BOOT 0 ジャンパを 0 側にセットする (FLASH ブートモードに戻しておく)

でも、これやっちゃうと ST-Link が埃を被ることになるんですよねぇ...それと、STM32Duino のブートローダーをフッ飛ばした時に ST-LINK Utility ではブートローダーを書き込めない時があります。

See Also:



SPI

SPI に使えるピンはデフォルトで以下の通りです。

SPI ピン
SCK PA5
MISOPA6
MOSIPA7
SS PA4

SPI はもう一系統使えます (SPI2)。

SPI2 ピン
SCK PB12 (28)
MISOPB14 (30)
MOSIPB15 (31)
SS PB12 (28)

SPI2 を使うには以下のように宣言します。

#include <SPI.h>

SPIClass SPI_2(2);

SPI_2 ではなく SPI2 と記述するとコンパイルが通りませんので注意が必要です。



I2C

I2C に使えるピンはデフォルトで以下の通りです。

定数 ピン
SDAPB7 (23)
SCLPB6 (22)

I2C はもう一系統使えます (I2C2)。

定数 ピン
SDAPB11 (27)
SCLPB10 (26)

I2C2 を使うには以下のように宣言します。

#include <Wire.h>

TwoWire Wire2(PB10, PB11, SOFT_STANDARD);

See Also:



Serial

Serial (UART) に使えるピンはデフォルトで以下の通りです。

定数 ピン
TXDPA9
RXDPA10

Serial オブジェクトは宣言なしに利用可能です。

See Also:

SoftwareSerial

SoftwareSerial は利用不可です。

See Also:

HardwareSerial

3系統のハードウエアシリアルを利用可能です。よく使う Serial オブジェクトはハードウェアシリアルです (UART1)。

UART1 UART2 UART3
TXDPA9PA2 PB10 (26)
RXDPA10PA3PB11 (27)
RTSPA12PA1PB14 (30)
CTSPA11PA0PB13 (29)
CK PA8 PA4PB12 (28)

UART2 及び UART3 は Serial2 / Serial3 として定義されており、宣言なしに利用可能です。



RTC (Real Time Clock)

Blue Pill には 32.768kHz の外部オシレーターが実装されており、RTC を使う事ができます。

使える RTC には 4 種類ありますが、Blue Pill なら LSE を使うのがよさそうです。

種類 定数
HSE (High-Speed External Clock) RTCSEL_HSE
LSE (Low-Speed External Clock) RTCSEL_LSE
HSI (High-Speed Internal Clock) RTCSEL_DEFAULT ?
LSI (Low-Speed Internal Clock) RTCSEL_LSI

バッテリーバックアップ回路

バッテリーバックアップは VBAT に電池を繋ぐ事で実現できます。

但し、単純にこの接続を行うと問題があるようです。比較的簡単に作れるのは次の2つの回路です。

[コイン電池 (CR2032) を使う場合]

必要なパーツは以下になります。

[コイン充電池 (ML2032) を使う場合]

必要なパーツは以下になります。回路的にはダイオードが一つ少ないだけです。過充電防止回路とかそういう気の利いたものはありません。

この他にもイロイロな回路があるようです。詳細は以下のリンク先にあります。

スケッチ

こんな感じでしょうか?

#include <RTClock.h>

RTClock rtc(RTCSEL_LSE); 

void dispTime() {
  char s[32];
  time_t elapsedSec = rtc.getTime();
  struct tm *timeRec = localtime(&elapsedSec);
  strftime(s, sizeof(s), "%Y/%m/%d (%a) %H:%M:%S", timeRec);
  Serial.println(s);
}

void setup() {
  Serial.begin(115200);
/*
  // Settings
  struct tm tmRec;

  tmRec.tm_year  = 2017; 
  tmRec.tm_mon   = 7; 
  tmRec.tm_mday  = 30;
  tmRec.tm_hour  = 9;
  tmRec.tm_min   = 30;
  tmRec.tm_sec   = 00;  

  tmRec.tm_year -= 1900;
  tmRec.tm_mon  -= 1;
  rtc.setTime(&tmRec);
*/
  rtc.attachSecondsInterrupt(dispTime);
}

void loop() {

}

コメントアウトを外して一度時刻を設定すれば、VBAT へ電力供給されている限り時刻は失われません。

最初の画像は CR2032、次のは ML2032、二枚目と三枚目は回路的には等価で配線が変わっただけです。間違い探しみたいですね (w

See Also:



Tips

シリアルモニタで最初の方が読めない

2行ほど、オマジナイを入れておくといいかと思います。

void setup()
{
  Serial.begin(115200);

  while(!Serial.isConnected()) // <- 追加
    delay(10);                 // <- 追加

  ...

最新のライブラリだと、Leonardo 同様、

void setup()
{
  Serial.begin(115200);

  while(!Serial); // <- 追加

  ...

これだけでいいような気がします。

PA15 / PB3 / PB4 が使えない

JTAG デバッグ用に使われているからです。

disableDebugPorts();

または

afio_cfg_debug_ports(AFIO_DEBUG_NONE);

を setup() 内に記述してみてください。元に戻すには、

enableDebugPorts();

または

afio_cfg_debug_ports(AFIO_DEBUG_SW_ONLY);

です。

See Also:

PA11 / PA12 が使えない

Blue Pill では PA11 / PA12 は USB 端子に接続されており、さらに PA12 はプルアップされています。ハードウェアシリアル (UART1) のフロー制御用ピンでもあるため、この2つは使わない方がいいでしょう。

See Also:

搭載メモリサイズを知りたい

STM32duino ブートローダーの導入 (シリアル経由) の接続にしておきます。BOOT 0 ジャンパは 1 側です。

stm32flash.exe にパラメータとして COM ポートを渡しただけのものを実行します。

C:\BOOTLOADER\STM32F1\binaries>stm32flash.exe COM4
stm32flash 0.5

http://stm32flash.sourceforge.net/

Interface serial_w32: 57600 8E1
Version      : 0x22
Option 1     : 0x00
Option 2     : 0x00
Device ID    : 0x0410 (STM32F10xxx Medium-density)
- RAM        : 20KiB  (512b reserved by bootloader)
- Flash      : 128KiB (size first sector: 4x1024)
- Option RAM : 16b
- System RAM : 2KiB

RAM が SRAM、Flash がFLASH メモリサイズです。


ここにある情報が役に立って、「調べる手間が省けたからオマイに飯でもおごってやるよ」 というハートウォーミングな方がいらっしゃいましたら、下のボタンからどうぞ。

メニュー: