STM32F103を使ってみる
開発環境の構築
STM32には非常にたくさんのバリエーションが有りますが、最近になってSTM32のF103シリーズがArduino-IDEで開発できるこ
とを知りました。
Arduino-IDEで開発するためには、最初にCoreライブラリをインストールする必要が有ります。
Coreライブラリをインストールすることで、STM32でもpinMode()やdigitalWrite()が使えるようになります。
現在、STM32をArduino-IDEで開発するためのCoreライブラリがいくつか公開されています。
こちらにCoreライブラリの
詳しい説明が有ります が、今回は以下の理由で、こちらのMaple
Coreライブラリを使用します。
・当面、F103シリーズだけ使えればいい。
・SPI接続のEthernetモジュールを使ってネットワークに接続したい。
逆に、F103以外を使いたいという方は、こちらのST
Coreライブラリを使うことになります。
ST Coreライブラリはものすごい勢いでサポートボードが増えています。
Maple Coreライブラリを使ってビルドしたファームを、STM32 F103に書き込む方法は以下の4つの方法があります。
・Serial Bootloader
STM32のSystem Memoryには最初からBootloaderが書きこまれています。
マイコンの型番によって、Bootloaderの種類は変わります。
詳しくはこ
ちらに公開されていますが、F103ではUSART1を使った書き込みができます。
USB-TTL変換モジュールをUSART1に接続してファームを書き込みます。
改めてBootloaderを書き込む必要が無いので、Flashの全てをアプリで使うことができます。
書き込む時には毎回、ジャンパーを操作してBOOTモードを変更する必要が有ります。
Serial.printの内容はArduinoのシリアルモニターでは表示できません。
シリアルポート(PA9/PA10)にUSB-TTL変換モジュール経由でTeraTermなどを使う必要が有ります。
下記のSTM32duino Bootloaderを使うときは、一度だけこの方法でSTM32duino
Bootloaderを書き込む必要が有ります。
・STM32duino Bootloader
Bootloaderという名前がついていますが純粋なアプリでFlashに書き込まれ、Flashを少しだけ消費します。
このBoooloaderを書き込むと、オンボードUSBへの入力を監視し、USB経由でファームの書き込みができます。
Serial.printの内容はArduino-IDEのシリアルモニターへ表示されるので、
Arduinoと同じような使い方になりますが、リセットするとSerial.printの出力先を見失います。
Arduinoではシリアルモニター中にリセットしても、引き続きシリアルモニターで表示することができますが、
STM32では、シリアルモニター中にリセットすると、一度シリアルモニターを閉じて、再度開き直す必要が有ります。
書き込む時にBOOTモードの変更は不要で、簡単に書き込むことができますが、
Arduinoのボード選択でボードを間違えると、一発でこのBootloaderを破壊します。
・ST-Link
ST-LINKモジュールを使ってファームを書き込みます。
NUCLEOなど、ST-LINKが動くマイコンか、純正のST-LINKアダプターが必要です。
こちらも、改めてBootloaderを書き込む必要が無いので、Flashの全てをアプリで使うことができます。
書き込む時にBOOTモードの変更は不要で、簡単に書き込むことができますが、
Serial.printの内容はArduinoのシリアルモニターでは表示できません。
シリアルポート(PA9/PA10)にUSB-TTL変換モジュール経由でTeraTermなどを使う必要が有ります。
・Black Magic Probe
こちらの
Probeを使うみたいですが、持っていないので分かりません。
今回はファームの書き込みに、STM32duino Bootloaderを使うことにします。
開発環境のインストールと、STM32duino Bootloaderの書き込みについては以下で非常に詳しく紹介されています。
@https://ht-deko.com/arduino/stm32f103c8t6.html
Ahttp://jh1lhv.hatenablog.jp/entry/2017/01/30/225814
最新の環境では、スケッチブックの保存先にhardwareのフォルダーを作って、そこにArduino_STM32を全てコピーしますが、
スケッチブックの保存先がネットワークフォルダーの時は、ボードへのスケッチの書き込みができません。
スケッチの書き込みを行うと以下のエラーとなります。
Error: Unable to access jarfile maple_loader.jar
@の記事とAの記事の違いは以下の部分です
(1)@はWindows64Bit版、AはWindows32Bit版への導入方法です
(2)@ではBlue Pilll AではBlack Pillが使われています
(3)使用するブートローダー書き込みツール
MapleまたはMaple
miniを使用する場合は、シリアルおよびDFU(デバイスのアップロード)用のドライバーをインストールする必要があります。
Coreライブラリをインストールした後に、drivers\win フォルダにある install_drivers.bat を
([管理者として実行] で) 実行します。
このバッチファイルは実際にはドライバーをインストールしません。
Windowsには、互換性のあるシリアルUSBドライバーとDFU(アップロード)ドライバーがプリインストールされています。
ただし、組み込みドライバーは、MapleシリアルおよびDFUデバイスのUSB IDに関連付ける必要があります
バッチファイルを実行すると、MapleシリアルおよびDFUデバイスのUSB IDに関連付けを行います。
開発ボードが違うと、書き込むブートローダーが変わりますが、オンボードLEDがどのポートに接続されているかの違いだけです。
Blue Pill:generic_boot20_pc13.bin(オンボードLEDはpc13ポート)
Black Pill:generic_boot20_pb12.bin(オンボードLEDはpb12ポート)
Arduino-IDEでスケッチを書き込むときに、オンボードLEDがLチカしますが、
書き込むブートローダーを間違えてもオンボードLEDがLチカしないだけで、ファームの書き込みには影響ありません。
ブートローダーの選択はあまり気にする必要はありません。
オンボードLEDがどこに繋がっているか分からないときは、とりあえずpc13(何でもいい)のブートローダを書き込んでおいて、
ArduinoのLチカスケッチを使って、片っ端からどこに繋がっているか探せばいいです。
ブートローダー書き込みツールとして、CUIの「stm32flash.exe」と、GUIの「Flash Loader
Demonstrator」が紹介されています。
重要なのはCUI/GUIの違いではなく、「stm32flash.exe」はWindows64Bit版しか対応していません。
Windows32Bit版の場合は、無条件に「Flash Loader Demonstrator」を使うしかありません。
なお、GUIの「Flash Loader Demonstrator」はフラッシュサイズを正しく把握できないことが多いです。
フラッシュが128KのSTM32F103RBを以下のように誤認識します。

フラッシュサイズを誤認識した時は、次の画面で正しいサイズを指定する必要があります。

@とAの両方を参考にすれば、間違いなくSTM32F103をArduino-IDEで開発できるようになります。
Windows64Bit版の方はBlue Pill、Windows32Bit版の方はBlack
Pillを使えば、上記の記事のままとなります。
bootloaderを書き込んだ後に、オンボードのUSBをWindowsに接続すると、きちんとCOMポートとして認識します。
Arduino-IDEでツール→シリアルポートを確認すると「Maple Mini」が現れます。
これを選択するとシリアルモニターに以下の様に表示されます。

後はArduinoと同じ手順でスケッチを書き込むことができます。
但しボードの種類とVariantを間違えると、一発でbootloaderを破壊します。
Blue PillとBlack Pillの両方を購入しました。
購入するまでは色と部品実装位置が違うだけだと思っていましたが、以下の様にボードサイズ、ピン数、ピン配置が違います。

Black Pillの方がボードサイズは大きいですが片側17ピン、一方Blue Pillは片側20ピンです。
Black Pillのページ
http://wiki.stm32duino.com/index.php?title=Black_Pill
「Comparison with the Blue Pill」のセクションにBlue Pillとの違いが記載されています。
なぜかこのボードのPinOutは、ほとんど見つかりません。
Blue Pillのページ
http://wiki.stm32duino.com/index.php?title=Blue_Pill
「STM32F103 Pinout」で検索するとこれがヒットします。
Red Pill(入手困難)のページ
http://wiki.stm32duino.com/index.php?title=Red_Pill
Blue Pillに有って、Black Pillに無いのは以下のピンです。
PC14(OCS32_IN)
PC15(OCS32_OUT)
5V(USBの5Vラインと直結)
VBAT(RTC用バッテリーバックアップ)
STM32の各ピンは以下の3つの機能に切り替えることができます。
主機能(リセット後の機能)
代替機能(デフォルト)
代替機能(リマップ)
PC14とPC15には以下の機能が割り当てられています。
|
主機能 |
代替機能(デフォルト) |
代替機能(リマップ) |
PC14 |
ディジタルピン |
OCS32_OUT |
なし |
PC15 |
ディジタルピン |
OCS32_IN |
なし |
OCS32_IN/OCS32_OUTの動作について調べてみましたが、どうやら低速発振子を取り付けるためのポートのようで
このポートが無くても、ディジタルピンが2つ使えないだけなので、あまり問題ないと思います。
Black
Pillでは5Vピンが無いので、5Vで動作するモジュールやセンサーへの給電がボードから直接できないのが一番大きいかもしれません。
NANO、ProMiniと比べると以下の様になります。
ATMEGA328PとSTM32F103CのCPUサイズはほぼ同じですが、ATMEGA328Pは32ピン、STM32F103Cは48ピン
のCPUです。

BluePill BlackPillともにLeafLabs
のMaple Miniと互換性がある(はずな)のでこ
ちらのドキュメントが参考になります。
これ以降、主にMaple Coreに含まれているライブラリーを中心に紹介します。
続く...