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からクロックをもらい動作しているようです。)
(了)



