LPCXpresso1769 (OM13085) をmbed化する

/media/uploads/MACRUM/xpr_lpc1769_v2_banner.png

NXPのLPC1769を使用したLPCXpresso1769 (OM13085)も日本国内で入手できるようになってきました。LPCXpresso IDEで使用することが出来るボードですが、mbed LPC1768とほぼ同じチップを使っているので、mbed対応ボードにしてみました。

ファームウェアを書き換える

購入した状態ではCMSIS-DAPファームウェアは書き込まれていますが、mbed対応プラットフォームが使っているファームウェア(USBドラッグ&ドロップでのフラッシュメモリ書き込みや、仮想シリアルポート)ではなく、USBデバッグ対応があるだけのものです。これだと少し使いにくいのでオープンソースで公開されているmbed対応のインタフェースファームウェアを使ってみます。

mbedプラットフォーム用の最新のインタフェースファームウェア DAPLink を使います。

https://github.com/mbedmicro/daplink

ビルド手順はこちらをご覧下さい。DAPLink は複数のインタフェースとターゲットの組み合わせに対応していますが、ここではインタフェース側がLPC11U35/501, ターゲット側がLPC1768になっている lpc11u35_c027_if を使います。

マスストレージドライブに含まれる MBED.HTM のジャンプ先が u-blox のプラットフォームページになってしまうため、ボードIDを書き換えてビルドします(特に書き換えなくても問題はありません)。DAPLinkのビルドには、MDK-ARM のライセンスが必要です。LPCXpresso1769用にビルドしたバイナリを用意したのでご利用下さい。

DAPLinkビルド済みバイナリのダウンロード: lpc11u35_lpcx1769_if_crc.bin

ファームウェアの書き換えは、以下の手順で行います。

  1. ボード上のSW1ボタンを押しながらホストマシンとUSBケーブルで接続する
  2. CRP DISABLD というドライブがマウントされるので、そのドライブ内の firmware.bin を削除
  3. DAPLink のバイナリをドラブにコピーし、USBケーブルを抜く
  4. 再度接続すると、DAPLINK という名前でマウントされる

初回のみドライバを自動でインストールするので、ドライブがマウントされるまで若干時間がかかります。

これでファームウェアの書き換えは終了です。

ハンダ付けする

このままでも mbed として使用できるのですが、プログラム側から scanf/printf 等で利用するシリアル入出力の機能が使えません。これは、出荷時にデバッグ用チップとターゲットチップ間のシリアルポートが接続されていないだけなので、ハンダ付けを行います。デバッグ用チップが実装されている小さいボード側のR67とR68という部分を0Ω抵抗や適当な線材を使って接続します。結構細かい作業なので、自信が無い方は周りの経験者に頼むのが良いかもしれません。

/media/uploads/MACRUM/lpcx1769_serial.png

Blinky(Lチカ)してみる

これで一通りの準備が出来ましたので、動作確認を行ってみます。mbed オンラインコンパイラから新規にプログラムを作成し、プラットフォームを mbed LPC1768 に設定します。 LPCXpresso1769のオンボードのLEDは、mbed LPC1768 と異なるポートに接続されているので、LED1, LED2, LED3 等を再定義して使用します。

#include "mbed.h"

#define LED1 P0_22
#define LED2 P3_25
#define LED3 P3_26
#define LED_RED   LED1
#define LED_GREEN LED2
#define LED_BLUE  LED3

DigitalOut myled(LED1, 1);

int main()
{
    while(1) {
        myled = !myled;
        wait(0.4);
    }
}

プログラムの書き込みは、mbed LPC1768 と同じように生成された .bin ファイルをマウントされたドライブにコピーします(MBEDではなく、DAPLINKという名称になっています)。コピーが終了すると、ドライブは再度マウントされます(書き込んだバイナリはドライブにはファイルとして見えませんが正常な動作です)。リセットボタン(SW1)を押すとプログラムが動作します。

mbed LPC1768との比較

残念な点

  • オンボードLEDがPwmOut対応のポートに接続されていない
  • LocalFileSystemが使えない
  • 5V出力がない(39番ピンの VU はボード上で未接続)

良い点

  • VU, IF-, IF+ 以外のピン配置はmbed LPC1768と全く同じ
  • ほぼ全てのポートがピンとして出ている
  • オンボードのタクトスイッチ(SW2)が使える
  • カラーLEDが実装されている
  • SWDコネクタが実装されている
  • 動作周波数が高い(120MHz)
  • 64kビットのオンボードI2C接続EEPROMが実装されている
  • 価格が安い

120MHzで動かす

mbed LPC1768 のコードをそのまま使用すると96MHz動作のままですが、設定を変更することで最大の120MHzで動作させることが出来ます。

#include "mbed.h"

Serial pc(USBTX, USBRX);

void ClockUpdate(void)
{
    LPC_SC->CCLKCFG   = 3;              // Setup Clock Divider = 4 (-1)
    LPC_SC->PLL0CFG   = 0x00050077;     // Fcco = 480MHz
    LPC_SC->PLL0FEED  = 0xAA;
    LPC_SC->PLL0FEED  = 0x55;
    LPC_SC->USBCLKCFG = 0x00000009;     // Setup USB Clock Divider
    LPC_SC->FLASHCFG  = (LPC_SC->FLASHCFG & ~0x0000F000) | 0x00004000;
}

int main()
{
    ClockUpdate();
    SystemCoreClockUpdate();
    pc.baud(9600);  // force set baudrate here to use updated system clock

    pc.printf("\nLPCXpresso1769 test program\n");
    pc.printf("SystemCoreClock = %d\n", SystemCoreClock);

    while(1) {
        wait(1);
    }
}

各種拡張ボードを使う

  • mbed Application board

ボード上に実装されているUSB-Aコネクタと干渉しそうなギリギリの距離ですが、取り付けて使用することが出来ます。LCDや各種センサなども特に問題無く使うことが出来ました。 /media/uploads/MACRUM/lpcx1769_app.jpg

  • JKsoft Blue mbed Board

こちらも取り付けて使用することが出来ます。ただし、シリアルLEDの電源をVUから供給する使用になっているため、LPCXpresso1768のマイクロUSBケーブルからの給電では動作しませんでした。シリアルLEDを使用する場合は外付けのACアダプタを使用する必要がありました。 /media/uploads/MACRUM/lpcx1769_jbb.jpg

  • その他

他のボードは試していないのですが、☆board Orange 等は残念ながらボードの寸法の問題で物理的に装着できないと思います。

Ethernetを使う

LPCXpresso1769はmbed LPC1768とは異なるEthernet Phyのチップが使用されていますが、mbed公式のEthernetInterfaceライブラリはどちらのチップにも対応しています。ただし、MACアドレスの取得方法が異なるので、mbed_mac_address() 関数を再定義する必要があります。 mbed LPC1768では、MACアドレスの取得にセミホスト機能を使ってインタフェースチップ側から取得しますが、LPCXpresso1769ではこの方法は使用できませんので、以下のコードをユーザプログラム内で定義します。

void mbed_mac_address(char *buf)
{
    buf[0] = 0x00;
    buf[1] = 0x02;
    buf[2] = 0xF7;
    buf[3] = 0xF0;
    buf[4] = 0x00;
    buf[5] = 0x00;
}

mbed_mac_address() 関数は、mbed ライブラリ内で weak 関数として定義されているので、リンク時にユーザプログラム側の非weak関数が優先的に使用されます。

参考

lpcxpresso1769_helloworld

おまけ

LPCXpresso1769用にmbedライブラリのソースを変更したコードを公開しました。標準プラットフォームとほぼ同じ使い勝手になるはずです。

Import programLPCXpresso1769_blinky

mbed blinky for LPCXpresso1769 (OM13085)


Report

2 comments on LPCXpresso1769 (OM13085) をmbed化する:

26 May 2016

有用な情報をありがとうございます。

mbed LPC1768 ではGPSレシーバーとの相性が悪く Ethernet コントローラを PHY_PowerDown(); することで対処しています。
https://developer.mbed.org/forum/mbed/topic/3860/?page=1#comment-20871

LPCXpresso1769 用 PHY_PowerDown(); のコードサンプル掲載をお願いしたく思います。

07 Aug 2017

親切な情報ですね。ありがたいです。

ちなみに、LPCXpresso1769ボードのリビジョンが"D"だと、この手順でOKですが、"D1"だと「JP4」をショートしないと、 LPC11U35がISP状態にならず、何度やっても"CRP DISABLD"ドライブは現れません。 困っている人は、こちらの情報を参照してみてください。 https://www.embeddedartists.com/sites/default/files/support/xpr/LPCXpresso1769_CD_revD_ProductNote.pdf

Please log in to post comments.