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:
Amazon 等で買えます (購入時価格: ¥290)。STM32F103 minimum development board は Maple Mini のコピーのようですね。Blue Pill と呼ばれているようです。ざっくり言えば DAC がなくメモリの少ない Arduino DUE です。
こちらは RobotDyn 直販 (PayPal 経由可) で買えます (購入時価格: $2.49)。黒いですけど中身は Blue Pill です。
USB の不具合はありません。Arduino ブートローダーを書き込んでない方が若干安いです。後述の方法でブートローダーは書き込めますので、USB シリアル変換アダプタや ST-Link を持っているのであれば、ブートローダー入りを購入する理由はないでしょう。
通称 Black Pill です。eBay で購入して $2.50 でした。
USB の不具合はありません。
製品にはピンヘッダが付属していました (ハンダ付けはされていない)。ブレッドボードに挿して実験できるようにするため、ピンヘッダは秋月の細ピンヘッダを使いました。流石に片側 20 ピンもあると細ピンヘッダでないと抜き差しが大変です。
実は 2 個買ったのですが、もう一つは Arduino UNO のようにピンソケットを立ててみました。ピンソケットは分割しやすい秋月の分割ロングピンソケットを使いました。
Blue Pill の各部詳細はこのような感じです。
四本足の MicroUSB コネクタは好印象ですね...ですが、そのランドに詰まっているのは本当にハンダですか?フラックスではないですか?ハンダ付けが充分でない場合があるようなので再ハンダをオススメします。
ピンアウトは以下のようになっています。
起動モードを設定します。デフォルトでは BOOT 0 / BOOT 1 ジャンパ共に 0 側 (FLASH Boot) です。
MODE | FLASH | ISP | SRAM | |
BOOT 0 | 0 | 0 | 1 | 1 |
BOOT 1 | 0 | 1 | 0 | 1 |
デバッグ用の SWD コネクタです。ST-Link 等を繋げるためのもので、一般的な USB<->シリアル変換モジュールを接続するものではありません。
Pin | 名称 |
4 | GND |
3 | DCLK |
2 | DIO |
1 | 3V3 |
この製品には STM32F103C8T6 が載っています。
...ですが、メモリ (FLASH) は 128KB 使えるという話です。最初、STM32F103CBT6 が載っているのではないかと思いましたが、画像の通り C8 でした。そして Blue Pill の殆どは FLASH サイズが 128KB だそうです。
See Also:
基本的には Blue Pill と同じです。
ピン配置は Blue Pill と全く同じですが、基板の軒先が狭いのでブレッドボードボードに挿した時、一列多めに使えます。
USB コネクタに近い側が BOOT 0 ジャンパです。Blue Pill のジャンパーを反時計回りに 90°傾けて 0 と 1 を逆にした感じです。Blue Pill を持っているとちょっと混乱します。
MODE | BOOT 0 | BOOT 1 |
FLASH | 0 | 0 |
0 | 1 | |
ISP | 1 | 0 |
SRAM | 1 | 1 |
See Also:
基本的には Blue Pill と同じです。
Blue Pill とはピンアウトが異なります。Blue Pill の実体配線図を参考にする場合には注意が必要です。
SWD コネクタに近い側が BOOT 0 ジャンパです。Blue Pill のジャンパーを時計回りに 90°傾けた感じです。
MODE | BOOT 1 | BOOT 0 |
FLASH | 0 | 0 |
1 | 0 | |
ISP | 0 | 1 |
SRAM | 1 | 1 |
See Also:
この記事の趣旨は STM32F103 ボードを Arduino ライクに使うというという事なので、細かい説明は抜きにして STM32F103 ボードを Arduino IDE で使えるようにします。
但し何も考えずに USB で接続するとこんなのを拝むハメになりますので、以下の手順をよく確認してください。
Arduino SAM Boards (32-bits ARM Cortex-M3) パッケージを導入します。このパッケージに含まれるコンパイラを利用するためです。
Arduino_STM32 を導入します。Arduino IDE から STM32F ボードが使えるようになります。
STM32duino ブートローダーを導入します。このブートローダーを STM32F103 へ書き込むと MicroUSB 経由でスケッチを転送できるようになります...が、ブートローダーの書き込みには任意の USB<->シリアル変換モジュールが必要となります。
USB<->シリアル変換モジュール | STM32F103 ボード |
VCC | 3.3 (+3.3V) / 5V (+5V) |
GND | GND |
TXD | A10 (PA_10) |
RXD | A9 (PA_9) |
|
Red Pill | Blue Pill | Black Pill | RobotDyn Black Pill |
|
LED Pin | PC13 | PC13 | PB12 | PC13 |
|
ここまでくれば普通の Arduino と何ら変わりません。試しにオンボード LED で L チカしてみましょう。
以降は Arduino ライクに使う事ができます。
ブートローダーを導入せずにスケッチを書き込む方法もあります。
USB<->シリアル変換モジュール | STM32F103 ボード |
VCC | 3.3 (+3.3V) / 5V (+5V) |
GND | GND |
TXD | A10 (PA_10) |
RXD | A9 (PA_9) |
See Also:
STM32F103 ボードで USB 経由のスケッチ書き込みがうまくいかない場合のトラブルシューティングです。
ブートローダーを書き込んだ後、初回の USB 経由のスケッチ書き込みで失敗する事があります。これは初回スケッチ書き込み時に永続ブートローダーモード (Perpetual Bootloader Mode) になっていない事が原因で、以下の手順で回避できるようです。
Maple Mini だとユーザーボタンとリセットボタンを使って永続ブートローダーモードにできたようですね。スケッチを一度正しく書き込めれば次回以降は上記手順は不要です。
逆にブートローダーをフッ飛ばして、再度ブートローダーを書き込んだ直後には永続ブートローダーモードになっていると思うので、「あれ!COM ポートが見えない...壊したか?」 と焦らないようにしてください。オンボード LED がずーっと点滅していませんか?
See Also:
USB 経由でうまく書き込めない時には基板裏の R10 に実装されている 10kΩ抵抗 (103) または 4.7kΩ抵抗 (472) を 1.5kΩ抵抗 (152) に取り換える必要があるかもしれません。
ポリイミドテープで保護しながらやれば、チップ抵抗交換はそう難しくはありません。
チップ抵抗のサイズは 1608 (0603) です。もしチップ抵抗を取り換えるのが難しいのであれば、A12 と 3.3V を 1.8kΩ抵抗で繋ぐ方法もあるようです。一旦ブレッドボードで試すといいかもしれませんね。
この件は、USB ホスト側がイレギュラーな抵抗値を許容できるかできないかの違いが相性問題のように見えるという事なので、個人的には問答無用で交換した方がいいと思っています。本当に R10 が原因なのかを調べるには、
このいずれかを試し、状況が改善するかどうかを確認してください。
最初から RobotDyn の Black Pill を購入するのが手間がなくていいかもです。
See Also:
STM32duino ブートローダーの導入 (シリアル経由) では、フラッシュプログラムに stm32flash.exe を使いました。STMicroelectronics には Flash loader demonstrator という純正のツールがあるのに、です。何故かというと...
STMicroelectronics (My ST) にアカウントを持っていればそんなに敷居は高くないのですが...一応、以下に Flash loader demonstrator を使った STM32duino ブートローダーの導入方法を書いておきます。
Flash loader demonstrator を DL してインストールして...とやるくらいなら stm32flash.exe を使った方が早いというのがお分かり頂けるかと思います。ただ、stm32flash.exe は 64bit 版しか公開されていないので、32bit Windows ではこちらを使う必要があるかと思います。
STM32F103 ボードを Arduino IDE で Arduino と同じような使い方をする分には ST-Link は必要ありません (必須ではありません)。
万が一を考えて (?) 私も買ってはみました (購入時価格: ¥350)。色が違うのがありますが、カラーバリエーションが無駄に 9 色もあるようです。もちろん性能に違いはなく、赤が 3 倍速いとかもありません。
ST-Link のドライバは STMicroelectronics のサイトから DL できます。
DL にはメアド登録が必要で...(以下略)。ドライバのアーカイブが DL できたら、解凍してドライバをインストールします。
これで ST-Link を書き込み装置として使う事ができるようになりました。
ST-Link を使ってスケッチを書き込んでみます。これは Pro Mini + USB<->シリアルでスケッチを書き込むのとよく似ています。
STM32 | ST-Link |
4 GND | 4 GND |
3 DCLK | 6 SWCLK |
2 DIO | 2 SWDIO |
1 3V3 | 8 3.3V |
この方法でも難しくはないですが、結線の手間もあるのでやはり面倒に感じます...STLink を繋ぎっぱなしでいいなら話は別ですが。
STM32duino のブートローダー を ST-Link 経由で書き込むには ST-LINK Utility というツールが必要になります。STMicroelectronics のサイトから DL できます。
DL にはメアド登録が必要で...(以下略)。アーカイブが DL できたら、解凍してユーティリティをインストールします。
でも、これやっちゃうと ST-Link が埃を被ることになるんですよねぇ...それと、STM32Duino のブートローダーをフッ飛ばした時に ST-LINK Utility ではブートローダーを書き込めない時があります。
See Also:
SPI に使えるピンはデフォルトで以下の通りです。
SPI | ピン |
SCK | PA5 |
MISO | PA6 |
MOSI | PA7 |
SS | PA4 |
SPI はもう一系統使えます (SPI2)。
SPI2 | ピン |
SCK | PB12 (28) |
MISO | PB14 (30) |
MOSI | PB15 (31) |
SS | PB12 (28) |
SPI2 を使うには以下のように宣言します。
|
SPI_2 ではなく SPI2 と記述するとコンパイルが通りませんので注意が必要です。
I2C に使えるピンはデフォルトで以下の通りです。
定数 | ピン |
SDA | PB7 (23) |
SCL | PB6 (22) |
I2C はもう一系統使えます (I2C2)。
定数 | ピン |
SDA | PB11 (27) |
SCL | PB10 (26) |
I2C2 を使うには以下のように宣言します。
|
See Also:
Serial (UART) に使えるピンはデフォルトで以下の通りです。
定数 | ピン |
TXD | PA9 |
RXD | PA10 |
Serial オブジェクトは宣言なしに利用可能です。ブートローダーを導入していると (ブートローダー経由で書き込むと) Serial は USB シリアルに割り当てられるため PA9 / PA10 は使えません。ブートローダー導入時に PA9 / PA10 をシリアルとして使うには Serial1 オブジェクトを使います。
See Also:
SoftwareSerial は利用不可です。
See Also:
3系統のハードウエアシリアルを利用可能です。よく使う Serial オブジェクトはハードウェアシリアルです (UART1)。
UART1 | UART2 | UART3 | |
TXD | PA9 | PA2 | PB10 (26) |
RXD | PA10 | PA3 | PB11 (27) |
RTS | PA12 | PA1 | PB14 (30) |
CTS | PA11 | PA0 | PB13 (29) |
CK | PA8 | PA4 | PB12 (28) |
UART2 及び UART3 は Serial2 / Serial3 として定義されており、宣言なしに利用可能です。UART1 及び UART3 のピンは 5V トレラントです。
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) を使う場合]
必要なパーツは以下になります。回路的にはダイオードが一つ少ないだけです。過充電防止回路とかそういう気の利いたものはありません。
この他にもイロイロな回路があるようです。詳細は以下のリンク先にあります。
こんな感じでしょうか?
|
コメントアウトを外して一度時刻を設定すれば、VBAT へ電力供給されている限り時刻は失われません。
最初の画像は CR2032、次のは ML2032、二枚目と三枚目は回路的には等価で配線が変わっただけです。間違い探しみたいですね (w
See Also:
STM32F103 ボードで HID を扱うには以下のライブラリを導入します。
最も簡単なサンプルは [ファイル | スケッチ例 | USBHID] にある SimpleKeyboard ですが、
...という、なかなかのテロ行為を行うスケッチですので、以下のスケッチを試してみてください。PA0 に繋がれたスイッチが押された時だけ "Hello,world." を出力するスケッチです。
|
他のサンプルもテロ行為をするものがありますのでご注意ください。Leonardo 等は起動に 8 秒の猶予がありましたがこれにはありません。ブランクのスケッチを書き込むのも一苦労になりますので、サンプルスケッチは内容を精査した上でコンパイルしてください。
最も簡単なサンプルが...ありませんね。以下のスケッチを試してみてください。PA0 に繋がれたスイッチが押された時だけマウスカーソルが (512, 512) へ移動するスケッチです。
|
最初は素直に HIDMouse クラスを使ってみたのですが何故か動作しませんでした。現状では HIDAbsMouse クラスを使う必要があるのかもしれません。SimpleMouse みたいなスケッチがないのもそのせいかもしれませんね。
最も簡単なサンプルは [ファイル | スケッチ例 | USBHID] にある SimpleJoyStick です。Maple という名前のゲームコントローラーとして認識され、スケッチを実行すると 0.5 秒おきに左右にレバーが入ります。
この画面を出せない?[ファイル名を指定して実行] (〔Win〕+〔R〕) から joy.cpl です。
See Also:
2行ほど、オマジナイを入れておくといいかと思います。
|
最新のライブラリだと、Leonardo 同様、
|
これだけでいいような気がします。
Blue Pill では PA11 / PA12 は USB 端子に接続されており、さらに PA12 はプルアップされています。ハードウェアシリアル (UART1) のフロー制御用ピンでもあるため、この2つは使わない方がいいでしょう。ブートローダーを導入していなければ普通に使えるかもしれません。
See Also:
JTAG デバッグ用に使われているからです。USBコネクタ/ブートローダ経由なら使えるようです。
|
または
|
を setup() 内に記述してみてください。元に戻すには、
|
または
|
です。
See Also:
PB2 はちゃんとあります。ここに。
基板裏の R4 を取り除いてショートすれば普通の GPIO として使えます。
Black Pill は表面の R1 を取り除いてショートします。
See Also:
STM32duino ブートローダーの導入 (シリアル経由) の接続にしておきます。BOOT 0 ジャンパは 1 側です。
stm32flash.exe にパラメータとして COM ポートを渡しただけのものを実行します。
|
RAM が SRAM、Flash がFLASH メモリサイズです。
ここにある情報が役に立って、「調べる手間が省けたからオマイに飯でもおごってやるよ」 というハートウォーミングな方がいらっしゃいましたら、下のボタンからどうぞ。