LPCXpresso_7.2.0_153リリース

2014年5月20日、最新版LPCXpresso_7.2.0_153がリリースされました。販売中のLPC8xxテンプレートもこの最新版で動作確認済みです。

新旧LPCXpresso比較

このLPCXpresso_7.2.0_153では、新規プロジェクトをウイザードで作成した時に、メイン関数を生成するファイル名が、これまでのmain.cからproject.cへ変更になりました。例を示します。

SimpleTemplateプロジェクトを新規作成の場合 main()の場所
旧LPCXpresso生成ファイル main.cファイル内にmain()あり
LPCXpresso_7.2.0_153生成ファイル SimpleTemplate.cファイル内にmain()あり
新旧LPCXpressoの比較
新旧LPCXpressoの比較

但し、旧LPCXpressoで作成済みプロジェクトを、main.cファイル名のまま最新版でコンパイルしても問題なく動作します。そのため、旧版で作成した販売中テンプレートは、SimpleTemplateもMenuDrivenTemplateも「main.cのまま」にします。

これには、ユーザ追加ファイル名をPascal形式記述にすると、LPCXpresso生成ファイルは全て小文字表記となり、「一目で、LPCXpresso作成したのか自作かを見分けられる」というメリットもあります。左:旧LPCPressoの場合で説明すると、”Launcher.c”、”Led.c”、”Sw.c”、”Userdefine.h”がユーザ追加ファイル、それ以外が自動生成ファイルということが一目で判ります。

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 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 へお寄せください。

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バージョンアップに対しても、ユーザソースの変更箇所を集中させ、かつ、簡単に変更できます。

RL78/G13とRL78/G14の推薦開発ボード

RL78/G1x開発用に最適な市販ボードを見つけましたので紹介いたします。

RL78/G1x開発推薦ボード
RL78/G1x開発推薦ボード

秋月電子通商の、印)NGX社BlueBoard-RL78/G13_64pin、3800円です。LCD、UARTドライバ×2、ADC用ポテンショメータ、LED、ブサー、E1インタフェースなどが実装済みで、単独のRL78/G13CPUボードにブレッドボードなどでLCDやUARTドライバを追加するよりもお得です。また、RL78/G14も同じ基板で動作します。NGXサイトではRL78/G14用BlueBoardも販売中ですが、自信がある方は、ご自分でCPU載せ替えもできるでしょう。

1点だけ残念なのは、LCDインタフェースが、使用頻度の高い4ビットインタフェースではなく8ビットインタフェースになっている点です。実装マイコンが64ピンなので余裕があるためでしょう。弊社RL78/G1xテンプレートは4ビットインタフェースで開発しましたが、この8ビット版へも、sfr設定、LCD初期設定、LCDコントローラへ書込みの3関数の一部のみを変更して対応できました。

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テンプレート(近日発売予定)は、もっと手軽に複数処理を実現するものです。

ADC変換精度向上方法

2013/12/16発行のルネサスエレクトロニクス アプリケーションノートに「A/Dコンバータの精度を向上させる方法」:R01AN1843JJ0100がありましたので解説します。
このアプリノートは、Smart Analog内臓のRL78/G1Aを対象デバイスとしていますが、「RL78/G13やG14などの普通デバイス」にも適用できる内容が記載されています。そこで、この普通デバイス:RL78/G1xのADC変換精度向上方法のみを抽出します。

RL78/G1xのADC変換精度向上方法

精度向上方法 内容
ハードウエアのノイズ対策 アナログ基準電圧端子:AVrefp/AVrefmの使用
アナログ入力端子に10pF~0.1uFのコンデンサ実装
アナログ信号とデジタル信号の分離、近接回避
基板アナログ領域とデジタル領域の分離、両者の1点グランド接地
ソフトウエアのノイズ対策 ADC実行中のアナログ端子近傍デジタル入出力の停止
ADC変換直後のHALT実施
ADCデータ平均化

全てA/D入力信号に対するノイズ対策です。アナログ端子に高精度チャネルと標準チャネルがあるRL78/G1Aに対し、(おそらく)全てが標準チャネルのRL78/G1xでも、できうる範囲でこの対策に沿ってADCを使うと精神的には安心できそうです。アプリノートには、定量的な対策実施済みのADCデータ平均化なしと5回平均の精度差、他社マイコンとの誤差比較も記載されています。

RL78/G1xテンプレートのADC評価

販売中RL78/G1xテンプレートでも評価したいところですが、評価設備が無いのと、(おそらく)ハードの依存性が高いでしょうから、定性的にADCを診てみます。AVrefp/AVrefm端子の使用、これらに一番近いANI2端子の使用、100ms周期の2回取得値一致によるアナログ値確定、ADC変換直後ではないがHALT利用など、完璧と言えませんが可~良の判定でしょうか。