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 と呼ばれているようです。ざっくり言えば DAC がなくメモリの少ない Arduino DUE です。



RobotDyn STM32 Mini (Blue Pill / RobotDyn Black Pill)

こちらは RobotDyn 直販 (PayPal 経由可) で買えます (購入時価格: $2.49)。黒いですけど中身は Blue Pill です。

USB の不具合はありません。Arduino ブートローダーを書き込んでない方が若干安いです。後述の方法でブートローダーは書き込めますので、USB シリアル変換アダプタST-Link を持っているのであれば、ブートローダー入りを購入する理由はないでしょう。



Black Pill (STM32 Development ARM Learning Board)

通称 Black Pill です。eBay で購入して $2.50 でした。

USB の不具合はありません。



各部詳細

Blue Pill (STM32F103 minimum development board) 各部詳細

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

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

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

四本足の MicroUSB コネクタは好印象ですね...ですが、そのランドに詰まっているのは本当にハンダですか?フラックスではないですか?ハンダ付けが充分でない場合があるようなので再ハンダをオススメします。

ピンアウト

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

BOOT ジャンパ

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

MODE FLASH ISP SRAM
BOOT 0 0 0 1 1
BOOT 1 0 1 0 1

SWD (Serial Wire Debug) コネクタ

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

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

FLASH メモリ

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

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

その他

See Also:



RobotDyn Black Pill (RobotDyn STM32 Mini) 各部詳細

基本的には Blue Pill と同じです。

ピンアウト

ピン配置は Blue Pill と全く同じですが、基板の軒先が狭いのでブレッドボードボードに挿した時、一列多めに使えます。

BOOT ジャンパ

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:



Black Pill (STM32 Development ARM Learning Board) 各部詳細

基本的には Blue Pill と同じです。

ピンアウト

Blue Pill とはピンアウトが異なります。Blue Pill の実体配線図を参考にする場合には注意が必要です。

BOOT ジャンパ

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 SAM Boards (32-bits ARM Cortex-M3) パッケージを導入します。このパッケージに含まれるコンパイラを利用するためです。

  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. 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\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\binaries に以下のファイル (writebootloader.cmd) を作成します。
    @echo off
    SET COM_PORT=COM4
    stm32flash.exe -f -v -w generic_boot20_pc13.bin %COM_PORT%
    赤字の所は環境に応じて書き換えてください。ブートローダーに generic_xxxxxx_pc13.bin を指定しているのは、このボード (Blue Pill) のオンボード LED が PC13 だからです。Black Pill の場合には generic_xxxxxx_pb12.bin を指定してください。
    Red Pill Blue Pill Black Pill RobotDyn
    Black Pill
    LED Pin PC13 PC13 PB12 PC13
  9. writebootloader.cmd を実行します
    C:\BOOTLOADER\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。

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

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

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

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

以降は Arduino ライクに使う事ができます。

スケッチの書き込み (シリアル経由)

ブートローダーを導入せずにスケッチを書き込む方法もあります。

  1. USB<->シリアルと STM32F103 ボードを結線する。
    USB<->シリアル変換モジュール STM32F103 ボード
    VCC 3.3 (+3.3V) / 5V (+5V)
    GND GND
    TXD A10 (PA_10)
    RXD A9 (PA_9)
    ※A9 / A10 は 5V トレラント。
  2. STM32F103 ボードの BOOT 0 ジャンパを 1 側にセットする
  3. Arduino IDE を起動
  4. ボードを以下のように設定する
  5. [ファイル | スケッチ例 | 01.Basics | Blink] を開く
  6. Blue Pill のオンボード LED は PC13 なので、LED_BUILTIN (または 13) となっている所を PC13 (または 32) で書き換える (3か所)。
  7. [マイコンボードに書き込む] ボタンでスケッチをコンパイル&転送。
  8. STM32F103 ボードの BOOT 0 ジャンパを 0 側にセットする (FLASH ブートモードに戻しておく)
  9. USB<->シリアル変換モジュールと STM32F103 ボードの結線を外し、STM32F103 ボードを PC に接続する。

See Also:



トラブルシューティング

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


永続ブートローダーモード

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

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

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

逆にブートローダーをフッ飛ばして、再度ブートローダーを書き込んだ直後には永続ブートローダーモードになっていると思うので、「あれ!COM ポートが見えない...壊したか?」 と焦らないようにしてください。オンボード 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 が原因なのかを調べるには、

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

最初から RobotDyn の Black Pill を購入するのが手間がなくていいかもです。

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. Blue Pill の場合、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<->シリアルでスケッチを書き込むのとよく似ています。

  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. Blue Pill のオンボード 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. Blue Pill の場合、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 オブジェクトは宣言なしに利用可能です。ブートローダーを導入していると (ブートローダー経由で書き込むと) Serial は USB シリアルに割り当てられるため PA9 / PA10 は使えません。ブートローダー導入時に PA9 / PA10 をシリアルとして使うには Serial1 オブジェクトを使います。

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 として定義されており、宣言なしに利用可能です。UART1 及び UART3 のピンは 5V トレラントです。



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:



HID (Human Interface Device)

STM32F103 ボードで HID を扱うには以下のライブラリを導入します。


HID キーボード

最も簡単なサンプルは [ファイル | スケッチ例 | USBHID] にある SimpleKeyboard ですが、

...という、なかなかのテロ行為を行うスケッチですので、以下のスケッチを試してみてください。PA0 に繋がれたスイッチが押された時だけ "Hello,world." を出力するスケッチです。

#include <USBHID.h>

const int BUTTON = PA0;

void setup() {
  pinMode(BUTTON, INPUT_PULLUP);
  USBHID_begin_with_serial(HID_KEYBOARD);
  Keyboard.begin();
}

void loop() {
  if (digitalRead(BUTTON) == LOW) {
    Keyboard.println("Hello,world.");
    delay(1000);
  }  
}

他のサンプルもテロ行為をするものがありますのでご注意ください。Leonardo 等は起動に 8 秒の猶予がありましたがこれにはありません。ブランクのスケッチを書き込むのも一苦労になりますので、サンプルスケッチは内容を精査した上でコンパイルしてください。


HID マウス

最も簡単なサンプルが...ありませんね。以下のスケッチを試してみてください。PA0 に繋がれたスイッチが押された時だけマウスカーソルが (512, 512) へ移動するスケッチです。

#include <USBHID.h>

const int BUTTON = PA0;

const uint8_t reportDescription[] = {
  HID_ABS_MOUSE_REPORT_DESCRIPTOR(HID_MOUSE_REPORT_ID)
};

HIDAbsMouse mouse;

void setup() {
  pinMode(BUTTON, INPUT_PULLUP);
  USBHID_begin_with_serial(reportDescription, sizeof(reportDescription));
}

void loop() {
  if (digitalRead(BUTTON) == LOW) {
    mouse.move(512512);
    delay(1000);
  }  
}

最初は素直に HIDMouse クラスを使ってみたのですが何故か動作しませんでした。現状では HIDAbsMouse クラスを使う必要があるのかもしれません。SimpleMouse みたいなスケッチがないのもそのせいかもしれませんね。


HID ジョイスティック

最も簡単なサンプルは [ファイル | スケッチ例 | USBHID] にある SimpleJoyStick です。Maple という名前のゲームコントローラーとして認識され、スケッチを実行すると 0.5 秒おきに左右にレバーが入ります。

この画面を出せない?[ファイル名を指定して実行] (〔Win〕+〔R〕) から joy.cpl です。

See Also:



Tips

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

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

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

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

  ...

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

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

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

  ...

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


PA11 / PA12 が使えない

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

See Also:


PA15 / PB3 / PB4 が使えない

JTAG デバッグ用に使われているからです。USBコネクタ/ブートローダ経由なら使えるようです。

disableDebugPorts();

または

afio_cfg_debug_ports(AFIO_DEBUG_NONE);

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

enableDebugPorts();

または

afio_cfg_debug_ports(AFIO_DEBUG_SW_ONLY);

です。

See Also:


PB2 が見当たらない

PB2 はちゃんとあります。ここに。

基板裏の R4 を取り除いてショートすれば普通の GPIO として使えます。

Black Pill は表面の R1 を取り除いてショートします。

See Also:


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

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

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

C:\BOOTLOADER\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 メモリサイズです。


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

メニュー: