LPC8xxテンプレート開発環境

LPC8xxテンプレートは、デバッガ付きでLPC820実装のLPCXpresso Development Board(LPC820評価ボード)で開発します。この評価ボードにLCDやUARTドライブ回路を追加すれば、テンプレート開発環境が完成します。
RL78/G1xテンプレート開発時は、ブレッドボード上に追加回路を実装しました。しかし、簡単に追加回路を実現するには、ドータボード利用が便利です。そこで、LPC820評価ボードに接続可能なボードを調べましたが、2014年1月時点では適当なものが見つかりません。

LPC1114用 mX-BaseBoardの流用

LPC1114やLPC1343などのLPCXpresso用ドータボードとしては、印)NGX社からmX-BaseBoardが販売中です。ブザー、I2C接続EEPROM、LED、タクトSW、UARTドライバ回路などが追加済みですが、LPC820評価ボードは接続対象ではありません。恐らくLPC820ボード側のIOピン配置に問題があろうと想像します。しかし、LPC820のスイッチ・マトリクス機能を使えばIOピンにLPC820マイコン周辺回路を自由に割当てられるので、この問題は回避できるハズと考えました。また、電源ピンの接続は問題なさそうですので、下記のようにmX-BaseBoard上にLPC820評価ボードを実装し、LPC8xxテンプレート開発環境としました。

PC8xxテンプレート開発環境
PC8xxテンプレート開発環境

LPC8xxの2種類のAPIライブラリ

LPC8xxのサンプルコードには、2014年2月現在、2種類の既成APIライブラリ(ドライバ)があります。

1. LPCClose:LPCXpresso_7.0.0_92付属のNXP_LPC8xx_SampleCodeBundle.zip

2. LPCOpen:LPCOpenサイトのLPCOpen-LPCXprersso LPC812, LPC800-MAX/LPCXpresso, Keil_IAR

両者の違いは、2が3階層ライブラリ(私は下図のように理解)、1は、従来からある階層なしのライブラリです(詳しくは、コチラ)。LPCCloseは、LPCOpenに対して、私がかってに付けた名前です。

LPCOpenの目的

LPCOpenの構造
LPCOpenの構造

 私は参照してもLPCOpen理解度はイマイチなのですが、目的は周辺回路のライブラリ汎用化、ひいてはCライブラリのような標準化とOpen開発によるAPIバグ取り、CMSISのドライバ版と理解(想像?)しています。

既成API利用のプログラミング

一方、LPCClose側のライブラリ評判は、良くありません。既成API利用のプログラミングは歴史が浅く、ドライバ側の改版も順次進むでしょう。また、いずれのサンプルもLPC8xxの最大特徴、スイッチ・マトリクス・ツール(ver1 20130602版):SMTの出力を使ったコードはありません。SMT完成が2013年6月なので、サンプルコード開発に間に合わなかったのが原因と思います。が、現状でもSMT出力をLPCOpenソースへ代入するとコンパイルエラーが生じるなど、新しい製品なのでしかたがないのでしょう。ソフト開発を複数人で行うと必ず生じる副作用だと思います。

LPCOpenの選択

ポイントは、既成ドライバの改版時、ユーザ開発部分に影響が少ない(理想はゼロ)構成にしておくことです。LPCOpenヒストリーを観ると、現在のv2.01までに5回改版されています。

このような状況ですが私は、LPCOpenライブラリを使います。バグ取りの進み具合がOpen開発なので早そうなのと、Cライブラリの雰囲気があるからです。その分、LPCCloseに比べ、解読しにくい箇所もありますが、組込みマイコン標準周辺回路ライブラリを夢見て活用したいと思います。

サンプルソフトの構造

LPC8xxテンプレート開発時に参考にするサンプルソフトの構造について説明します。

サンプルソフトの構造
サンプルソフトの構造

RL78/G1xの無償IDEは、CubeSuite+、GUIで周辺回路のパラメタを設定すると、使用分の周辺回路APIが生成される優れものです。詳しくは、コチラの記事などを参照してください。一方、LPC8xxの無償IDEが、EclipseベースのLPCXpressoです。パソコンへのインストとアクティベーションなどは、トラ技2014年2月号やLPCXpressoサイトを参照してください。LPCXpressoもCubeSuite+と同様、サンプルソフトがIDEに付属しています。

スタートアップ処理とユーザプロジェクト処理

LPCXpressoをインストし、付属サンプルNXP_LPC8xx_SampleCodeBundle.zipをIDEへ展開後、そのソースを読む際のポイントは、サンプルソフトの構造です。構造の解説文が少ない(見あたらない)ので、説明を加えます(付属LPCXpresso User GuideはIDEの使い方解説書です)。

Blinkyを例に示します。組込みソフトは、2つの処理から成ります。「スタートアップ処理」と「ユーザプロジェクト処理」です。スタートアップ処理は、電源ONで自動的に実行されるResetISR()で、メモリなどの初期設定を行います。次にSystemInit()で、動作クロックなどのシステム関連の設定を行います。その後、ユーザプロジェクト最初の関数main()をコールします。

ユーザプロジェクト処理は、無限ループの前に2関数をコールします。HdwInit()で、使用する周辺回路の初期設定を行い、UserInit()でその他の初期設定を行った後に無限ループします(HdwInit()とUserInit()は、説明の都合上作成した関数名です)。

各関数は、NXP社提供のLPC8xxライブラリと、ARM社提供のCortex-M0+コアライブラリを使っています。またユーザが作成する関数も、これらライブラリを使って作成します。つまり、これらのライブラリがAPIを提供しているのです。ライブラリで初めから全てのAPIを提供しているところが、CubeSuite+と違う箇所です。

スタートアップ処理は、全てのサンプルプロジェクトでほぼ共通ですが、ユーザプロジェクト処理は、サンプルにより使う周辺回路が違いますので異なります。普通は、1個のサンプルプロジェクトで、1種類の周辺処理を紹介しますので、無限ループは文字通り簡単な無限ループで終わるものが殆どです。

スタートアップ処理の要は、最低限の動作ができる環境を作成するのが目的で、ブートストラップと呼ばれるゆえんです。パソコンのBIOSに相当する部分と言えば解り易いでしょうか? IDEのデバッガ動作時には、この部分は飛ばしてメイン関数の入口からデバッグを開始します。つまり、本来は、必要性が無い限り、変更不要と考えても良いでしょう。

ユーザプロジェクト処理も、無限ループ前を「周辺回路の初期設定:HdwInit()」と「その他のユーザ初期設定:UserInit()」に分けて考えると、参考にする部分がより明確になります。HdwInit()は、周辺回路の使い方が同じならそのままコピー利用もできます。但し、CubeSuite+と違って、LPCXpressoの場合はAPIパラメタで回路動作が変わるので、APIソースを解読する必要もあります。

サイズが大きいプログラムも、結局は無限ループ部分が大きいだけで、構造は同じです。大きな無限ループ部分の流用性や可読性を上げるために、ファイル分割などの技術を使っているだけです。

テンプレート工夫箇所

この構造が理解できると、サンプルプロジェクトの見通しが良くなります。そして、せっかく提供されているサンプルを上手く利用し、複数処理を実行するには、「無限ループ箇所を工夫すれば良さそうだ」、ということも判ります。組込み用のリアルタイムOSなども、この工夫の結果できたものと理解しても良いでしょう。但し、リアルタイムOS利用時は、OSの理解や面倒なオーバーヘッドも生じます。販売中のRL78/G1xテンプレートやLPC8xxテンプレート(近日発売予定)は、もっと手軽に複数処理を実現するものです。

ARMマイコンの選択方法

LPC8xxの特徴

コア差別から、周辺回路差別へシフトしているARMコアマイコン群。その中で8/16ビット市場を狙う低価格、低消費電力な32ビット最新コアCortex-M0+を搭載したLPC8xxの差別化周辺回路は、下表です。最も特徴的なスイッチ・マトリクス(SWM)を解説します。

LPC8xxの差別化周辺回路 概要
スイッチ・マトリクス IOピンに内臓デジタル回路の入出力を割当てる機能。IOピン数≦内蔵回路数時に有効、かつ、ピン配置自由度大。
アナログ・コンパレータ ADコンバータの代わりにコンパレータ搭載。正負入力可能。
ステート・コンフィギュラブル・タイマ:SCT 通常タイマ機能に加え、状態遷移図からステートマシン生成もできるタイマ。
ROM API(I2C、UART、Power Control等) ROMによる(周辺回路の)API提供。
LPC8xxブロック図
LPC8xxブロック図

スイッチ・マトリクス(SWM)

トラ技2014年2月号掲載のLPC810は8ピンDIPです。電源(VSS/VDD)とデバッグインタフェース(SWDIO/SWSCL)を除くと、4ピンだけがGPIOとして使えますが、内臓デジタル周辺回路は4種以上あります。これら周辺回路は、内臓スイッチ:SWMでGPIOの任意ピンに接続が可能です。もちろん、4ピン以上の接続はできませんが、任意ピンに配置できるので、基板化する時にアートワーク設計者にも歓迎される機能でしょう。

スイッチ・マトリクスの接続(UM10601より抜粋)
スイッチ・マトリクスの接続(UM10601より抜粋)

このSWMは、既存8/16ビット機のアプリケーション置換えを狙ったLPC8xxの特徴が最も現れた機能ブロックです。パッケージ構成は、8/16/20ピンで少ピンですが、SWMのおかげで、未使用ピンが少なく使い易い32ビットマイコンになると思います。タイマIC555にも追加RC無しで置換え可能です。

ARMマイコンの選択方法

このようにARMコアマイコンは、同じコアでも周辺回路に差があるマイコンが各社から発表されます。また、デジタル周辺回路だけでなく、アナログ周辺回路の実装も増えてきました。ARMマイコンの選択は、ARMコアの特徴と、各社が差別化のために実装した周辺回路による特徴、この2つを理解した上での選択が重要になります。従来の汎用性よりも、どこに、どのように使うかというよりアプリ重視のマイコンが発表されるからです。