ARMマイコン「LPC1114」にはさまざまな周辺デバイス(ペリフェラル)が内蔵されていますが、今回は最も基本的な周辺デバイスの1つ、GPIOの出力について勉強します。
この連載では、組み込みの世界で最も成功したプロセッサの1つ「ARM」を用いたマイコン開発にチャレンジします。取り上げているマイコン「LPC1114」にはさまざまな周辺デバイス(ペリフェラル)が内蔵されており、前回はprintfデバッグに欠かせないシリアルポートの使い方について解説しました。
今回はLPC1114のペリフェラルの中で最も基本的な機能の1つ、「GPIO」の使い方について勉強します。GPIOとはGeneral Purpose Input/Outputの略で日本語では汎用入出力端子と呼ばれます。その名の通り、出力と入力の機能を持っていますが、今回はその出力についてお話します。
図1がLPC1114のピンアサインを示したものです。外側の水色のピンがGPIOとして使えるピンです。基本的には「dp1」から「dp28」までLPC1114のピン番号に対応した名前が付けられていますが、その中の電源、水晶接続やデバッグ用など特殊な用途で使われているピンは使えません。
それとdp5とdp27はオープンドレイン(ドレイン端子が他につながっていない状態)となっています。これは後述しますがLチカプログラムの場合だと他のピンと同じようにLEDをつないでも点滅しません。
図2がLPC1114のブロックダイヤグラムです。今回取り上げるGPIOはAHB-LITE BUSに直接つながっているHIGH-SPPED GPIOブロックです。他のペリフェラルはAHT TO APB BRIDGEを介してつながっているのに対して、GPIOはAHB BUSに直接つながっていますので、工夫次第で高速制御が期待できます。
今回はLPC1114がGPIOとして備えたピンを出力として、プログラムから制御するためのクラスとその使い方を紹介します。それが「DigitalOut」クラスで、mbedが提供するクラスライブラリーに含まれます。このクラスを使ってプログラムからGPIOを制御します。
なお回路図とブレッドボードへの実装は前回紹介したものがそのまま使えます。ビルドや書き込みの方法についても以前の記事をご参照ください。
リスト1に試すプログラムを示します。これは新規にプログラムを作成するときにテンプレートを「mbed_blinky」に選択すると、自動的に生成されるソースコードです。
1:/******* list 1 ********/ 2: 3:#include "mbed.h" 4:DigitalOut myled(LED1); 5:int main() { 6: while(1) { 7: myled = 1; 8: wait(0.2); 9: myled = 0; 10: wait(0.2); 11: } 12:}
3行目のinclude文はmbedを使うための様々な定義が収められているヘッダファイル(mbed.h)をソースコード中に取り込んでいます。LPC1114の14番ピンをLED1というシンボルでプログラム中から使えるのも、このヘッダーファイルに定義されているおかげなのです。
4行目はDigitalOutというクラスのインスタンスをmyledという名前で生成しています。その際の引数として使用するピン名を指定しています。つまりLED1(dp14でも同じ)ピンをGPIOの出力ピンとして使うことを宣言しています。この宣言文以降はこのピンをmyledという名前で扱うことができます。
5行目から12行目まではmain関数で、LPC1114の電源投入時(あるいはリセット時)にこの関数が真っ先に呼び出されます。main関数の中身は無限ループで、myledに1をセットし、0.2秒間を空けて今度はmyledに0をセットし、また0.2秒間待つという処理を繰り返します。
myledに1をセットするということは、LED1あるいはdp14に関連付けられているLPC1114の14番ピンを1にするということです。このピンを1にするというのはLPC1114に印加されている電源電圧にほぼ近い電圧を出力するということです。また0の場合は0Vに近い電圧を出力します。
結果としてこのピンに抵抗を介して発光ダイオードが接続されているとすれば、ピンが1のとき点灯し、0のとき消灯します。これをそれぞれ0.2秒間隔で繰り返すわけですから0.4秒の周期で発光ダイオードが点滅するわけです。
リスト2は先ほどのプログラムを少し変更してみました。7行目をご覧ください。LPC1114のピンにデジタル信号を出力するために生成したインスタンスmyledですが、実は出力するだけでなく、書き込んだ値を読み出すこともできるのです。
1:/******* list 2 ********/ 2: 3:#include "mbed.h" 4:DigitalOut myled(LED1) 5:int main(){ 6: while(1){ 7: myled = !myled; 8: wait(0.2); 9: } 10:}
この行では書き込んだ値を読み出し、”!”でその値を反転させます。読み出した値が0なら1に、また1なら0にします。この値をまたmyledに書き込みます。結果として0と1を繰り返すことになります。より少ないコードでList1と同じ動作をさせることができます。ですが、コンパイルした結果も少ないコードになるかどうかは皆さんで確かめてみてください。
Copyright © ITmedia, Inc. All Rights Reserved.