DIP 8ピン ARM Cortex-M0+ マイコンを試す

Too late but successfully ran NXP LPC810M, a small footprint ARM Cortex-M0 microcontroller.

以前試作に使おうと購入した NXP LPC810M があったのですが、なかなか適した応用が見つからずに放置していました。このマイコンは、DIP 8ピンという小さなパッケージながら、最大 30MHz で動作する 32ビット ARM Cortex-M0+ マイコンなのです。外部ピンの少なさから酷評されたりしますが、適切な用途を見つければ「使える」マイコンだと思います。

今回、年初? ということもあり、気合いを入れて評価してみることにしました。開発環境は、以前 Nordic Semiconductor の Bluetooth LE マイコン用にセットアップした Keil uVision 5(無償評価版)と、プログラマ(兼デバッガ)の nRF51 Development Kit (PCA10028) です。以下のサイトに参考となる情報があるのですが、やや内容が古いようでこの通りには行きませんでした。

なおプログラマとしては、(秋月電子でも売られている)有名な LPC-Link2 が使えると思いますが、私は持っていないので試せてません。Segger J-Link で繋がれば同等と思いますので、プログラマとの結線だけ注意して御参考ください。

J-Link プログラマの接続

まず最初に、プログラマを接続します。以前のブログを参考にしつつ、以下のように結線します。左側が LPC810M のピン番号で右側が nRD51-DK の P20 コネクタです。P20 コネクタは、nRF51 Development Kit ボードの USB コネクタを左に置いて、一番左が 1番ピンです。

  • ピン 3 — SH_SWDCLK(P20 コネクタの左から 5ピン目。以下同様)
  • ピン 4 — SH_SWDIO(4ピン目)
  • ピン 6 — SH_VTG(3ピン目)
  • ピン 7 — SH_GND_DETECT(8ピン目)

参考のため、データシートからピン配置だけ引用させて頂きます。

スクリーンショット 2016-01-26 11.24.55

なお、LPC810M には別途 V_DD(ピン6) — V_SS(ピン7) 間に 3.3V を繋ぎます。nRF51 Development Kit ボードの P20 の 1番ピン(VDD_nRF)を代わりに使えるかと思いましたが、うまくいきませんでした。nRF51 Development Kit の回路図が手元にないので、詳細は不明です。

接続の確認

次に、接続が正しいか確認します。nRF51 Development Kit ボードを Windows PC に接続し、まずは Segger のソフトウェア J-Link Commander を立ち上げます。(このソフトウェアは、ここから入手できます。) 次のような画面が出れば、デバイスを正しく認識しているはずです。

segger_jlink_commander

次に Keil uVision 5 を起動します。(以下、マイナーバージョンの違いによって画面が少し異なるかもしれません。)

まず、Options ダイアログを開きます。(次のようなアイコンのボタンを押します。)

スクリーンショット 2016-01-26 9.57.57

するとダイアログが現れるので、Device タブを開きます。そして、Software Pack のところに URL リンクをクリックします。

software_pack

ウェブブラウザが開くので、NXP の項目を開き、LPC800 Series をクリックし、さらに LPC81x を開き、LPC810M021FN8 をクリックします。すると、デバイスのページが開き、画面に Device Family Pack [Download] というボタンがあるので、それをクリックします。ライセンスに同意し、Software Pack をダウンロード、そして開いて実行します。これにより、LPC810 の Software Pack がインストールされます。

そうすると、先ほどの Options ダイアログの Device タブで、左側ペインのデバイスツリーで LPC810 を選べるようになります。そこで、それを選択します。

device_tree

次に、同じ Options ダイアログで Debug タブを開きます。右上の Use というプルダウンメニューから J-LINK / J-TRACE Cortex を選び、さらに Settings ボタンをクリックします。

新しく開いたダイアログで Port のプルダウンメニューから SW を開き、次のような画面が出れば、Keil uVision からデバイスが正しく認識されています。なおここで、Download Options で Verify Code Download と Download to Flash にチェックが入っていることを確認します。後者をチェックしておかないと、あとでプログラムのデバッグのときに “Verification of application image failed.  Target contents do not match!  Flash download not performed?” というエラーが出ます。

options_debug

ここまでできたらデバイスは認識されているので、次にサンプルプログラムをビルドしたいのですが、その前に Flash メモリの設定も変更しておきます。このダイアログで Flash Download タブを開き、下部にある Add ボタンを押します。LPC8xx IAP 16kB Flash というのを選択し、Add します。そしてAdd したProgramming Algorithm をクリックして選び、RAM for Algorithm で Start を 0x10000000、Size を 0x3e0 とし、OK ボタンを押します。(これは、当初に紹介させて頂いたサイトの内容をそのまま踏襲しています。私もまだよく分かっていません。)

サンプルプログラムの修正とビルド

先ほどの Software Pack をダウンロードすると、Blinky という LED 点滅(通称 L チカ)プログラムが入っているのですが、まず第一にこれは LPC810 用でないので、そのままでは動きません。さらに、先ほど最初に紹介したサイトにある説明はやや古く、その手法が現在の Software Pack では使えません。以下では、2016年 1月現状版での説明をいたします。ところどころに LPC812 というキーワードが出てきますが、特に修正していません。気になるかたは適宜直してください。

  1. まず最初に、Blinky サンプルを修正できるように手元のワークスペースにコピーします。Windows のエクスプローラ等で、C:\Keil_v5\ARM\Pack\Keil\LPC800_DFP\1.2.0\Boards\NXP\LPC812-LPCXpresso というディレクトリから、Blinky というディレクトを見つけ、それを Keil uVision のワークスペースディレクトリにコピーします。
  2. 次に、同様に Windows エクスプローラーでコピー先の Blinky ディレクトリのプロパティを開き、読み出し専用になっていたらそのチェックを外し、サブディレクトリ全体を書込み可にします。
  3. Keil uVision を開き、左の Project エクスプローラから Blinky を開き、まずは試しにビルドしてみます。Project → Build target です。Build Output に
    Build target 'LPC812M101 Flash'
    ".\Flash\Blinky.axf" - 0 Error(s), 0 Warning(s).
    Build Time Elapsed: 00:00:00

    というメッセージが出たら、正しくビルドできています。

  4. しかしこのままでは LPC810 用になっていないので動作しません。以下のように修正をしていきます。
  5. まず、再度 Options ダイアログを開きます。Device タブを開くと設定が LPC812 になっていると思います。これは、設定がプロジェクト単位で保存されているためです。そのため修正が必要です。以下を変更します。
    ・ デバイスを LPC810M021FN8 に変更
    ・ Debug タブを開き、Use で J-LINK / J-TRACE Cortex に変更
    ・ さらに Settings ボタンを押して、先ほどと同様の設定に変更
    ・ Flash Download も確認の上、必要ならば変更
  6. そうしたら、メニューの Flash から Download を実行します。Build Output に以下のように出力されていることを確認します。(xx:xx:xx は任意の時刻です。)
    Erase Done.
    Programming Done.
    Verify OK.
    Application running ...
    Flash Load finished at xx:xx:xx
  7. 次に、メニューからDebug → Start/Stop Debug Session を選びます。評価版だと EVALUATION MODE … というメッセージが出るので OK を押し、画面に Disassembly ペインや Registers ペインが表示されれば、正しくプログラムが書き込まれていると思われます。
  8. さて、ここまでで無事にプログラムの書込ができましたが、このままではやはり LPC812 用のままなので動作しません。そこでプログラムを修正していきます。その前に、再度 Debug → Start/Stop Debug Session でデバッグを終了しておきます。
  9. Keil uVision の Project ペインが下記のようになっていると思います。そうしたら、まず Blinky.c をダブルクリックして編集画面を表示します。
    project
  10. プログラムでは LPC812 評価ボードのボリューム(potentiometer)を回して点滅速度を変えるようになっています(2016年1月現在のサンプルコードの場合)が、今回はボリュームがないので main 関数を以下のようにプログラムを修正します。ポイントは、dlyVal 関連のコードを削除、Comparator の初期化を削除、Delay() を 250ミリ秒固定にすることです。(HERE と書いてある行)
    int main (void) {
      uint32_t leds = 0x01;
      uint32_t ledNum = LED_GetCount();
      // uint16_t dlyVal = 0;               HERE
    
      SystemCoreClockUpdate();
    
      LED_Initialize();                     /* LED Initialization */
      // Comparator_Initialize();           HERE  /* CMP Initialization */
    
      SysTick_Config(SystemCoreClock/1000); /* Systick interrupt each 1ms */
    
      while(1) {                            /* Loop forever */
    
        // dlyVal = Comparator_GetLad();    HERE  /* get Ladder value for delay */
        // dlyVal = dlyVal << 5;            HERE  /* scale delay value */
    
        leds <<= 1;
        if (leds >= (1 << ledNum)) leds = 0x01;
        LED_SetOut(leds);                   /* lit LEDs */
        Delay(250);                         // HERE  /* Delay */
      }
    
    }
  11. 次に LED_LPC812-LPCXpresso.c というファイルを修正したいのですが、これは共用ディレクトリに置かれているのでそのままでは編集できません。そこでプロジェクトローカルにコピーします。まずは Windows エクスプローラで C:\Keil_v5\ARM\Pack\Keil\LPC800_DFP\1.2.0\Boards\NXP\LPC812-LPCXpresso\Common にある LED_LPC812-LPCXpresso.c というファイルを、プロジェクトローカルの Blinky ディレクトリに LED_LPC810.c という名前でコピーします。そして、Windows エクスプローラのプロパティを開いてファイル読出し専用のチェックボックスをオフにしておきます。
  12. さらに、C:\Keil_v5\ARM\Pack\Keil\MDK-Middleware\6.2.0\Board\Board_LED.h というファイルを同様にコピーしておきます。(ファイル名の変更は不要)
  13. 次に、LED_LPC812-LPCXpresso.c をプロジェクトから除外します。そのためには以下のようなボタンをクリックして、Manage Run-Time Environment というダイアログを開きます。
    manage
  14. Board Support というツリーを開き、LED のところにあるチェックボックスを外します。
  15. 次に、先ほどの LED_LPC810.c をプロジェクトに追加します。Project ペインにある Source Files という行を右クリックして、Add Existing Files(略)… をクリックします。そして、LED_LPC810.c を選んで Add します。そして Close します。
  16. さらに  Project ペインから LED_LPC810.c を見つけてダブルクリックします。編集画面が開くので、39〜54行目あたりを以下のように編集します。ポイントは、LED の数を 2つに減らし、led_mask[] を 0, 1 に変更し、さらに LPC_GPIO_PORT->DIR0 の代入から led_mask[2] を削ることです。
    #define LED_NUM (2)                        // HERE
    const uint32_t led_mask[] = { 1UL << 0, 1UL << 1 };  // HERE
    /**
     \fn int32_t LED_Initialize (void)
     \brief Initialize LEDs
     \returns
     - \b 0: function succeeded
     - \b -1: function failed
    */
    int32_t LED_Initialize (void) {
      LPC_SYSCON->SYSAHBCLKCTRL |= (1UL << 6); /* enable GPIO clock */
      LPC_GPIO_PORT->DIR0 |= (led_mask[0] |    /* configure GPIO as output */
                              led_mask[1] );   // HERE
  17. 最後に、ファイルを全てセーブして、Project → Build target します。さらに Flash → Download で LPC810 のフラッシュメモリにプログラムを書き込みます。
  18. 次に LPC810 に LED を繋ぎます。LPC810 のピン5(PIO0_1)とピン 8(PIO0_0)にそれぞれ、VDD から 1kΩ 程度(500Ωより大きければまず大丈夫。あまり大きな抵抗だと暗くて見づらい)を直列に介して LED を繋ぎます。VDD 側がプラスなので、VDD に近い側に LED の長いほうの端子(アノードあるいは「+」)を繋いでください。以下に実体配線図を示しておきます。(分かりづらいのですが、LED の右脚(曲がっているほう)がアノード、つまり長いほうのピンです。また、IC の左下が 1番ピン(表面にマークが付いているピン)です。)
    led_blinking_breadboard
  19. LED が無事に点滅していれば、成功です。

まずは取り急ぎ、以上です。