STM32F103C8T6 をArduinoIDEで使用する

2017年7月21日更新

ここに示す内容は、https://ht-deko.com/arduino/stm32f103c8t6.htmlに書かれている内容を引用しています。

目次

  1. はじめに
  2. 購入
  3. STM32F103 minimum development board 各部詳細
  4. セットアップ
  5. トラブルシューティング
  6. ST-Link を使ってみる
  7. STM32F103C8T6(BulePill)でタイマ割込
  8. STM32F103C8T6(BulePill)で外部割込

STMicroelectronics 社の STM32F103C8T6 搭載ボードは Arduino ではないのですが、Arduino IDE で Arduino ライクな使い方ができるようになっています。
v1.6.4からだそうですが、現最新バージョン1.8.3で確認出来ています。

MCU: ARM 32-bit Cortex-M3 CPU Core
FLASH: 64KB
SRAM: 20KB
CLOCK: 72MHz (Max)
VOLTAGE: 2.0〜3.6V
See Also:


購入

Amazon で購入しました \290でした。Maple Mini のコピーでBlue Pill と呼ばれているようですがそんなこと購入サイトには書かれていません。


HiLetgo STM32F103 minimum development board (Amazon)

起動モードを設定します。デフォルトでは 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

セットアップ

STM32F103 ボードを Arduino IDE で使えるようにします。
何も設定せずに接続するとUSBデバイスとして認識されません。デバイスマネージャにはUnKnownDeviceとして扱われるようです。

Arduino SAM Boards の導入

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

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

    IDE1.8.3の場合も1.6.11が最新のようです。過去のモノをインストールすることも可能ですが最新がよさげです。

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 を作成
    ※このファイルが存在しないとIDE起動時にアラートメッセージが出ます。1.5だと不要だったようですが1.6だと必要みたいです。
  7. drivers\win フォルダにある install_drivers.bat を実行し、USB DFU / Serial ドライバをインストールする。


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

STM32duino ブートローダーを導入します。このブートローダーを STM32F103C8T6 へ書き込むと MicroUSB 経由でスケッチを転送できるようになります。この作業には任意の USB<->シリアル変換モジュールが必要となります。
特に指定が無いので手元にあったCP2102の変換ボードを使用しました。


ブートローダ書き込み時のジャンパ設定

通常時のジャンパ設定

  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 ポート番号を調べる
    ※デバイスマネージャ等で確認出来ます。手元ではCOM10でした。
  8. C:\BOOTLOADER\STM32F1\binaries に以下のファイル (writebootloader.cmd) を作成します。
    @echo off
    SET COM_PORT=COM10
    stm32flash.exe -f -v -w generic_boot20_pc13.bin %COM_PORT%
  9. 赤字の所は環境に応じて書き換えてください。ブートローダーに generic_xxxxxx_pc13.bin を指定しているのは、今回使用するボード(STM32F103C8T6)のオンボード LED が PC13 だからです。そのままで使います。
  10. writebootloader.cmd を実行します
    C:\BOOTLOADER\STM32F1\binaries>writebootloader.cmd
    stm32flash.exe -f -v -w generic_boot20_pc13.bin COM10
    stm32flash 0.5
    https://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 とのことです。
    ※手元ではこの実行に何度か失敗しました。管理者権限とかが必要みたいです。作業パスも重要みたいです。
  11. STM32F103 ボードの BOOT 0 ジャンパを 0 側にセットする (FLASH ブートモードに戻しておく)
  12. USB<->シリアル変換モジュールと STM32F103 ボードの結線を外し、STM32F103 ボードを PC に接続してみる。
    デバイスマネージャにエラーが出ていなければ OKと有りましたが、エラーが出なくても認識されませんでした。
    コマンドラインの実行結果がすぐに消えてしまうため、エラーがあっても把握するのが困難です。


USBシリアルコンバータchipをCH340Gに変更したところ、ブートローダをのダウンロードに失敗してしまいます。

結局のところ原因が判りません。


スケッチの書き込み

ここまでくれば普通の Arduino と何ら変わないとの事でした。
試しにオンボード LED で L チカしてみます。

  1. STM32F103 ボードを Micro USB ケーブルで PC と接続 (BOOT ジャンパはどちらも 0 側: FLASH ブートモード)
  2. Arduino IDE を起動します。
  3. ボードを以下のように設定します。
    1. ボード: Generic STM32F103C series
    2. Variant: STM32F103C8 (20k RAM, 64k Flash)
    3. CPU Speed(MHz): 72MHz (Normal)
    4. Upload method: STM32duino bootloader
    5. シリアルポート: (Maple Mini) が見えていればそれを。初回はポートが見えていない可能性がある
    6. 書込装置は"AVRISP"の方がよいのかもしれない?
      ※ボードの指定を間違うと STM32Duino のブートローダーを簡単にフッ飛ばしますとのことです。
  4. [ファイル | スケッチ例 | 01.Basics | Blink] を開きます
  5. STM32F103 ボードのオンボード LED は PC13 なので、LED_BUILTIN (または 13) となっている所を PC13 で書き換えます (3か所)。
  6. [マイコンボードに書き込む] ボタンでスケッチをコンパイル&転送します。
    これに成功すれば以後は Arduino ライクに使う事ができます。

トラブルシューティング

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

  1. 永続ブートローダーモード問題
    ※よくわからない
  2. R10 に実装されている 10kΩ抵抗 (103) または 4.7kΩ抵抗 (472) を 1.5kΩ抵抗 (152) に取り換える必要がある
    Blue Pill問題らしいです。チップ抵抗の交換は大変です。外付けで、A12 と 3.3V を 1.8kΩ抵抗で繋ぐ方法のほうがよさげです。
    個体差があるようですので無くても動くモノは動くのかもしれません。
  3. 自分の環境では以下のコンパイルメッセージが出ます。errorと有りますが、ちゃんと書き込まれていることは確認しています。
    maple_loader v0.1
    Resetting to bootloader via DTR pulse
    Searching for DFU device [1EAF:0003]...
    Found it!
    Opening USB Device 0x1eaf:0x0003...
    Found Runtime: [0x1eaf:0x0003] devnum=1, cfg=0, intf=0, alt=2, name="STM32duino bootloader v1.0  Upload to Flash 0x8002000"
    Setting Configuration 1...
    Claiming USB DFU Interface...
    Setting Alternate Setting ...
    Determining device status: state = dfuIDLE, status = 0
    dfuIDLE, continuing
    Transfer Size = 0x0400
    bytes_per_hash=260
    Starting download: [##################################################] finished!
    error resetting after download: usb_reset: could not reset device, win error: デバイスが接続されていません。
    
    state(8) = dfuMANIFEST-WAIT-RESET, status(0) = No error condition is present
    Done!
    Resetting USB to switch back to runtime mode

    このエラーですが、書込後にPCからusb_reseがうまく実行できなかった事をアナウンスしているみたいですが書込は成功しているようです。
    余所の記事にはIDEから書込をする前に本体リセットボタンをタイミング良く押すこととありますが、手元の環境ではそこまでは不要となっています。
  4. 理由は不明ですがUSB3.0のポートだとCOMポートを認識できません。ドライバの更新で解決しました


ST-Link を使ってみる

Arduino IDE からSTM32F103 ボードを使うことが出来たのですが、安定しません。書込に失敗するし、挙げ句COMポートが消えてしまいます。
リンクメッセージを見る限り、usb_resetがうまく出来ないのがいけないのでは無いかという考えに至りました。

安定した書込を実現すべくST-LINKを購入しました。
HiLetgo ST-Link V2 (Amazon) 高いモノではありません。
結論から、この接続による書込は全く成功していません。

STM32 ST-LINK CLI v2.1.0
STM32 ST-LINK Command Line Interface

No target connected
Unable to connect to ST-LINK!

この現象は書込サイトにも見当たりますが、解決方法が見つかりません。
とりあえず資料として残しますが、、、、

ST-Link USB ドライバの導入

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

STSW-LINK009

ダウンロードするためにメールアドレスを登録し、返信メールにダウンロードリンクが現れるのですが、この仕組みは自分の環境ではうまくダウンロードリンクをクリックできませんでした。URLをコピペしろと有りますが、自分のブラウザはポップアップの仕組みを遮断してしまうため一苦労でした。

ダウンロードしたZIPファイルen.stsw-link009.zipを解凍し、dpinst_amd64.exe (64bit)を実行してインストールした後ST-Link を挿すとちゃんと認識します。USB3.0のポートでも大丈夫でした。

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

ST-Link を使ってスケッチを書き込んでみます。

STM32F103 ボードと ST-Link を結線する

ST-Link 信号名 STM32 信号名
1 RST
2 SWDIO 2 DIO
3 GND
4 GND 4 GND
5 SWIM
6 SWCLK 3 DCLK
7 3.3V
8 3.3V 1 3.3V
9 5.0V    
10 5.0V    

STM32F103 ボードを PC と接続 (BOOT ジャンパはどちらも 0 側: FLASH ブートモード)

Arduino IDE を起動

ボードを以下のように設定する

  • ボード: Generic STM32F103C series(変更無し)
  • Variant: STM32F103C8 (20k RAM, 64k Flash)(変更無し)
  • CPU Speed(MHz): 72MHz (Normal)(変更無し)
  • Upload method: STLink(変更)

[ファイル | スケッチ例 | 01.Basics | Blink] を開きます

STM32F103 ボードのオンボード LED は PC13 なので、13 となっている所を PC13 で書き換えます (3か所)。

[マイコンボードに書き込む] ボタンでスケッチをコンパイル&転送します。

この結果が

STM32 ST-LINK CLI v2.1.0
STM32 ST-LINK Command Line Interface

No target connected
Unable to connect to ST-LINK!


STM32F103C8T6(BulePill)でタイマ割込

Blue PillボードではTimer1、Timer2、Timer3、Timer4 の4つのタイマが用意されています。分解能は72MHzのクロックから分周してBaseクロックを作成し、このクロックのカウント値を元にこのカウント値が合致したらEventを起こすという使い方のようです。

先人のサンプルプログラムを参考にします。
#define LED_PIN  PA8                 // TIMER1 1CH用出力ピン
uint8_t sw = LOW;
void handle_timer() {
  if (sw == LOW) {
    sw = HIGH;
  } else {
    sw = LOW;    
  } 
  digitalWrite(LED_PIN, sw);
}

void setup() {
  pinMode(LED_PIN, OUTPUT);
  Timer1.pause();                   // タイマー停止
  Timer1.setPrescaleFactor(7200);   // システムクロック 72MHzを10kHzに分周
  Timer1.setOverflow(10000);        // 最大値を1秒に設定
 
  Timer1.attachInterrupt(           // 割り込みハンドラの登録
      TIMER_UPDATE_INTERRUPT,       // 呼び出し条件は、カウンターオーバーフロー更新時
      handle_timer                  // 呼び出す関数
    );  
  Timer1.setCount(0);               // カウンタを0に設定
  Timer1.refresh();                 // タイマ更新
  Timer1.resume();                  // タイマースタート
}

void loop() {
}

タイマ毎に使えない端子も出てくるようです。或いは、PWM出力に直接設定することも可能なようです。リファレンスがちょっと見当たらないので残念です。


STM32F103C8T6(BulePill)で外部割込

BulePillの外部割り込み端子(EXTI)は16本有るようです。
https://miqn.net/periph/151.html
コード自体はArduinoリファレンスに則っているようです。


戯言(nonsense)に戻る


問い合わせ頁の表示


免責事項

本ソフトウエアは、あなたに対して何も保証しません。本ソフトウエアの関係者(他の利用者も含む)は、あなたに対して一切責任を負いません。
あなたが、本ソフトウエアを利用(コンパイル後の再利用など全てを含む)する場合は、自己責任で行う必要があります。

本ソフトウエアの著作権はToolsBoxに帰属します。
本ソフトウエアをご利用の結果生じた損害について、ToolsBoxは一切責任を負いません。
ToolsBoxはコンテンツとして提供する全ての文章、画像等について、内容の合法性・正確性・安全性等、において最善の注意をし、作成していますが、保証するものではありません。
ToolsBoxはリンクをしている外部サイトについては、何ら保証しません。
ToolsBoxは事前の予告無く、本ソフトウエアの開発・提供を中止する可能性があります。

商標・登録商標

Microsoft、Windows、WindowsNTは米国Microsoft Corporationの米国およびその他の国における登録商標です。
Windows Vista、Windows XPは、米国Microsoft Corporation.の商品名称です。
LabVIEW、National Instruments、NI、ni.comはNational Instrumentsの登録商標です。
I2Cは、NXP Semiconductors社の登録商標です。
その他の企業名ならびに製品名は、それぞれの会社の商標もしくは登録商標です。
すべての商標および登録商標は、それぞれの所有者に帰属します。