Arduino_STM32 Nucleo STM32F103RBArduino_STM32 w/ Nucleo STM32F103RB
Nucleo STM32F103RBでArduino_STM32とmbedを試しました。
1. 準備するもの
以下のものが必要です。今回は半田ごてが要りませんでした。
- Nucleo STM32F103RB
- Mini-USBケーブル
- パソコン(ここではMacを使いました)
Nucleoは種類が非常にたくさんありますが、現在確認が取れているものはNucleo STM32F103RBだけです。
2. 導入方法
パソコンにArduino_STM32を導入します。
githubからソースコードを落としてきて、手動でインストールが必要です。具体的な方法は、前々回の記事や、Arduino_STM32開発者のRogerのwikiを参照してください。
必ずArduino 1.6.5系を利用して下さい。
Arduino 1.6.6はサポートされていません(2016年2月)
今回試す範囲では、基板の改造は不要です。また、ブートローダの書き込み作業も不要です。
3. 書き込みテスト(Lチカ)
基板上のLEDで動作の確認をします。
Nucleo STM32F103RBのオンボードLED(LD2)はArduinoと同じくD13につながってるので、サンプルのblinkがそのまま使えます。
ツールメニュー →ボード→STM Nucleo F103RB (STLink)を選択します。(重要)
この状態で普通にコンパイルできます。エラーが出る場合は、コンパイラの導入忘れなどが考えられます。
書き込みはstlink経由で行われます。
4. 7segduinoライブラリを試す
手元にあったLEDのついたシールド(基板)と拙作の7セグメント用ライブラリを試してみました。
Arduinoコネクタは互換性があるので、ハードウエアは改造なくそのまま使えました。
また、ライブラリも変更なく動作しました。
プログラムは次のようなものです。
/*** Hello 7seg Arduino_STM32 nucleo version **/ #include <Sseg.h> // A B C D E F G DP 1 2 3 4 Sseg mySseg = Sseg(D2, D3, A0, D5, A1, A2, A3, D6, D13, D11, D10, D8); uint8_t hello[] = { 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b01101110, // H 0b10011110, // E 0b00011100, // L 0b00011100, // L 0b00111010, // o 0b00000000, // NUM_PAT_A, // A 0b00001010, // r NUM_PAT_D, // d 0b00111000, // u 0b00100000, // i 0b00101010, // n 0b00111010, // o 0b00010000, // _ 0b10110110, // S 0b00011110, // t 0b10011110, // m, well, actually 'E' NUM_PAT_3, // 3 NUM_PAT_2, // 2 0b00000001, // . }; int p = 0; void setup() { mySseg.begin(); } #define OVERWRAP(a, x) (((x) < sizeof(a)) ? (a[(x)]) : a[((x) - sizeof(a))]) void loop() { if ((++p) > sizeof(hello)) p = 0; mySseg.writeRawData( OVERWRAP(hello, p), OVERWRAP(hello, p+1), OVERWRAP(hello, p+2), OVERWRAP(hello, p+3)); mySseg.updateWithDelay(200); }
フラッシュのサイズは7.3K(使用率6%)になりました。
5. mbedと同時に使えるプラットフォ−ム
mbedでも7segduinoライブラリを使ったプログラムが動作します。
実際に次のプログラムで試しました。
- 機能はArduino_STM32版と同じですが、表示するメッセージだけ変更しました。
- mbedコンパイラでは2進数の定数(0bxxx)が使えないので、16進数に変更しています。
/*** Hello 7seg mbed nucleo version */ #include "mbed.h" #include "Sseg.h" // A B C D E F G DP 1 2 3 4 Sseg mySseg = Sseg(D2, D3, A0, D5, A1, A2, A3, D6, D13, D11, D10, D8); char hello[] = { 0x00, 0x00, 0x00, 0x00, 0x6e, // 0b01101110, // H 0x9e, // 0b10011110, // E 0x1c, // 0b00011100, // L 0x1c, // 0b00011100, // L 0x3a, // 0b00111010, // o 0x00, // 0b00000000, // NUM_PAT_E, // M, well, actually 'E' NUM_PAT_B, // b NUM_PAT_E, // e NUM_PAT_D, // d 0x01, // 0b00000001 // . }; #define OVERWRAP(a, x) (((x) < sizeof(a)) ? (a[(x)]) : a[((x) - sizeof(a))]) int main() { mySseg.begin(); while(1) { for (int p = 0 ; p < sizeof(hello) ; p++) { mySseg.writeRawData( OVERWRAP(hello, p), OVERWRAP(hello, p+1), OVERWRAP(hello, p+2), OVERWRAP(hello, p+3)); mySseg.updateWithDelay(200); } } }
オンラインコパイラでコンパイルして、出来たバイナリーをデスクトップのストレージにドラッグ&ドロップするだけで書き込みできます。
フラッシュサイズは14kBになりました。いろいろライブラリがリンクされているためだと思われます。STM32F103RBの場合には、フラッシュサイズが大きいので、この程度は誤差だと思います。
6. まとめ
Nucleo STM32F103RBを使うと、Arduino_STM32とmbed環境で開発ができることを確認しました。
これまで試したArduino_STM32のプラットフォームの中で、Nucleoが最も簡単でした。
但し、開発途中のため、ライブラリなど動作しないものがあるようです。
例えば、Arduinoでは標準的に使われるUSB経由のシリアルコンソールなどは改造が必要になります。
クリスタルが実装されていないため、内部のRC発振回路で動作しています。
(@Sabotenboyさんからの情報で、STLINKからクロックをもらい動作しているようです。)
(了)