STM32のFreeRTOSを使ってみる

Arduino-IDE STコアの使い方


STコア用のFreeRTOSがこ ちらで公開されています。
そもそもArduino-IDEでSTコアをほとんど使ったことが無かったので、まずはSTコアの使い方を紹介します。
最初にこち らの ページに従って、Arduino IDEのボードマネジャーを使って、Arduino_Core_STM32(通称STコア)を組み込みます。
このコアライブラリはものすごい勢いでサポートするMCUが増えています。
サポート予定のリストがこ ちらで公開されています。

STコアのバージョン2.0から、IDEの環境ページに登録する追加ボードマネジャーのURLが変わりました。
URLが古いと以下の様に表示されます。


こちらがURLを変更した後の表示です。


Arduino-IDEでSTコアを使う場合、ファームの書き込みにはST-Linkを使います。
NucleoやDiscoveryなど「STLink Virtual COM Port」が使えるボードが必要です。
中華ST-LINKでもファームをアップデートすれば、使えるのかもしれませんが、
手元の中華ST-LINKはファームのアップデートができませんでした。

いきなり「STLink Virtual COM Port」が使えるボードをUSBに繋げても認識しません。
こ ちらのUSB Driverをインストールする必要が有ります。
よく似たドライバーがこ ちらに有りますが、WIndows7用です。Windows10では動きません。


ドライバーのインストールが終わると、以下の様に新しいCOMポートが出現します。



STLink Virtual COM Portを認識したら、
ツール→ボードでターゲットボードのカテゴリーを指定し、ツール→Board part numberにターゲットのボードを指定します。
これを間違えると正しいファームができません。
ツール→Upload methodにSTM32CubeProgrammer(SWD)を指定すれば、ターゲットのボードにファームを書き込むことができます。


NUCLEOシリーズはPA5がオンボードLEDなので、PA5をLチカすればオンボードのLEDがLチカします。



Nucleoを書き込み装置として使えば、BluePillやBlackPillのST-LINK専用ピンを使って、スケッチを書き込むことがで きます。
こ ちらこ ちらにNucleoを書き込み装置として使う場合のジャンパーピンの切り替えと、SWDポートのピンマップが公開されています。
NucleoのSWDポートの1番ピンは出力ではなく、Vref入力です。
3V出力ピンは下の写真の位置です。


ツール→ボードに「Generic STM32F1 series」を指定すれば、BluePillやBlackPillにファームを書き込むことができます。




Maple Core用のBootLoaderが書き込まれているBluePhillやBlackPillでは、以下の様なエラーとなる事が有ります。
      -------------------------------------------------------------------
                       STM32CubeProgrammer v2.0.0                 
      -------------------------------------------------------------------

ST-LINK SN  : 066EFF534951775087182628
ST-LINK FW  : V2J33M25
Voltage     : 3.25V
Error: No STM32 target found!

このエラーが出たときは、NucleoのnSRTSピン(ボード上のSWDポートのPin#5)と、BluePhillやBlackPillの RESETピンを
繋げてやると、正常に書き込みができるようになります。
下の写真の黄色のジャンパーがRESETです。


一度書き込みが成功すると、これ以降はRESETを繋がなくても、書き込みができるようになります。



こちらのボードは20ピンのJTAG/SWDポートを持っています。
SWDポートのピン配置はこ ちらに有りますが、SWDIOとSWCLKを使って書き込みを行うことができます。
このボードも最初は全く書き込みができませんでしたが、RESETをつなげてやると書き込みができるようになりました。




こちらのボードはMapleMiniのクローンです。


ST-LINK専用ピンも、JTAG/SWDポートも有りませんが、以下のピンをSTLinkで使うことができます。
ST-LINK MapleMini
SWDIO PA13
SWCLK PA14

MapleMiniのピン配置はこちらが 見やすいです。
これも、最初は全く書き込みができませんでしたが、RESETを繋げたら解決しました。



こちらのボードはMapleのクローンです。


ボード上にST-LINK用のピンが出ていますが、マーキングが分かりずらいです。
ST-LINK Maple
SWDIO TMS
SWCLK TCK

これも、最初は全く書き込みができませんでしたが、RESETを繋げたら解決しました。
ピンマップはこちらが 見やすいです。



こちらのボードにはC8T6が実装されています。
ST-LINK専用ピンは有りますが、RESETピンが有りません。
この様なボードでエラーになるときは、実際に書き込みを行う直前までRESETボタンを押し続けて、
書き込みの直前でRESETボタンをリリースすると正常に書き込みできます。
但し、ボタンをリリースするタイミングが難しいので、
新しいボードを買うときは、RESETピンが有るボードを買った方がいいです。




STコアではF4ボードもサポートしています。
F4 Dicovery(STM32F407VG)を使う場合、スケッチ書き込み時に以下を指定すれば、このボードにファームを書き込むことができます。


F4 Dicovery(STM32F407VG)にはオンボードに4つのLED(PD12 PD13 PD14 PD15)が実装されています。
以下のコードでオンボードのLEDがLチカします。
static int led[] = {PD12, PD13, PD14, PD15};

// the setup function runs once when you press reset or power the board
void setup() {
  Serial.begin(115200);
  while(!Serial);
  Serial.println("Blink start");
  for(int i=0;i<4;i++) pinMode(led[i], OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  static int pin = 0;
  Serial.println(" LED=" + String(led[pin]));
  digitalWrite(led[pin], HIGH);
  delay(100);
  digitalWrite(led[pin], LOW);
  delay(100);
  pin++;
  if (pin == 4) pin = 0;
}



Nucleoを書き込み装置として、こちらのF407 VGT6(DIYMORE_F407VGT)に書き込んでみました。
このボードはSTMのF4 Discoveryと互換性が有りますが、値段は1/3です。


ボード表面のマーキングは「diymroe」とスペルが間違っていますが、裏面のマーキングは「DIY MORE」です。
こちらがホームページですが、なかなか面白いボードを開発・販売 しています。


このボードにはST-LINK専用ピンは有りませんが、以下のピンをST-LINKで使うことができます。
ST-LINK F407VGT6
SWDIO PA13
SWCLK PA14



ツール→ボードに「Generic STM32F4 series」を指定すれば、このボードにファームを書き込むことができます。
上の写真でLED2が光っていますが、LED2はPE0に繋がっています。


使う際にはBOOT0ピンにジャンパーが必要になります。




BluePillやBlackPillなど、Boot0/Boot1セレクターを持っているボードでは、
USB-シリアルアダプターを使ってファームを書き込むことができます。
Boot0をISPブートモードに変更し、USB-シリアルアダプターのTX/RXをSTM32のUARTポートに接続します。
ISPブートモードについては以下で詳しく紹介されていますので、ここでは省略しますが、
ISPブートモードを使うと、母艦となるNucleoは必要ありません。
ISPブートモードについては以下に詳しい説明が有ります。

https://ht-deko.com/arduino/stm32f103c8t6.html
http://jh1lhv.hatenablog.jp/entry/2017/01/30/225814

ISPブートモードでは、以下の指定でファームを書き込むことができます。
ファームを書き終わったら、Boot0をFLASH Bootモードに戻す必要が有ります。




STコアの1.6以降では、BluePillやBlackPillなどのSTM32F103ボードに対して、Maple DFU Bootloaderを使ってファームを書き込めるようになりました。
Maple DFU Bootloaderはこ ちらで公開されていますが、サポートしているのはSTM32F103だけです。
Maple DFU Bootloaderの書き込み方は以下で詳しく紹介されていますので、ここでは省略しますが、
Maple DFU Bootloaderを使うと、母艦となるNucleoは必要ありません。

https://ht-deko.com/arduino/stm32f103c8t6.html
http://jh1lhv.hatenablog.jp/entry/2017/01/30/225814

Maple DFU Bootloaderを書き込んだボードをUSBでWindowsPCに接続すると、新しいCOMポートが出現します。
以下の指定でファームを書き込むことができますが、Board part numberを間違えると一発でBootloaderを破壊します。
私はよく間違えるので、この方法は使っていません。




この様な中華STLinkモジュールを安価($2程度)に入手することができます。


ひと手間掛かりますが、この中華STLinkを使ってファームを書き込むことができます。
最初にArduinoの環境設定で「より詳細な情報を表示する」にチェックを入れます。


ボードを選んでスケッチをコンパイルします。
コンパイルが終わると、Arduino-IDEの以下の所にビルドされたhexファイル名が表示されます。


ビルドされたHEXファイルができています。


中華STLinkとターゲットボードを接続したらST-LINK Utilityを起動し、Target→Connectで接続します。


Target→ProgramのBrowseボタンでHEXファイルを指定し、
Startボタンを押せばArduino-IDEでビルドしたHEXファイルを書き込むことができます。




STコアのバージョンは以下のスケッチで確認することができます。
今のところ、バージョンを判定してコードを振り分けるような事態には遭遇していません。
void setup() {
  Serial.begin(115200);
}

void loop() {
  Serial.print("STM32_CORE_VERSION:");
  Serial.print(STM32_CORE_VERSION_MAJOR);
  Serial.print("-");
  Serial.print(STM32_CORE_VERSION_MINOR);
  Serial.print("-");
  Serial.print(STM32_CORE_VERSION_PATCH);
  Serial.print(".");
  Serial.println(STM32_CORE_VERSION_EXTRA);
  delay(1000);
}

続く....