ホーム > ARM, Arduino, mbed > Arduino_STM32 Nucleo STM32F103RB

Arduino_STM32 Nucleo STM32F103RB

2016年02月16日 morecat_lab

Nucleo STM32F103RBでArduino_STM32とmbedを試しました。

nucleo01

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がそのまま使えます。

nucleo02

ツールメニュー →ボード→STM Nucleo F103RB (STLink)を選択します。(重要)

この状態で普通にコンパイルできます。エラーが出る場合は、コンパイラの導入忘れなどが考えられます。

書き込みはstlink経由で行われます。

blink_nucleo

4. 7segduinoライブラリを試す

手元にあったLEDのついたシールド(基板)と拙作の7セグメント用ライブラリを試してみました。

Arduinoコネクタは互換性があるので、ハードウエアは改造なくそのまま使えました。

また、ライブラリも変更なく動作しました。

arduino_stm32_nucleo

プログラムは次のようなものです。

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

(了)

カテゴリー: ARM, Arduino, mbed タグ:
コメントは受け付けていません。