はじめに

  • このページでは、3GIMに搭載されているマイコン(NXPセミコンダクターズのCortex-M0+マイコンLPC812)のファームウェア開発に関する情報を提供します。
  • ただし、Cortex-M0+マイコンやATコマンドに関するそれなりの知識が必要ですので、Arduino等での開発に比べて技術的な難易度が高く、不慣れな方には3GIMの利用方法としてお勧めはしません。ただし下記のようなメリットがありますので、保証外の利用形態ということをご理解の上、自己責任のもとで実施してください。
    • 3GIM上でプログラミングを行うことにより、外付けのマイコンは不要となり、小型&低コストでIoTデバイスを実現することができます。
    • 例えば、バッテリと組み合わせることで位置情報をトラッキングする超小型端末になります。
  • このページでは、ファームウェアの開発に必要な3GIM内部のブロック構成、ファームウェアgw3gの処理概要、開発環境、ファームウェアの3GIMへの書込み方法、デバッグ方法、開発ツールやマイコン・通信モジュールの技術情報の入手先等についての情報を提供します。なお、記載内容は2017年5月時点の情報をもとに制作しています。
  • 3GIM(V2.1)に搭載しているファームウェアgw3gのソースコードは、一部のみを公開いたします。現時点では諸般の事由によりすべてのソースコードを公開することは予定しておりません。ご了承のほどお願いいたします。
  • 3GIMのファームウェアの開発に関しては、無償での技術サポートは実施いたしません。有償の技術サポートサービスをご希望される方は、お問い合わせフォーム からのその旨のご連絡をお願いいたします。


3GIMのブロック図

  • 3GIM(V2/V2.1)の内部ブロック図を下記に示します。



  • 図に示すように、3GIMは下表のパーツやモジュールから構成されています。
パーツ・モジュール名 概要 補足等
HL8548-GGPS機能を内蔵した3G通信モジュールシエラワイヤレス製(*1)
LPC81232-bit マイクロコントローラLPC812/M101JTB16(Cortex-M0+)NXP製(*2)、1.8V/24MHzで駆動
LED1電源LED(黄色)電源ONの時に点灯
LED2外部制御可能なLED(緑色)$YLコマンドでON/OFF可
レベル変換回路内部ロジック電圧1.8Vと外部ロジック電圧IOREF間のレベル変換回路
電源スイッチ回路PWR_ON信号によってHL8548-Gへの電源供給をON/OFFする回路
microSIMマイクロSIMカードソケットdocomo系のSIMカードを利用可能
microUSBマイクロUSBコネクタHL8548-GをUSBモデムとして利用可能
3G Antenna3G用のアンテナ(実際にはU.FL端子+3Gアンテナ)技適取得済みアンテナを複数提供
GPS AntennaGPS用のアンテナ(実際にはU.FL端子+GPSアンテナ)アクティブアンテナは使用不可
CPファームウェア書き込み・デバッグ用のパッドCP1~CP4の4パッドあり(*3)
  • 脚注
    • (*1) 詳しくはシエラワイヤレスの 技術サポートサイト を参照してください。
    • (*2) 採用しているMCUの基本スペックは、Flash 16KB/SRAM 4KB/CPU Cortex-M0+(max 30MHz)です。3GIMではシステムクロックは内部RC発振回路を利用して24MHzで駆動しています。LPC812に関する詳しい情報は、LPC800マイコン情報 を参照してください。
    • (*3) 各パッドの機能の詳細は後述します。
  • ブロック図について、以下に補足します。
    • 3GIMは、主に、3G通信モジュールHL8548-GおよびマイクロコントローラLPC812から構成されています。3GIM内部のロジック電圧は、回路全体をシンプルにするためにHL8548-Gのロジック電圧と同じ1.8Vとしています。また、3GIM内で必要となる1.8Vの電源は、HL8548-GがONの時に出力するVGPIOを使用しています。そのため、HL8548-GをOFFにした状態でLPC812だけを駆動することはできません(例えば、HL8548-Gの電源はOFFとした状態でLPC812をsleepさせるようなことはできません)
    • 回路をシンプルにするために、USB回路では過大電流・電圧の保護回路を省略しています。そのため、USBを使用する際には留意してください。
    • HL8548-G~LPC812間は、常に115,200bpsのボーレートでUART1を介した通信を行います。このUART1は4-wire(RX/TX/RTS/CTS)で結線していますが、実際にはHL8548-GからLPC812の方向のみに対してフロー制御を行っています。
  • 回路図は、ダウンロード のページからダウンロードできます。


3GIMのファームウェアgw3gの処理の概要

  1. LPC812のファームウェア gw3g の概要
    • C言語(ANSI-C) で記述しています。開発環境は、後述する LPCXpresso 8.0 を使用しています。
    • 3GIMが提供する$コマンドを解釈して、HL8548-Gに対して複数のATコマンドのシーケンスをやり取りします。
    • GPIOやUART等のドライバ、スタートアップ関数は、NXP LPC8xx software exampleとしてNXP社から提供されているソースコードを改造して使用しています。LPC812はメモリサイズが少ないため、必要最低限の機能だけを抽出して使用しています。
    • システムクロックとして、部品点数を減らすためにLPC812内蔵のRC発振回路(最大で1%の周波数誤差がある)を使用しています。この周波数誤差のために、LPC812のUART機能で使用できる最大ボーレートは概ね115,200bpsが限界となっています。
    • コードサイズの制約等から、LPC812に内蔵されているWDTやBOD機能は利用していません。従って、LPC812が暴走あるいはハングアップした場合の救済策は、一旦、外部側から電源をOFFにしてもらうしか方法はありません。
  1. main() 関数の処理
    • gw3gのソースコードの一部(エントリポイントであるmain関数の定義部分)を下記に示します。
static char	request[MAX_COMMAND_LENGTH+64];		// buffer for $command
static char	response[MAX_RESULT_LENGTH+32];		// buffer for $command result

int main(void) {
  // Set up 3GIM and put welcome message
  setup();
  UART0Puts(WELCOME_MESSAGE);

  // infinite loop - get the command from UART0, execute the command and put it's result to UART0
  while (1) {
    int stat, nbytes = sizeof(response);
    // Get command from uart0
    if ((stat = getCommand(request, MAX_COMMAND_LENGTH)) == SUCCESS) {
      // Execute the command
      stat = doCommand(request, response, &nbytes);
      UART0Send((uint8_t *)response, nbytes);
    }
    else {
      // Command format error
      UART0Puts("$=NG ");
      switch (stat) {
        case TOO_LONG_COMMAND :
          UART0Puts("Too long");
          break;
        case BAD_FORMAT :
          UART0Puts("Bad format");
          break;
      }
    }
    UART0Puts("\n");  // terminate response

    // Discard garbage in UART1
    UART1Clear();

    // Clear request buffer
    for (int i = 0 ; i < sizeof(request); i++)
      request[i] = '\0';
  }

  return 0;  // i never come here..
}


  • 上記のmain()から呼び出される主な関数や使用されているグローバル変数の概要を下表に示します。
関数・変数名 概要説明 補足
setup()3GIM全体を初期化する関数システムクロックの設定更新、スイッチマトリクスの設定、GPIOの初期化、UARTの初期化、ATコマンドによるHL8548-Gの初期化を行う
getCommand()UART0から一つの$コマンド文字列を取得する関数コマンド文字列の終端を示す'\n'を入力するまで、あるいは最大文字数に達するまでUART0から文字を読み出す
doCommand()取得した$コマンド文字列を解析・実行して、結果を返す関数$に続く2文字のコマンド文字と処理関数を対応付けるテーブルを使って、コマンドの処理を分岐させている。実際にコマンドを処理する関数(コマンドハンドラ)は、1コマンド1関数として定義している。
UAR0TSend()指定されたバイト配列の内容を指定されたバイト数分だけUART0へ出力する関数UARTドライバにて提供
UART0Puts()指定された文字列をUART0へ出力する関数UARTドライバにて提供
UART1Clear()UART1のバッファや状態をクリアする関数UARTドライバにて提供
request[]$コマンド文字列を格納する文字配列
response[]$コマンドの実行結果を保持する文字配列


  • 使用しているドライバを下表に示します。
ドライバ名 機能概要 補足
lpc8xx_gpioGPIOの制御を行うドライバ(I/O方向の設定、指定ピンへの0/1の出力、指定ピンの値の取得等)
lpc8xx_uartUARTの制御を行うドライバ(指定UARTの初期化・設定、文字の入出力、割り込みハンドラ、バイナリデータの出力等)UART0およびUART1の2つをサポート
lpc8xx_iapIAP(In Application Programming)の制御を行うドライバ(内容の消去・値の書き込み等)EEPROMの代わりに、プロファイル情報などを記録するための不揮発性メモリとしてFlashの一部を利用している。nxp社から提供されている情報をもとに新規に開発したドライバ。
lpc8xx_format文字列の書式変換の共通関数


ファームウェアgw3gの開発環境

  • gw3gは、NXP社が無償で提供している統合開発環境 LPCXpresso IDE 8.0 を使用して開発されています。LPCXpressoに関しては、NXP社の解説ページ 紹介サイト に概要や特徴、使い方、インストール方法等が掲載されていますので、参考にしてください。
  • LPCXpresso IDEは、インストール後に製品のアクティベーション(無償)を行うことで、コードサイズの制限等が緩和されたフル機能を利用することができます。


サンプルプロジェクトのビルド方法


ファームウェアを3GIMに書き込む方法

  • 3GIM上のLPC812にファームウェアを書き込む方法には、以下の2つの方法があります。
    1. フリーのFlashMagicツールを使って、UART経由でファームウェアを書き込む方法
    2. LPC-Link2等のデバッガ装置を使って、LPCXpressoの環境からファームウェアを書き込む方法
  • ブレークポイントを張ったり、変数の値を確認・変更するようなデバッグが必要な場合は、2.の方法をお勧めします。一方、廉価で簡単にファームウェアを書き込みたい場合は、操作が簡単な1.の方法をお勧めします。
  • いずれの方法でも、3GIMの裏面にあるパッド(CP1~CP4)を使用します。なお、各パッド(CP)にアサインされている信号は下表の通りです。
CP# 機能・名称 説明
CP1ISP_ENTLOWの状態でリセットすると、ISPモードに入る。通常の利用では開放またはHIGHとする
CP2nRESETリセット入力信号で、LOWでLPC812をリセットする
CP3SWDCLKSerial Wire Debug: Clock
CP4SWDIOSerial Wire Debug: Data I/O

  • 左の写真(3GIMの裏面にCPの位置をマークした画像)に示す通り、端子はスルーホールではなく、パッドの形状となっています。そのため、書き込みを行う治具では、この端子に2.54mmピッチのピンヘッダ等により所定の信号を接触させる(実際には、手等でパッドにピンを押し付ける)形となります。













書込み方法1 の手順(FlashMagicを使う方法)

  • 以下の手順でファームウェアを3GIMへ書き込みます。ツールのダウンロード先については本ページ末尾の「補足情報」を、治具と3GIMとの接続方法に関しては 治具(1)について をご参照ください。
  1. FlashMagicをダウンロードして、インストールする
  2. 治具を準備する
  3. FlashMagicを起動する
  4. 治具をPCに接続する
  5. FlashMagicの設定を行い、書き込むファームウェアを指定する
  6. 治具を3GIMに接続して、ファームウェアを書き込む


書込み方法2 の手順(LPC-Link2を使う方法)

  • 以下の手順でファームウェアを3GIMへ書き込みます。LPC-Linik2については本ページ末尾の「補足情報」を、治具と3GIMとの接続方法に関しては 治具(2)について をご参照ください。
  1. LPC-Link2と治具を準備する
  2. LPCXpressio IDEを起動して、Programmingダイアログを開く
  3. LPC-Link2をPCに接続する
  4. LPCXpressio IDEの設定を行い、書き込むファームウェアを指定する
  5. 治具を3GIMに接続して、ファームウェアを書き込む


ファームウェアをデバッグする方法


補足情報

  1. UART-USB変換モジュール
    • 3GIMをUSB経由でPCと接続して、ファームウェアを3GIMへ書き込んだり、3GIMの動作確認を行ったりするときに使用するモジュールです。ファームウェアの書き込みで使用する場合は、RTS信号とDTR信号がいずれも利用できる必要があります。
    • 例えば、以下のモジュールが利用できます。
  2. LPC-Link2
    • NXP社が販売しているLPCシリーズのマイコンをデバッグするために必要な開発者向け製品です。電子工作パーツを販売しているお店で購入することができます。
    • 詳細は、LPC-Link2を各デバッガにしてデバッグする を参照してください。なお、LPC-Link2にはCMSIS-DAPデバッガ用のファームウェアがあらかじめ書き込まれていますので、「CMSIS-DAPデバッガ」として使用するのが簡単です。
  3. FlashMagic
    • FlashMagicは、NXP社が開発・提供しているフリーの開発ツールです。ここ に解説があります。
    • ダウンロードはこちら からお願いします。Windows版とMac版がありますが、いずれも最新版を使用してください。
    • FlashMagicで書き込むことができるファームウェアのファイル形式は、インテルhex形式です。しかし、LPCXpresso上ではLPC-Link2等で扱えるaxf形式のバイナリファイルを生成することが多いです。axf形式のファイルをhex形式のファイルに変換する手順は、ここ に詳しく記載されていますので、参考にしてください。なお、サンプルプロジェクトでは、この変換処理はビルドの設定として登録済みです。
  4. LPC812に関する情報源
  5. HL8548-Gに関する情報源
    • 3GIM(V2/V2.1)が搭載しているHL8548-Gのファームウェアのリビジョンは 5.5.14 または 5.5.16 です。なお、2017年6月時点では、最新のファームウェア 5.5.22 にはバグがあり、3GIMとしての利用はお勧めしません。
    • HL8548-GのデータシートやATコマンドの仕様書等は、ここ にあります。なお、ファイルのダウンロードにはユーザ登録が必要です。