ARMマイコンに内蔵された周辺デバイスの使い方を学ぶ−シリアルポート編−:「mbed」で始めるARMマイコン開発入門(4)(2/3 ページ)
ARMマイコン「LPC1114」にはさまざまな周辺デバイス(ペリフェラル)が内蔵されていますが、まずは第一弾として、printfデバッグに欠かせないシリアルポートの使い方を勉強します。
書き込みと動作確認
書き込み器とブレッドボードの配線が完了したら、書き込み器をPCに接続します(図10)(図11)。またシリアル通信の実験は書き込み器を通じて行います。なお詳細は連載の第2回 ARM開発環境準備の第一弾、書き込み器を用意する、および第3回 クラウド開発環境「mbed」の使い方とターゲットマイコンへの書き込みを参考にしてください。
LPC1114の23番ピンをGNDに接続します。次にブレッドボードに電源を供給します。一度リセットボタンを押したら、コマンドプロンプトから
lpc21isp -bin Serial_LPC1114.bin com2 115200 14746
と入力します。下のリスト1に示したような表示になれば、書き込みは成功です。
>lpc21isp -bin Serial_LPC1114.bin com2 115200 14746 lpc21isp version 1.97 File Serial_LPC1114.bin: loaded... image size : 11464 Image size : 11464 Synchronizing (ESC to abort). OK Read bootcode version: 17 Read part ID: LPC1114.../102, 32 kiB FLASH / 4 kiB SRAM (0x1A40902B) Will start programming at Sector 1 if possible, and conclude with Sector 0 to en sure that checksum is written last. Erasing sector 0 first, to invalidate checksum. OK Sector 1: ...........................|.........................|.........................|......................... Sector 2: ...........................|.........................|.........................|......... Sector 0: ..........................|.........................|.........................|......................... Download Finished... taking 2 seconds Now launching the brand new code
今度はlpc21ispをターミナルモードで起動します。
lpc21isp -termonly com2 9600 14746
ここではボーレートを9600とします。Serialクラスではボーレートを指定しない場合(デフォルト)が9600bpiになっています。LPC1114が載ったブレッドボードのリセットボタンのタクトスイッチを押すたびにhello world!とPCの画面に表示されるのを確認頂けますでしょうか(リスト2)。
>lpc21isp -termonly com2 9600 14746 lpc21isp version 1.97 Terminal started (press Escape to abort) hello world! hello world! hello world! Terminal stopped
LEDと同期
前回のプログラムはシリアル通信でPCに“hello world!”という文字列を送るのに毎回、LPC1114にリセットをかけて再起動する必要がありました。今回はテンプレートとして用意されている「blinky」のプログラムの中に、pc.printfを埋め込みます(図4)。
これで0.4秒間隔で”hello world!”をシリアル経由でPCに送り続けるプログラムになりました。筆者の環境だとコンパイルが成功すると「Serial_LPC1114 (1).bin」がローカルPCのダウンロードエリアに生成されます。必要があれば適切な名前にリネームしてlpc21ispを使ってLPC1114に書き込みます。今度はlpc21ispをターミナルモードで起動して動作を確認してみましょう。どうでしょうか、発光ダイオードの点滅のタイミングで“hello world!”が表示されているのが確認できたでしょうか。
今までlpc21ispターミナルモードとして動作させるときには-termonlyというオプションを使っていました。ヘルプを見ると-termというオプションというのもありますね。これはプログラムをターゲットに書き込んだ後、ターミナルモードをスタートさせるオプションのようです。これを使えば書き込みとターミナルの動作で、2回、lpc21ispを起動していたものが1回で済むかもしれませんね。それに期待してこんなコマンドを試してみました。
>lpc21isp -bin Serial_LPC1114_2.bin -term com2 115200 14746
プログラムの書き込みは成功するのですが、ターミナルモードになった後うまく文字が表示されませんでした。調べてみると、書き込み時に指定したボーレートの115200bpsがターミナルモードでも適用されるようです。考えられる対応は2つでひとつは書き込む際のボーレートを9600bpsにするか、ターゲットに書き込むプログラムのボーレートを115200bpsにするかです。LPC1114のSerial Programmingの書き込みボーレートは固定のようなので、ソースコードを変更してボーレートを115200にすることにしました。
それでは前述のようにSerialクラスのリファレンスの中からボーレートの設定にかかわる説明を探してみましょう。図5のような説明が見つかりました。Serialクラスのメンバーファンクションの中にvoid baud(int baudrate)というのがあるようです。その下にはformatというファンクションもありビット長やパリティ、ストップビットなどを設定できるようですが、これらについては今回はデフォルトのままで試してみます。
それでは早速、先ほどのプログラムに反映してみましょう(図6)。おっと!何をあせったかコンパイルエラーを起こしてしまいました。こんな風にコンパイルエラーが発生するとエラーの場所がソースコード上に示されます。またエラーの内容も画面下の「Compile OutputのDescription」の欄に表示されます。”pc.baud(115200)”とすべきでしたし、コンパイルエラーではないのですが、この設定はwhile文の外に出すべきですね。という風にコンパイルエラーが発生した場合でもmbed開発環境が親切にエラー箇所を指摘してくれます。
リスト3がボーレートを115200に変更し、lpc21ispのワンコマンドで書込みとシリアルポートへの出力の確認を行ったPC側のログです。
>lpc21isp -bin Serial_LPC1114_2.bin -term com2 115200 14746 lpc21isp version 1.97 File Serial_LPC1114_2.bin: loaded... image size : 11940 Image size : 11940 Synchronizing (ESC to abort). OK Read bootcode version: 17 Read part ID: LPC1114.../102, 32 kiB FLASH / 4 kiB SRAM (0x1A40902B) Will start programming at Sector 1 if possible, and conclude with Sector 0 to en sure that checksum is written last. Erasing sector 0 first, to invalidate checksum. OK Sector 1: ...........................|.........................|.........................|......................... Sector 2: ...........................|.........................|.........................|................. Sector 0: ..........................|.........................|.........................|......................... Download Finished... taking 3 seconds Now launching the brand new code Terminal started (press Escape to abort) hello world! hello world! hello world! hello world! hello world! hello world! hello world! hello world! hello world! Terminal stopped
Copyright © ITmedia, Inc. All Rights Reserved.