LPC8xxテンプレート(LPCOpen+ROMライブラリ版)発売

LPC8xxテンプレート(LPCOpen+ROMライブラリ版)を¥1000(税込)で販売します。テンプレート概要と仕様は下記です。

LPC8xxテンプレート概要(もくじP1)
LPC8xxテンプレート概要(もくじP1)
LPC8xxテンプレート仕様(もくじP2)
LPC8xxテンプレート仕様(もくじP2)

テンプレートは、LED出力とSW入力のみを組込んだ「シンプルテンプレート」と、組込み必要機能をほぼ全て盛込んだ「メニュードリブンテンプレート」の2つをセットにし、もくじ内容のPDF資料添付で¥1000です。

購入ご希望の方は、メール(宛先:info@happytech.jp)にてお知らせください。銀行振込口座を返信いたしますので、税込代金¥1000円を振込でください。入金確認後、全解説ページとテンプレートプロジェクトをメールにてお送りします。後は、ご自由にテンプレートへ変更や修正を加えて頂いて、LPC8xxの習得、本来のアプリ開発に役立てて頂ければ幸いです。

「シンプルテンプレート」は、LPCXpressoプロジェクトファイルで、LED出力とSW入力のみの機能をプログラム済みで、LPCXpressoLPC820評価ボード単独での動作が可能です。

「メニュードリブンテンプレート」は、LPC820評価ボードにBaseBoardを接続し、I2C EEPROM、LCD、UARTなどの組込みマイコンに必要な機能をほぼ全て実装したテンプレートです。PC接続のメニュードリブン方式で作成したため、関数単位で移植性が高いソフトです(もくじP1動作中の写真、P5ファイル一覧、P10ハードウエア構成などを参照)。

テンプレートは、NPX/ARM社提供のLPCOpenライブラリ(V2.01)とマイコンROMライブラリを使っています。LPC8xxには、上記の他に、従来版ライブラリもありますが、本テンプレートは使っていません(もくじP8に詳細記載)。従来版ライブラリ使用のテンプレートも、近日中に開発、別売(予価¥1000)予定です。従来版ライブラリのテンプレートをご希望の方は、しばらくお待ちください。

Cortex M0+マイコンのLPC8xxは、8/16ビットマイコンの置換えを狙った、従来品より高性能な割込み専用回路や低消費電力、低価格が売りの、世界定番ARM32ビットマイコンです。本テンプレートと確実に動作する市販評価ボードを使えば、LPC8xx習得、早期アプリ開発や評価に最適な環境が得られます。

このテンプレート対象者は、初級~中級のソフト開発者です。上級者は、これに似たテンプレートを既に持っているからです。本来は、上級者がテクニックを含む自分のテンプレートを初級~中級者へ教え、教えられた側でさらに、テンプレートに修正を加えれば、技術継承も容易です。しかし、この継承は、習得済みの者にとっては、オーバーヘッドで、未習得の者にとっては、理解困難な面が多いものです。販売テンプレートには、詳細な資料が付いていますので、だれにでもその内容が理解できます。また、テンプレートソースには、「判りにくい英語ではなく、日本語コメント」を豊富につけていますので可読性も高いと思います。

PS:ルネサスのRL78/G1xマイコンのテンプレートもコチラで販売中です。

LPC820 vs. RL78/G13 割込みコントローラ比較

NVICとRL78/G1xの割込みコントローラ比較

LPC820やCortex M0/M0+マイコンは、割込み処理性能を強化した新しいNVIC: Nested Vectored Interrupt Controllerを持っています。RL78/G1xは、4バンク構成の従来型割込みコントローラです。NVICは、これまでソフトで行っていた割込み 処理を、殆どNVICハードで行います。頻繁な割込みに対する効率化(テール・チェイン)などにより、割込み応答時間が均一になり、高速処理が可能です。

CPU LPC820 RL78/G13、RL78/G14
割込み回路 NVIC: Nested Vectored Interrupt Controller Interrupt Controller
レジスタバンク なし 4バンク(RB0/1/2/3)
レジスタ待避場所 スタック バンク
バンク使用時はスタック
PUSH/POP動作 ハード:NVIC処理(ソフト比、応答時間が均一で高速 ソフト処理
多重割込み受付 デフォルト許可 デフォルト禁止(受付はソフトでEI設定要)
テール・チェイン機能 あり なし
割込み優先レベル 4(高0/1/2/3低)、デフォルトレベル0 4(高0/1/2/3低)、デフォルトレベル3
ISR記述 規定ISR名でCソース記述(オーバーライド可能) __interruptを付加し、規定ISR名記述(オーバーライド不可)

 

割込み起因のバグは、再現性が低く、デバッグが厄介なものです。定量的な評価はできませんが、NVICの謳い文句やこの比較表以上に、割込み処理に対して、有効になると思います。

LPC820 vs. RL78/G13 I2C API比較

マイコンによるI2C APIの差

API比較
API比較

マイコンのI2CにEEPROMを接続する例でAPIを比較します。RL78/G13、RL78/G14、LPC820のI2C関連APIの関数名だけを抜き出して列挙しました。太字は初期化関数です。

RL78/G13とRL78/G14は、CubeSuite+のコード生成を使うと、両マイコンとも同じAPI関数でEEPROM制御ができますが、ここでは、あえて出典のアプリケーションノートを使った場合を示しました。これらアプリノートは、最近リリースされたものです。

この表からマイコン、メーカでAPIとアプリの切り口が、かなり異なることが判ります。例えば、RL78/G13の場合は、SCLのHigh/Low出力など、プリミティブなAPIがあります。RL78/G14は、上位/下位の2階層構成(_EepMdl_と_Drv_で分離、各層に初期化があるので太字関数は2つ)で、マルチスレーブが容易です。LPC820は、3つの中では最もシンプルなAPIでCubeSuiteのコード生成出力に近いものです。

一方、最もアプリに近いAPIは、似ています。例えば、R_EEPROM_R、R_IIC_EepMdl_Read、I2C_MstReceiveやR_EEPROM_W、R_IIC_EepMdl_Write、I2C_MstSendなど。

このように比較的よく使われるEEPROM接続でも、APIは様々です。従って、APIを利用するアプリケーションも、残念ながら異なるものとなります。マイコン選定に当たって、デファクトスタンダートや、開発者の経験で選ばれる理由がここにあります。

テンプレートは、市販の入手容易なボードと無償ツールを使って、結局はオーダーメードになるマイコンアプリの初期立ち上がりを加速するためのものです。人気のあるマイコン機種と使い方を厳選し、トリッキーな手法なしに、素のマイコン性能を引出せるテンプレートを目指します。テンプレートに対するご意見、ご希望などは、info@happytech.jp へお寄せください。

I2C接続EEPROMの使用シナリオ

前回の記事で問題にしたLPC8xxテンプレートI2CのAPIは、「LPCOpen」と「内蔵ROM」両方を使うことに致しました。UARTはLPCOpneを使うとデバイス最高速度30MHzで動作しますので、これでLPC8xxテンプレート開発を続けます。

 

さて、I2CのAPIを使ってテンプレートにどのような使用例を追加すべきかを検討しました。接続デバイスは、「I2Cインタフェースで最も利用が多いEEPROM、動作は、ページライト/シーケンシャルリード、保持データは、マイコン再起動時に必須となるデータ、例えば、電源断時のスイッチ状態」などとします。

これは、RL78/G1xテンプレートのデータフラッシュ使用例と同じです。RL78/G1xは、4KBのデータフラッシュを内蔵しており、様々な使い方ができます。私は、このデータフラッシュにEEPROM的な使い方を想定し、RL78/G1xテンプレートに実装しました。

LPC8xxには内臓データフラッシュはありませんが、IAP: In-Application Programmingという64バイトのページ(ページについては後で示す)を持つROM書込み/消去の機能があります。これを使うと、EEPROMの代用ができます。が、ROM自体をプログラムで書換えるのは、少し抵抗があります。従って、LPC8xxテンプレートにはIAPを実装しない予定です。代わりに、応用範囲の広いI2CにEEPROMを実装します。

I2C接続のEEPROM仕様

EEPROM仕様
EEPROM仕様

I2C接続の代表的なEEPROM仕様を示します。容量が大きくなると、ページデータ数が16、32、64、128バイトへ増えます。ページとは、纏めてライトする時の単位です。EEPROM書込み保障回数は、10万~100万回ですので、1バイト毎にライトする代わりに、ページ単位にデータを纏めてライトすると、ライト回数を減らせます。しかしその分、ページライト後に待ち時間も発生します。

リードは、最後にライトしたアドレスのデータを読む、カレントアドレスリードが基本です。任意アドレスリードは、ライトデータを0にしたダミーライトを行い、カレントアドレスを再設定した後で通常リードをします。カレントアドレスから、最大アドレスまでのシーケンシャルリードが可能です。

EEPROM使用シナリオ

これらリード/ライト方法や仕様を俯瞰すると、EEPROMに保存するデータは、ページ単位が適していることが判ります。また、使い方は、マイコン起動時、最後にEEPROMにページライトしたデータをリードしマイコン運用、これらデータ更新時に、更新データを一塊のページ単位でEEPROMへライトし、再起動に備えるなどを想定します。そこで、このシナリオでLPC8xxテンプレートに実装します。

API利用マイコンプログラミング

3種類のAPIライブラリ

LPC8xxマイコンプログラミングのAPIライブラリは3種類あります。以前記事のLPCOpenとLPCClose、加えてLPC8xx内蔵ROMでI2CやUARTのAPIを提供中なので3種類です。

API提供ライブラリ 状況(2014年3月現在)
LPCOpen:Lpc_chip_8xx_lib I2C関連のi2c_8xx.cは、clock enable/disableのみ、他は未実装(V2.01版)
LPCClose:Lpc800_driver_lib 全API提供中(2012/12/18版)
内蔵ROM UARTは、デバイス最高動作速度の30MHzで動作せず

 

2014年3月現在の各ライブラリ状況を示します。個人的に、LPC8xxテンプレートには、「LPCOpen」を使いたいと考えてきました。しかし、最大動作速度30MHzでのテンプレートには、「LPCClose」を使わざるを得ないようです。少ピンLPC8xxの活用には、I2Cインタフェースが重要ですが、LPCOpenライブラリI2C関連は未完成だからです。

私の推測ですが、ROM APIでLPCOpenのi2c_8xx.c未完成部分の代用ができますので、i2c_8xx.cはこのままの状態で落ち着く可能性があります。この場合の問題は、LPC8xx最高速度30MHzでROM APIが動作しない点です。

解決策は2つ。1つは、テンプレート30MHz動作をあきらめ、ROM APIが動作する最高速度24MHzに変更すること、もう1つがLPCOpenの代わりにLPCCloseを使うこと、です。世界標準のLPC8xxは、まだ新しいマイコンなので、状況が変わるまでしばらくは我慢も必要です。

API利用のマイコンプログラミング

開発中のLPC8xxテンプレートは、LPCOpenからLPCCloseへ使用API変更の可能性が出てきました。2つのライブラリを同時に使用することも考えましたが、ソースが煩雑になりますし、気持ちも悪いので止めます。

そこで、使用ライブラリの変更やライブラリ自身のバージョンアップに耐えられるプラグラミングについて検討します。その結果、2つの方法でAPI関数にアクセスします。

API利用方法 説明 使用例 API変更時
直接型 ユーザソースからAPI関数を直接コール クロック設定など エディタ一括変更
間接型 ユーザ前処理関数内でAPI関数をコール I2C、UARTなど 前処理関数内のみ

 

「直接型」は、ユーザソースにAPI関数をそのまま記述する、本来なら一般的な方法です。これに対して、「間接型」は、APIコールの前に何らかの関連処理や前処理が必要な場合で、この処理を1か所に纏めユーザ関数化します。つまり、利用側のユーザソース→纏めたユーザ関数→API関数の順番にアクセスします。今回のような使用APIの種類変更時には、この関連処理を纏めたユーザ関数内のみの変更で済みます。直接型の変更は、エディタの一括変更などで対策します。

例を示します。I2Cマスタ送信API関数は、データの中身は無視して、送信バイト数分を、I2Cバスに送信します。一方、API利用側は、EEPROMとセンサデバイスなどでは、リード/ライトアドレス長が2バイト/1バイトと異なるので、それぞれ別のデータフォーマットを持ちます。そこで、このデバイス毎のデータとAPIフォーマット変換を前処理にして関数化します。I2C送信は、全てこの前処理関数を経由してI2Cマスタ送信APIを利用します。その結果、API変更の対策は、前処理関数内に閉じ込められます。

この方針でAPIを利用すれば、使用APIの変更やAPIバージョンアップに対しても、ユーザソースの変更箇所を集中させ、かつ、簡単に変更できます。

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テンプレート開発環境

テンプレート最大動作クロック設定の目的

LPCOpenライブラリのスタートアップ処理変更

スタートアップ処理は、本来変更不要です。但し、唯一変更したい箇所が、デフォルト24MHzのシステム動作クロック設定:SystemSetupClocking()です。テンプレートは、CPU最大速度の30MHz動作にします(目的は、後述)。このシステム動作クロックは、ユーザプロジェクト処理のHdwInit()で再設定も可能です。しかし、一旦設定したクロックを再度設定するのは、なんとも気持ちが悪いです。このクロックはマイコン全ハードの動作を決めるので、SleepやPower_Downで止める以外は、安定発振が無難だからです。

LPCOpen APIとCubeSuite+コード生成の違い

LPCOpenサンプルソフトのシステム動作クロック設定関数SystemSetupClocking()を観ると、API関数に、やたらと1や2などの数値パラメタを代入しています(L103と112)。これは、CubeSuite+コード生成ではGUIで設定するパラメタを、LPCXpressoでは、API関数に直接代入して動作を変えるからです。GUIか、パラメタ代入か、どちらが簡単かは、意見の分かれるところですが、私はGUIが好きです。パラメタの場合は、マニュアルを読みながら値を設定する必要があるからです。

SystemSetupClocking()
SystemSetupClocking()

私のようなGUI好きな人向きに、システム動作クロックのパラメタを算出するExcelツールがあります。

システム動作クロックパラメタ算出ツール

Excelツールの使い方
Excelツールの使い方

Excelツールは、内臓PLLのMain CLKとFinを設定すると、システム動作クロック設定に必要となるMSEL、SPEL、DIVの3パラメタを算出します。2ページ構成で、1ページ目にPLL outのMain CLKとFinの入力セルがあります。ここへ60MHz、12MHzを設定します。するとPLLが安定動作する(緑エリア)MSELとPSELが4,1と判ります。また30MHz のSystem Clockには、SYSAHBCLKDIV=DIVのラジオボタンで2を選択すれば良いことも判ります。マニュアルを読むよりも簡単です。算出パラメタをAPI関数へ代入して、デバッガでSystemCoreClockをプローブすると、30MHzに変わったことが確認できました。

SystemCoreClockの確認
SystemCoreClockの確認

システム最大動作設定の目的

テンプレートは、システム最大動作速度の30MHzで開発します。これは、最短で処理を行うためです。そして、処理後はCPUをSleep(RL78/G1xはHALT)させます。この時は、周辺回路だけが動作します。Tick割込みでCPUのSleepは解除され、再び同じ動作を繰り返します。CPU最大速度とSleepの時間割合で最終的な消費電力が決まるわけです。つまり、CPUは時分割動作します。

例を示します。表示デバイスとして良く使うLCDの初期化には、数msec以上の待ち時間が必要ですが、この時間をCPUが待つのはムダです。そこで、この間はSleepし、数msec経過後に起き上がってLCD処理を行うなどです。これは、RL78/G1xテンプレートに添付したLCDアプリ例で実施しています。

テンプレートを当該アプリへ適用した後に消費電力を調整します。LPC8xxの場合は、Excelツールを使ってシステム動作クロックを徐々に下げ、時分割処理が達成でき、かつ、消費電力も低くなるシステム動作クロックを探します。システム動作クロックを下げればCPU消費電力は下がりますが、逆に処理時間は長くなりSleepが短くなるので、この方法で、両者のバランスがとれたクロック速度を探します。

RL78/G1xテンプレートの場合も同じです。CubeSuite+コード生成は、GUIで動作クロック速度を選択し、コード生成をクリックすると、ユーザプログラムに上書きされるので、作成ソースをいじることなく簡単安全にクロック速度の変更ができます。やはりGUIの方が楽ですね。

携帯やスマートフォン搭載のマイコンは、バッテリを長持ちさせるために、あらゆる方法を駆使して消費電力を下げる工夫をしています。ここで示したシステム動作クロックを下げるのも、その方法の1つです。

システム最大動作クロックをテンプレートに適用した後にアプリを開発すれば、消費電力を削減する方法が明確になりますし、その方法も簡単です。後は、この方法を成功させるように、CPU時分割処理向きのアプリを開発すれば良いのです。

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に比べ、解読しにくい箇所もありますが、組込みマイコン標準周辺回路ライブラリを夢見て活用したいと思います。

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つを理解した上での選択が重要になります。従来の汎用性よりも、どこに、どのように使うかというよりアプリ重視のマイコンが発表されるからです。