Arduino_STM32を試すArduino_STM32
開発中のArduino STM32を試しました。ARM (STM32)が搭載されているボードをArduinoで開発することが出来ます。
まだ日本語による情報が少ないので、一例を紹介します。
1. はじめに
巷で大流行りのArduinoですが、最近複数のプラットフォームを同時にサポートする仕組みが導入されました。
ARM Coretex-M3向けの拡張で、Arduino STM32プロジェクトもその一つです。開発を終えてしまったleaflab Mapleの資産を活用して、開発が進められています。
現在のところ、STM32アーキテクチャのCPUのうち、STM32F1シリーズと、GD32F1シリーズが対象です。
また、開発中のためライブラリの動作検証が済んでいないものが多いようです。コアに含まれている部分は動作しているようです。
2. 情報源
Arduino STM32プロジェクトの主な情報源は次の通りです。
- Arduino_STM32 (github)
- Arduino_STM32 (Wiki)
- サポートフォーラム
- プロジェクト主催者Roger Clark氏のホームページ
- STM32duino-bootloader (github)
3. 対応するハードウェア
Arduino STM32対応のハードウェアとしては、以下があげられています。
ボード | 特徴 | 価格 | 備考 |
leaflabs Maple / Maple mini クローン | Arduino STM32の標準的なボード | $5.00前後 | ebayやaliexpressで安価に入手可能 |
Nucleo-F103RB | ドラッグ&ドロップでプログラムできるデバッカが付いている | 1500円程度 | 一枚でArduino / mbedが使えるユニバーサルなボード |
一般的なSTM32コアのCPUボード | ピン配置など千差万別 | – | スイッチ及びLEDピンの定義のあったブートローダを導入すること |
STBee | フラッシュが大きな割には安価
JTAGコネクタがついている |
3000円 | 12MHzのクリスタルが付いている
(クロックの違いはブートローダで吸収) |
4. 導入方法(STBeeの例)
ここでは、STBeeをArduini STM32から使用する方法を記載します。
4.1 Arduino IDEの準備
Arduino IDE 1.6.4または1.6.5を利用します。(重要)
必ずArduino 1.6.5系を利用して下さい。
Arduino 1.6.6はサポートされていません(2016年1月)
Arduino STM32の導入方法については、Wikiのインストール方法説明に記載されています。
主な、手順は次の通りです。
(1) Arduino IDEにCortex-M3環境(Arduino SAM Boards)を導入する。
コンパイラなどはこのパッケージのものを利用するため、このパッケージを入れておきます。
導入手順は次の通りです。
- ツール -> ボード -> Board Managerを選択
- Arduino SAM Boards (32-bits ARM Coretex-M3) by Arduinoを選択
- Installボタンを押下
(2) Arduino-STM32パッケージを手動で導入する。
- Arduino-STM32パッケージをダウンロードして展開する。
- 展開したフォルダーをArduinoのフォルダー配下に移動する。
~/Documents/Arduino/hardware (MacOSXの場合)
4.2 ターゲットボードの準備
JTAGやシリアル経由でブートローダ(STM32duino-bootloader)をボードに書き込みます。
一度だけ実施すれば、あとはUSB経由でArduino IDEからプログラムを書き込めます。
ここでは2つの方法を紹介します。
- シリアルインタフェース経由で書き込む
内蔵ブートローダを使って、シリアルインタフェース経由で書き込みます。
USB-シリアル変換アダプタ(FTDIアダプタ等)を用意する必要があります。
MacOSXでシリアル経由でターゲットボードにブートローダを書き込む
1. stm32flashを導入する(MacOSXではArduino_STM32に含まれるバージョンが必要です)
https://github.com/rogerclarkmelbourne/Arduino_STM32/tree/master/tools/src/stm32flash_serial/src
2. FTDIアダプタを経由して、ターゲットボードのシリアルと接続する
各RXとTXをクロスでつなぎます。
3. ターゲットボードを内蔵ブートローダを起動するように設定する
BOOT0ジャンパーをH(1)に設定する。BOOT1ジャンパーをL(0)に設定する
4. stm32flashで対応するブートローダを書き込む
$ stm32flash -w stbee_boot20.bin /dev/cu.usbserial-XXXXXX stm32flash Arduino_STM32_0.9 http://github.com/rogerclarkmelbourne/arduino_stm32 Using Parser : Raw BINARY Interface serial_posix: 57600 8E1 Version : 0x22 Option 1 : 0x00 Option 2 : 0x00 Device ID : 0x0410 (Medium-density) - RAM : 20KiB (512b reserved by bootloader) - Flash : 128KiB (sector size: 4x1024) - Option RAM : 16b - System RAM : 2KiB Write to memory Erasing memory Wrote address 0x08001b7c (100.00%) Done.
5. ターゲットボードのジャンパーBOOT0をL(0)に変更してUSBで接続する。
- JTAG経由で書き込む
JTAGコネクタを経由して、OpenOCDを使って書き込みます。
MacOSXでARM-USB-OCD JTAGアダプタ経由でOpenOCDを使ってブートローダを書き込む
1. mac portsなどでOpenOCDを入る
$ sudo port install openocd
2. FTDIドライバーのアンロード
$ sudo kextunload /System/Library/Extensions/FTDIUSBSerialDriver.kext
3. 書き込み
$ openocd -f flash.cfg
書き込みスクリプト例(flash.cfg)
なお、Arduino_STM32ブートローダをStBEE用に改造したものは、既に本家githubに反映させています。
4.3 IDEからのスケッチの書き込み方法
(1) IDEでボードを選択する
- ツール -> ボード -> Generic STM32F103V Seriesを選択
- ツール -> Variant -> STM32F103VEを選択
- ツール -> Upload Method -> STM32duino bootloaderを選択
(2) ボードをDFUモードに設定する
ボード上の「USRスイッチ」を押しながらリセットすると、パソコンからの書き込みを受け付けるDFUモードに入ります。
- 正しくDFUモードに設定されると、オンボードLEDが1秒間隔で点滅します。
- USRスイッチを押さないでリセットすると、約2-3秒だけDFUモードになります。その後書き込まれているスケッチが動きます。
(3) Blinkの書き込み
BlinkではLED出力ピンを指定する必要があります。STBeeの場合には、LEDはPD4に接続されていて、Lで点灯しHで消灯します。
#define LED PD4 // the setup function runs once when you press reset or power the board void setup() { // initialize digital pin LED as an output. pinMode(LED, OUTPUT); } // the loop function runs over and over again forever void loop() { digitalWrite(LED, HIGH); // turn the LED on (HIGH is the voltage level) delay(500); // wait for 1/2 second digitalWrite(LED, LOW); // turn the LED off by making the voltage LOW delay(500); // wait for 1/2 second }
書き込みがうまくできると次のようなメッセージがArduino IDEのコンソールに出ます。
スケッチが プログラムストレージ領域の 14,012バイト (2%) を使用しています。最大は 524,288バイト です。 グローバル変数は 2,936バイトの動的メモリを使用しています Failed to open serial device. dfu-util: Invalid DFU suffix signature dfu-util: A valid DFU suffix will be required in a future dfu-util release!!! dfu-util 0.8 Copyright 2005-2009 Weston Schmidt, Harald Welte and OpenMoko Inc. Copyright 2010-2014 Tormod Volden and Stefan Schmidt This program is Free Software and has ABSOLUTELY NO WARRANTY Please report bugs to dfu-util@lists.gnumonks.org Deducing device DFU version from functional descriptor length Opening DFU capable USB device... ID 1eaf:0003 Run-time device DFU version 0110 Claiming USB DFU Interface... Setting Alternate Setting #2 ... Determining device status: state = dfuIDLE, status = 0 dfuIDLE, continuing DFU mode device DFU version 0110 Device returned transfer size 2048 Copying data from PC to DFU device Download [ ] 0% 0 bytes Download [=== ] 12% 2048 bytes Download [====== ] 25% 4096 bytes Download [========= ] 38% 6144 bytes Download [============ ] 51% 8192 bytes Download [=============== ] 63% 10240 bytes Download [=================== ] 76% 12288 bytes Download [====================== ] 89% 14012 bytes Download [=========================] 100% 14012 bytes Download done. state(8) = dfuMANIFEST-WAIT-RESET, status(0) = No error condition is present Done! Resetting USB to switch back to runtime mode
MacOSX El Capitanではオートリセットが機能しないようです。
書き込み後、うまくリセットされない場合には、ボード上のリセットボタンを押下してください。
ライブラリの利用方法についても、機会があれば書きたいと思います。
(了)