ARMマイコンの“ベアメタルLチカ”に挑戦:「mbed」で始めるARMマイコン開発入門(11)(3/3 ページ)
ARM「mbed」の開発環境にはクラスライブラリが用意されており、ターゲットマイコンの種類を問わない開発が可能ですが、ハードウェアを直接たたくベアメタルの手法でも開発が可能です。バイナリ軽量化を図れるベアメタル開発について勉強します。
ベアメタル的なLチカに挑戦
下のリスト2がベアメタル的Lチカのプログラムです。動作自体はリスト1に示したプログラムと変わりません。
それではリストを見ていきましょう。
1:#include "mbed.h" 2:int main(void){ 3: LPC_GPIO0->DIR =0x00000080; //PIO0_7のみ出力ポート 4: while(1){ 5: LPC_GPIO0->DATA&=~0x0000080; 6: wait(0.4); 7: LPC_GPIO0->DATA|= 0x0000080; 8: wait(0.4); 9: } 10:}
メイン関数の3行目でLPC_GPIO0->DIRが指し示すアドレスにあるレジスタに、0x00000080を代入しています。これによりPIO0_7番ピン(ピンの表記はmbedとは異なります。理由は後述)を出力ピンに設定します。LPC_GPIO0->DIRはGPIO0ポートのGPIOの入力あるいは出力を設定するためのレジスタです。mbedクラスライブラリを使った場合は1本ごとに入出力を設定できましたが、レジスタへ直接アクセスする場合は、ポート単位に設定します。
ポートとはGPIOのいくつかのピンをまとめたもので、ピンアサイン図で示したPIO0_0からPIO0_11までの計12本のピンをこのレジスタで入出力の設定ができます。
LPC_GPIO0->DIRの下位12ビットが12本のGPIOの入出力に対応しており、1が書き込まれていると出力、0の場合は入力となります。ちなみにPIO0_7番ピンを出力に設定するためには、このレジスタの7ビット目(最下位ビットを0として数える)に1を書き込みます。
5行目と7行目でPIO0_7の出力を設定しています。5行目では0、7行目では1が出力されます。LPC_GPIO0->DATAが指し示すレジスタの値がGPIOのピンの値(0または1)となります。これも先ほどのLPC_GPIO0->DIR同様、下位12ビットが12本のGPIOピンの値に対応しています。PIO0_7番ピンを1にするためには、このレジスタの7ビットに1を書き込みます。
5行目の7bit目に0を書き込みたい場合、LPC_GPIO0->DATA&=~0x0000080;とします。クラスライブラリ「DigitalIn」を使ってGPIOを操作する場合はそれぞれのピン単位で操作ができましたが、レジスタを直接操作する場合はポート単位となります。ポートの他のピンの値は変えないで指定したピンのみ値を設定したい場合、このような式を使います。
7行目も同様に7bit目にだけ1を書き込みたい場合は、LPC_GPIO0->DATA|= 0x0000080;とします。ところでピンの名前は今まで慣れ親しんだmbed環境での呼び方とベアメタルの呼び方とでは多少異なるようです。ベアメタルのPIO0_7はmbedではLED2またはdp28となります。
LPC1114のメーカーであるNXPセミコンダクターが提供する開発ツール「LPCXpresso 統合開発環境」で使われているシンボルのいくつかはmbedでも使えるようです。ベアメタルといってもmbedでのコンパイルの方法や、書き込み方は今までのクラスライブラリを普通に使う方法と変わりません。
プログラムが完成したら、試しにコンパイルしてバイナリの容量を見てみましょう。1KBくらいではないでしょうか。クラスライブラリを使う場合と比べて、随分コンパクトになりましね。waitの引数に浮動小数点を使わないwait_msなどにすればさらにコード数を減らせるかもしれません。お試しください。
おわりに
今回は直接GPIOのレジスタにアクセスしてGPIO出力を制御しました。この様にクラスライブラリーを使わない方法をベアメタルと呼び、実行ファイル(バイナリ)の容量をかなり抑えられるのは組み込み機器開発にとって大きなメリットと言えます。その反面、ターゲットマイコンのメーカーが異なったり、同じメーカーでもシリーズが異なるとソースコードの互換性がなくなることに注意が必要です。
今回は実行ファイルの容量の差に着目しましたが、次回はベアメタルによるI/Oのスピードについて議論してみたいと思います。お楽しみに。
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- シリアル割り込みを使って、2つのプログラムを並行動作させる
“割り込み”の概念を理解することで、複数のプログラムを並行しているかのように処理できますが、その方法はタイマーを使うだけではありません。今回はシリアル割り込みを使った並行動作について学びます。 - 「割り込み」を理解してタイマーを使いこなす
ARMマイコン「LPC1114」には周辺機器としてタイマーが搭載されており、“割り込み”の概念を理解することで、複数のプログラムを並行しているかのように処理できます。 - ARMマイコンからのPWM出力でLEDを“ボヤっと”光らせる
デジタルの出力は本来「0」か「1」ですが、PWM出力を用いれば疑似的なアナログ出力を得ることができます。ARMマイコン「LPC1114」を使って、LEDを“ボヤっと”光らせてみたり、サーボモータの制御に挑戦してみましょう。