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

サンプルソフトの構造

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コアマイコン、青がオリジナルコアマイコンを示しています。

コア差別から周辺回路差別へ

8/16ビットマイコンは、過去、現在と各社からいろいろな機種が発売されてきました。全て青のオリジナルコアマイコンで、開発手法やIDEも各社ハラバラでした。より性能の良いオリジナルコアにより、囲い込み戦略がとられていました。これら従来機の製造は、米)ロチェスター社との連帯により、将来にわたる入手性を保証する方法が、ルネサスなどで取られています。

一方、32ビットマイコンは、緑のARMコアが大半です。米)マイクロチップとオン・セミコンダクターを除く各社が、ARMコアのラインアップを提供しています。マイコンは、従来のコア差別から、周辺回路差別戦略へシフトしているといえます。実際、各社の周辺回路は、(少なくとも見た目は)16ビット機でも32ビット機でも同じものを使っています。米)サイプレス社などは、アナログ周辺回路を実装し、同じARMコア機でありながら十分な差別化も達成しています。

IoT時代の新マイコン

全ての機器がネットに繋がるIoT時代のマイコンには、通信制御は必須で、それなりの能力は必要です。これには、既存8/16ビット機で頑張るよりも、32ビット機が適しています。低消費電力と高速化の両方を追求し、IoT要求にマッチするコストパフォーマンスを満たすコアの解として、ARMコアは優れているのでしょう。また開発環境もほぼ同じなので、開発のし易さも(慣れれば)Betterです。さらにARM社は、32ビット機でありながら、8/16ビット市場を狙う低価格なCortex M0+を投入しましたので、新製品マイコンコアは、ARM独占になる可能性もあります。

ARM対Non ARMを記事へ

ARM派にとっては当たり前のことですが、世界標準と言われるCMSISを使ったアクセスやEclipse IDEなど、Non ARM派にとって「?!」を感じる箇所は多くあります。このブログではこの違和感を記載していきます。Non ARM派がARMを知る時、各自の取得技術側からARMを診ると、より効率的にARM習得ができるからです。

世界定番マイコンと日本産マイコン

ハード単体の制御に比べ、ソフトで柔軟に処理変更ができるマイコンは、優れた制御手段です。柔軟であるがゆえに、デバッグなどがリスクになることもあります。

所望の制御ができれば、どのマイコンでも構わないハズですが、実際は入手性や価格、開発環境の問題で数種類のマイコンが市場では優性です。トランジスタ技術2014年2月号によると、ARMは、「世界の定番マイコン」としての情報が豊富で、高速な32ビット動作、入手性や価格も問題なさそうです。今回は、この世界定番マイコンについて考えます。

日本産マイコン:RL78とCuteSuite+

日本産マイコンは、ルネサスエレクロトニクスに集約されました。個人的には、このルネエレの新しいマイコンRL78を応援しています。日本語情報の質、豊富さ、無償IDE:CubeSuite+、入手性、価格、性能どの項目でもRL78は優れています。特に、CubeSuite+のコード生成は、周辺機能のGUIによるパラメタ設定とAPI(Application Programming Interface)の生成により、マイコンプログラミングを変えたとも言えます。つまり、ユーザは、API利用と制御に重点を置いたプログラミングが可能となりました。「コード生成があるCubeSuite+があるのでRL78を使う」と言っても過言ではないでしょう。IDEは、世界標準のEclipse IDE版も提供し始め、グローバル化に努めていますが、コード生成なしでは使う気がしません。しかし、半導体は、大手が独り勝ちするビジネスです。今後どのようになるかは、誰にも判りません。

世界定番マイコン:ARMとEclipse IDE

一方、ARM搭載で国内入手性、価格が優れたマイコンは、トラ技にあるようにオランダNXPセミコンダクタ社のLPC8xxやLPC11xxです。秋月電子通商やマルツパーツ館で多くのLPCマイコンボードが販売中で、価格もデバッガ込みで2000円程度、Eclipseベースの無償IDEで開発します。プログラミングに便利な共通規約CMSIS(Cortex Microcontroller Software Interface Standard)使用、割込み専用回路NVIC(Nested Vectored Interrupt Controller)による高速多重割込み、32ビットなのに16ビット並みの消費電力、SWD(Serial Wire Debug)デバッグ機能など、世界定番たる実力を持っています。

英国ARM社の戦略の優れた点は、自らマイコンを製造せずに、半導体メーカにARMマイコンの設計図:コアを販売した点です。半導体各社は、このコアに独自周辺回路を付けてマイコン応用機器を開発/販売します。コアが同じARMなので、開発環境や使いこなし方はどれも同じ技術が使えます。その結果、32/64ビットのマイコンコアでは圧倒的なシェア(Wikipediaによると2004年で61%)を占めています。但し、コード生成機能は無く、ドライバはARM/NXPから提供されますが、CubeSuite+のように洗練はされていません。結局、ドライバを自作や改造する従来のマイコンソフト開発と同じです。

ところがCortex-M0+搭載のLPC8xxは、8/16ビットマイコン市場を狙ったデバイスで、低価格、更なる低消費電力で小型(8ピンから20ピン)、IOポートとペリフェラルを自由に割当てるスイッチ内臓、しかもUARTやI2CなどのAPIはROMで提供など、魅力的です。NXP社は、8/16ビット組込みマイコンキラーとも呼んでいます。全ての機器がネットで繋がる時には、このようなマイコンが使われるような気がします。

トラ技2014年2月号のLPC810も、8ピンマイコンとしては魅力的です。しかし、電源とSWDが専用ピンですので、汎用IOは4本になります。IOピン数が少ないので、18本の汎用IOピンを持つLPC820を診てみます。

LPC820とRL78/G13

LPC820とRL78/G13を比較し、世界定番マイコンの特性を考えます。

  LPC820:M101JDH20 RL78/G13:R5F100LEAFB 備考
入手性と価格 NXP直販、DigiKey等200円 ルネエレ直販、秋月電子等290円 (個人的に)入手性良いサイトの1個あたり価格(2014年1月現在)
チップ性能 32bit/30MHz動作ROM16KB,RAM4KB,Data Flash:なし汎用IO数:18 16bit/32MHz動作ROM64KB,RAM4KB,DataFlash4KB汎用IO数:48 ・LPC820はADCの代わりにアナログコンパレータ実装。・R5F100LCAFBは250円(ROM32KB,RAM2KB,DataFlash4KB)
IDE Eclipse:API自動生成なし言語:英語 CubeSuite+:API自動生成あり言語:日本語 ・LPC820は、UART、I2CはROMでAPI提供。・EclipseはGNUソフト。ルネエレも提供中。
レジスタアクセス CMSIS ルネエレ規定あり 機能的には同じもの
製造 蘭)NXP、英)ARM 日)ルネエレ ARMコアは、Cortex M0+

 

少ないIO対応の内蔵スイッチ、アナログコンパレータ、低価格設定など8/16ビットマイコン置換えを狙ったLPC820の戦略が判ります。Eclipseは、マイコンに限らずソフト開発の標準IDEになりつつありますし、LPC8xx情報の多くは英語で、API生成が無いことは残念です(GNUツール探すとあるかも…)。ルネエレは、RL78/G13以外にも多くの(日本向け)マイコンを国内製造していますので、この品種のみで評価するのはかわいそうですが、世界定番になるには不利な気がします。

良い物を戦略的に製造するグローバル企業連合に対して、様々なしがらみに縛られるルネエレの構図が現れていると言えそうです。国内自動車メーカはよく比較されますが、海外生産や現地モデルにより稼いでいるので威勢が良いです、しかし、国内資源で世界を相手にするルネエレは、とても頑張っていると言えます。

NXPマイコンのテンプレート

世界定番ARMマイコン:LPC820対応のテンプレートを開発するのも良さそうです。これには、既存RL78/G1xテンプレート機能を移植する予定です。その他、こんな機能を実装してほしい、というご要望などがございましたら、お気軽にお知らせください。