mbed-cliインストールまでの準備が完了した状態から、mbed OS 2用のプログラムを作成しています。
mbed new mbed-classic-program --mbedlib
mbed os 2のzipファイルダウンロードが試行されますが、困ったことに、かなり高確率で失敗します。失敗する場合は、コマンドを何度か試みてください。
最新版のzipファイル.rev-65be27845400.zipがダウンロードされてmbed os 2のコンパイル済の.oファイルに展開されれば成功です。しかし、またしても困ったことにこのままではコンパイルには失敗します。
https://os.mbed.com/users/mbed_official/code/mbed/から、以下のファイルをダウンロードして、mbed-classic-program/mbed/65be27845400/に配置してください。
- mbed.h
- drivers
- hal
- platform
さらに、mbed-classic-programの階層で以下のコマンドを使用して、mbed tool を取得します。
mbed deploy
すると、mbed-classic-program/.tempの中にpythonで書かれたmbedツールがダウンロードされます。
次に、mbed_settings.pyをテキストエディタで開いて
# GCC_ARM_PATH = (略)
となっている箇所を以下のようにして、GCCコンパイラのパスを入れます。
GCC_ARM_PATH = "C:/Program Files (x86)/GNU Tools ARM Embedded/9 2019-q4-major/bin"
(ディレクトリの区切り記号はバックスラッシュ”\”を使うと、動作に失敗するので、スラッシュ”/”を使う必要があります。)
mbed-classic-program/の階層で以下のコマンドを入力します。
mbed target LPC11U35_501
mbed toolchain GCC_ARM
これで、mbed-classic-program/.mbedの中にテキストで以下の内容が生成されます。
TOOLCHAIN=GCC_ARM
ROOT=.
TARGET=LPC11U35_501
ようやく、プログラムを書く準備が整いました。
これで、基本的な、所謂「Lチカ」のプログラムを書いてみます。
mbed-classic-program/の階層にテキストファイルmain.cppを作成し、以下のソースコードを書き込みます。
#include "mbed.h"
DigitalOut led(P0_7); // 秋月LPC11U35ボードに搭載されているLEDに対応した出力ポートを設定
int main(void)
{
for(;;){ // 無限ループ
led = 0; // 300msLEDを消灯
wait_ms(300);
led = 1; // 300msLEDを点灯
wait_ms(100);
}
return 0;
}
mbed-classic-program/の階層でpowershell等を開いて以下のコマンドを入力します。
mbed compile
コンパイルが成功すると、mbed-classic-program/BUILD/LPC11U35_501/GCC_ARM/の中にbinファイルが生成されます。これを秋月LPC11U35ボードに書き込んで、LEDが点滅すれば成功です。
なお、出力ピンの設定をレジスタ直打ちしたい場合は、以下のようにします。
#include "mbed.h"
int main(void)
{
// port0_7の初期設定
LPC_IOCON->PIO0_7 = 0; // port0_7をGPIOに設定
LPC_GPIO->DIR[0] |= (1<<7); // port0_7をGPIOの出力に設定
for(;;){ // 無限ループ
LPC_GPIO->W0[7] = 0; // port0_7をLowレベル
wait_ms(300);
LPC_GPIO->W0[7] = 1; // port0_7をhighレベル
wait_ms(100);
}
return 0;
}
この設定で、port0_7はプッシュプル型の出力回路になりますので、そのままhigh, lowを切り替えてやればLEDが点灯・消灯できます。
状態確認・デバッグ等にUSBシリアルを使用すると便利なので、その機能を足してみます。
mbed-cliのガイダンスに従うと、以下のコマンドでUSBシリアルに対応したライブラリが取得できるはずですが、現在ではうまく機能していないのか、対応したUSBシリアルの名称が間違っているのか、ダウンロードできませんでした。
mbed add (ライブラリ名)
なお、筆者が作成した、USBライブラリ付のファイル一式は以下にアップしております。
https://github.com/dkfukuyama/Weight_strain_gauge/releases/tag/aki_lpc11u35_02
main.cppの例として以下のように入力します。
#include "mbed.h"
#include "USBSerial.h"
USBSerial usb(0x1f00, 0x2012, 0x0001, false);
int main(void)
{
LPC_IOCON->PIO0_7 = 0;
LPC_GPIO->DIR[0] |= (1<<7);
while(!usb.connected()); // USBにてPCと接続できるまで待つ
// 適当に文字を出力
usb.printf("-------------------------------------\r\n");
usb.printf("SYSTEM START\r\n");
usb.printf("-------------------------------------\r\n");
// LED点滅ループ
for(;;){
LPC_GPIO->W0[7] = 0;
wait_ms(300);
LPC_GPIO->W0[7] = 1;
wait_ms(100);
}
return 0;
}
これでコンパイルを行い、秋月LPC11U35ボードに書き込みます。
Teraterm等でUSBシリアルの出力を表示しながら、プログラムを動かすと、秋月LPC11U35ボードからのテキスト出力とともに、LED点滅が始まることが確認できます。