MDK-ARMでバーチャルLチカしてみる

この記事は mbed Advent Calendar 2014 - Adventar の7日目の記事です。

mbed のオフラインツールとして使用可能な Keil MDK-ARM で遊んでみます。

「MDK-ARM でバーチャルLチカ」の元ネタは、mbed祭り 2013@秋のキャラバンで説明した内容です。 http://developer.mbed.org/users/MACRUM/notebook/mbed_fest-2013_autumn/

簡単な資料とデモで実演したのですが、詳しく手順を残しておきたかったのでまとめてみました。

準備

MDK-ARMを使用します。Windows版しかありませんので、ご注意ください。

インストールすると、Lite版(無償評価版)になります。Lite版の制限事項はこちらです。 http://www.keil.com/demo/limits.asp

プロジェクトファイルを作る

mbed オンラインコンパイラで、New を選択してプロジェクトファイルを生成します。 ターゲットは、mbed LPC1114FN28を選択します。

/media/uploads/MACRUM/1114_create_new.jpg.png

Lチカのコードはお馴染みのこれですね。

#include "mbed.h"

DigitalOut myled(LED1);

int main() {
    while(1) {
        myled = 1;
        wait(0.2);
        myled = 0;
        wait(0.2);
    }
}


プロジェクトのアイコンを右クリックして、Export を選びます。
MDK-ARM のIDE名称 『Keil uVision4』 を選択して、OK を押すと zipファイルが生成されます。

/media/uploads/MACRUM/1114_export.png

使ってみる

ダウンロードした zip ファイルを展開すると、ソースコードの他に uVision のプロジェクトファイルか含まれています。
プロジェクトファイルをダブルクリックして、uVision を起動します。

uVision の基本的な使い方はこちら。
http://www.keil.com/arm/uv-gettingstarted.asp

MDK-ARM のシミュレータは結構強力で、ペリフェラル機能などもサポートしています。
NXP LPC1114/102のシミュレータでサポートされている機能は、こちらから参照できます。
http://www.keil.com/dd/chip/6526.htm

シミュレータでは、通常命令の実行はそれなりに高速に実行してくれますが、タイマー等を使用した場合は、極端に実行時間が遅くなります。
このプログラムの while ループには wait(0.2) が二回呼び出されているので、実際のターゲットボード上でループを一回実行する場合は 0.4 秒程度の時間になりますが、シミュレータでの実行は129秒ほどかかりました(Core i5-3230M @2.6GHz 環境)。
このままだとかなり使いにくいので、wait関数の引数を適当に変更します。

#include "mbed.h"

DigitalOut myled(LED1);

int main() {
    while(1) {
        myled = 1;
        wait(0.2/100);
        myled = 0;
        wait(0.2/100);
    }
}


除算とか使っちゃっていますが、最近のコンパイラはお利口さんなので、コンパイル時に数値リテラルにしてくれますのであまり心配することはありません。
これで、速度はなんとなく快適になりました(ウェイト処理でタイミングを合わせ込んでいるプログラムには使用できませんが)。

シュミレータの動作は確認できたので、波形を表示します。
まず、myled インスタンスで使用している LPC1114 のポート番号を調べます。uVisionの便利な機能を使ってソースコードにジャンプする事が出来ます。
/media/uploads/MACRUM/1114_definition.png


エディタで LED1 を右クリックして、Go To Definition of 'LED1' を選ぶとシンボルの定義位置にジャンプしてくれます(一度コンパイルが通ってシンボル情報が生成されている必要があります)。ポート番号は、P1_5 である事が分かりました。
ポート番号が分かったら、デバッガを起動します。デバッグターゲットは実デバイスではなくシミュレータなので、設定を変更します。

メニュー [Project] - [Options for Target xxxxx]

で表示されるダイアログで Debug タブに切り替えて、Use Simulator を選択します。OKボタンを押して、ダイアログを閉じます。

/media/uploads/MACRUM/1114_debug_setting.png

メニュー [Debug] - [Start/Stop Debug Session]

を選んで、デバッグセッションを起動します。

9行目にブレークポイントを設定します。
/media/uploads/MACRUM/1114_set_breakpoint.png

メニュー [Peripherals] - [System Viewer] - [GPIO] - [GPIO1]

を選択します(LED1は、P1_5だったので)。

プログラムを実行すると、ブレークポイントで停止します。ここからシングルステップすると、GPIO1 ウィンドウの DATA レジスタが、0x00000FFF から 0x0000FDF に変化します。これによって、DATAレジスタの、5ビット目が LED1 (P1_5) にアサインされている事が分かります。

/media/uploads/MACRUM/1114_gpio.png

メニュー [View] - [Analysis Windows] - [Logic Analyzer]

を選択します。

[Setup...] ボタンを押し、[New] を選択して以下の情報を入力します。

  • ‘((unsigned long *)0x50013FFC)[0]’ を追加
  • [Display Type] -> Bit
  • [Add Mask] –> 0x00000020
  • [Shift Right] -> 5

先ほどのブレークポイントを削除して、プログラムを実行します。ロジックアナライザウィンドウにLチカ波形を表示することが出来ました。

/media/uploads/MACRUM/1114_blinking.png

以上です。無償のLite版でも結構色々出来ますね。

8日目は hsgw さんです。よろしくお願いします。


Please log in to post comments.