lynxeyedの電音鍵盤

MBDとFPGAと車載で使うデバイスの備忘録

LPC810でArduino API互換環境eXodusinoを使うまとめ

8ピンDIP LPC810でArduinoライクな開発をする

Cortex-M0/M0+向けArduino API互換環境eXodusinoはLPC81xシリーズに対応開始しました。
f:id:Lynx-EyED:20130403134145p:plain
ここでは、8ピン DIPバッケージLPC810で使う方法を取り上げます。

  1. LPCXpresso IDEのダウンロード
  2. スイッチマトリクスツールのダウンロード
  3. eXodusinoのダウンロード
  4. スイッチマトリクスツールでペリフェラルが使うIOピンを指定する
  5. eXodusinoプロジェクトにコピー
  6. マイコンへの書き込み
  7. eXodusinoのLPC810M021F用プログラムのビルド方法


基本的な使い方は以前に書いたまとめとほぼ一緒です。
Arduino API互換環境eXodusinoをLPC1114 DIPで使うまとめ - Lynx-EyEDの電音鍵盤 新館

今回はスイッチマトリクスツール関連が新たに加わっています。

■必要なもの

  • PC
  • LPCXpresso IDE ver5.0.12以上
  • LPC810M021F(DIPのLPC810マイコン)
  • LPC-Link か USB-UART(プログラム書き込みに使う)


(1) LPCXpresso IDEの用意
インストール方法はCQのページから
LPCXpresso IDEのインストール

LPCXpresso IDEダウンロードは(要ログイン)
Home Page | LPCXpresso, powered by Code Red Technologies

ここではLPCXpressoの詳細設定を取り扱うことは致しません。ダウンロード後、無事起動できる事を確認してください。



(2) スイッチマトリクスツールのダウンロード
LPC81xはSPIやUARTやI2CなどのIOピンを電源以外のほぼ全てのピンから自由に割り当てる事が出来ます。
たとえばSPI0は以下のように指定します

	/* SPI0_MOSI */  // PIO0_14 -> MOSI (LSB)
	/* SPI0_MISO */  // PIO0_6  -> MISO
	/* SPI0_SSEL */  // not in use 
	LPC_SWM->PINASSIGN4 = 0xffff060eUL;

でも、このように手作業で書くのは面倒ですし、GUIツールに任せた方がよいので以下のツールの力を借ります。(ダウンロードにログインは不要)


NXP Switch Matrix Tool for LPC800 | www.LPCware.com




(3) eXodusinoのダウンロード
eXodusino[エクソダシノ]とは簡単に言うとArduinoの記述をCortex-M0/M0+に理解させるための手段です。
現状でLPC81xで動作しているのは以下の機能です

  • Serial
  • SPI (一部未実装)
  • 割り込みを除くGPIOの機能
  • delay
  • millis


ここからダウンロードできます。
lynxeyed-atsu/eXodusino · GitHub
f:id:Lynx-EyED:20120901141814p:plain
(図:この部分の「ZIP」とかいてあるボタンをクリック)
ダウンロード後、解凍すると「lynxeyed-atsu-eXodusino-(数字)」という謎フォルダ名になってしまうので、「exodusino」(鍵かっこ含まず)という名前に変更する。
これをLPCXpresso IDEの作業用ディレクトリに移動など、作業しやすい場所に移動してください。

LPCXpresso IDEを起動します
f:id:Lynx-EyED:20120901142635p:plain
QuickStartウィンドウの[Import Existing Projects]を選択し、先ほど移動したexodusinoフォルダを指定してください。
インポートが完了するとProject Explorerウィンドウに下図のような構成でeXodusinoプロジェクトが展開されます。
f:id:Lynx-EyED:20130403093504p:plain
ここでLPCXpresso IDEの必要最小限の設定はおしまいです。



(4) スイッチマトリクスツールでIOピンを指定する
ダウンロードして来たスイッチマトリクスツールのjarファイルを起動します。Mac OSXの場合はダブルクリックで起動するはずですが、起動しない場合は、ターミナル.appで

java -jar Switch\ Matrix\ Tool\ -\ LPC8xx\ ver1\ 20121210.jar 

のように起動します。
今回は8pinのLPC810M021FN8を選択します。
f:id:Lynx-EyED:20130403121554p:plain

ペリフェラルが使うIOを指定します。今回はUARTとLED点滅用のGPIOピンを使おうと思います。
UARTはTXとRXの2ピンが必要です。どのピンにも指定可能ですが、今回は

PIO0_4 -> UART0_TXD
PIO0_0 -> UART0_RXD

に指定します。USART0をクリックします
f:id:Lynx-EyED:20130403123902p:plain


次にPIO0_4をクリックし、ポップアップから、U0_TXDを選択します。
f:id:Lynx-EyED:20130403124257p:plain



同様にPIO0_0をクリックし、ポップアップから、U0_RXDを選択します。
f:id:Lynx-EyED:20130403124521p:plain

これで設定は完了です。ウィンドウ下部のswm.cをクリックし、SwitchMatrix_Init()関数の中身を貰ってきます。右クリックではコピーメニューが出ませんので、ショートカットキー[Ctrl + C]でコピーできます。
f:id:Lynx-EyED:20130403130416p:plain



(5) eXodusinoプロジェクトにコピー
/eXodusino/src/core/device_dependent/lpc800/swm.cpp にSwitchMatrix_Init()関数の中身をペーストします。
f:id:Lynx-EyED:20130403130741p:plain



(6)マイコンへの書き込み
ここではリンクを紹介するにとどめます。NXPのfacebookからですが、

  • LPCXpressoからの書き込み方法
  • flash magicを使う、シリアルからの書き込み方法

が紹介されています。

「LPC810 (= DIP8_ARMマイコン) + LPCXpresso」で,Lチカ (LED点滅)プログラムを動かしてみる | Facebook
LPC810 (= DIP8_ARMマイコン) のフラッシュへの書き込みをシリアルインターフェースで行なう | Facebook



(7)eXodusinoのLPC810M021F用プログラムのビルド方法
今回のビルド条件は以下のようなものです
デバイス:LPC810F021F
LPCXpressoから直接書き込み
マイコンの内蔵クロックで動作

LPCXpresso IDEのProject Explorer → eXodusinoプロジェクトトップフォルダ右クリック → Propertiesを選択
f:id:Lynx-EyED:20120901152810p:plain
[C/C++ Build]の項目を選択 → Manage Configurations... → [LPC810M_F021F_DIP8]を選択 → [Set Active]
[OK] → [Apply] → [OK]
f:id:Lynx-EyED:20130403132220p:plain

これで完了です。*1

Arduinoのスケッチに相当するファイルが[eXodusinoプロジェクトトップ] → [src] → [user_application.cpp]です。

USB-UARTのRX,TXをLPC810のPIO0_4,PIO0_0にそれぞれ接続するとPCからシリアルコンソールで確認する事が出来ます。また、PIO0_1にLEDを接続すると、1秒周期で点滅します。

#include <libmary.h>

void setup(void)
{
	pinMode(P0_1, OUTPUT);
	Serial.begin(9600);
	Serial.println("Start..");
}

void loop(void)
{
	digitalWrite(P0_1,HIGH);
	delay(500);
	digitalWrite(P0_1,LOW);
	delay(500);
	Serial.println(millis() / 1000, DEC);

}

一旦、メニューのProject → Cleanを選択し、その後、Project → Build Allします。
エラーが出現しなければマイコンへ書き込みをします。

[eXodusinoプロジェクトフォルダ]/LPC810M_021F_DIP8/eXodusino.axf
が書き込むバイナリです。


■配線図
書き込み後、以下の回路でテストしました。
f:id:Lynx-EyED:20130403150358p:plain
3.3V電源で駆動してください。

シリアルから9600baudで
1秒ごとに経過時間が表示され、LEDが1秒間隔で点滅します。
f:id:Lynx-EyED:20130330131831p:plain

実験風景
f:id:Lynx-EyED:20130330124030j:plain


番外編:LPC812も使ってみる

いつものフラクタルを描いてみました。今回はLPCXpresso LPC812とMAPLEボードを使っています。一部、OLEDの配線の関係でジャンパーを飛ばしました。
f:id:Lynx-EyED:20130318232303j:plain
詳細はまた、別記事にて。

*1:DIP8パッケージを選択した場合、eXodusinoはInternal RCで動作するようコンフィグレーションします

eXodusinoのフレームワーク

対応デバイスの増加と機能追加に対応する

現在、eXodusinoのgithubで公開しているプロジェクトでは、

  • LPC1114L系列*1
  • LPC1115/301

に対応しています。

[ lynxeyed-atsu/eXodusino · GitHub]

現在、国内とUSAのコミッタを合わせた5人で、複数のNXP Cortex-Mxに対応するような努力が払われており、最終の調整を進めています。

NXPのマイコンはローエンドからミッドレンジまでペリフェラルIPが統一されているので、少しの変更でかなりのデバイスをカバーできるはずですが、例えば、SPIのコアはLPC8xxとLPC11xxで異なります。また、GPIOやSystick以外のタイマーはそれぞれのデバイスに応じて実装されているので、これらの差分もeXodusinoは吸収しなければならない事になります。つまりAPIの抽象度を上げて、それよりも抽象度の低いフレームワークをコールし、このフレームワークがデバイス依存の低レベルのコードを読み出します。

もっとも、某R社のように同じIPと見せかけてデバイス毎に全く違うドライバを書かなきゃいけない、ミスを誘発するような仕組みにはなっておらず、差分もわずかなので、少しの調整で済むと思われます。*2

いままで、Arduino APIデバイスドライバをべた書きしてしまっているコードも多く、汎用性に乏しかった事もあり、この機会に書き直す事にしました。

幸い、NXPがそこそこ汎用性のあるデバイスドライバを用意してくれているので、コレの上にeXodusinoを構築する事にしました。↓こんな感じ。いままで、APIにべた書きしていた部分を完全に分離するのが目標です。

f:id:Lynx-EyED:20130311233348p:plain

*1:XL系列の動作は確認していない

*2:GPIOを除く:GPIOはローエンド機種ほど省電力動作を視野に入れているためかデバイスごとに全く違う機能を持っている事が多く、これはデバイスごとにローレベルまで作り込まなければならない上、ピン名も異なるので、あまり抽象化する必要は無いと判断しています

Software Design 2012年12月号

ちょっと告知が遅くなってしまったのですが、Software Design誌2012年12月号にて@ytsuboi氏による連載の「はんだづけカフェなう」ARMマイコンをはじめてみよう(後編)にてeXodusinoが登場しました。
Software Design 2012年12月号
f:id:Lynx-EyED:20121228192040p:plain
わーい。
SD誌2012年11月号から続いてるARMマイコンの話題ですが、LPCXpressoの導入からeXodusinoの使いかたまでユーザの視点からちょう詳しく書かれております。このブログで取り上げてない使い方等もあります。

このブログの説明なんか読まずにこちらのSD誌読んだ方が良いと思います。(爆

http://www.fujisan.co.jp/product/1535/b/865610/
Software Design 2012年12月号、電子書籍版もあるのでぜひ。

MFT2012出展その後(スマホで文字データ可視光通信)

今回、Androidアプリとマイコン(eXodusino)制御のフルカラーLEDによる可視光通信ネタをメインに展示していたわけですが、直射日光やオレンジ色の部屋のライトアップなどがあり、一定しない環境光に悩まされながらの展示でした。(初日は午後は壊滅的)

今回作ったアプリはカメラで取得した画像をHSV変換し、明度がV=100[%]のデータ(つまり白とび)、V<50[%](50%未満=つまりライトではない色データ)を間引いています。詳しい実装は(AndroidでHSV変換 - Lynx-EyEDの電音鍵盤 新館)をご覧ください。強い白色LEDトーチをフルカラーLEDの発光部に当てながらカメラで色相を読み取らせるとよい事に気がつきました。

というわけで2日目はそれでほぼ終日運用。また、10bpsまで通信速度を下げました。

2日目最終日に急いで撮った画像をYouTubeにアップしました。周りがにぎやかですが、よかったらご覧ください


Visible Light Communications by LED

LPC1114 DIPのArduinoボード "NeXtPino" 登場

Arduino本家がArduino DueでARMプロセッサに置き換わるなど、この界隈もまたにぎやかですが、依然としてDIPマイコンが使えるArduino UNOは人気が高いようですね。

32bit Arduinoクローン(ソフトのみ、ハードのみ互換含む)でも

  • chipKitシリーズ (PIC32MX/MIPS M4K)
  • Netduinoシリーズ (AT91SAM7/ARM7TDMI)
  • FEZ Dominoシリーズ(LPC2xxx/ARM7TDMI-S)
  • MAPLEシリーズ(STM32F/Cortex-M3)
  • Pellerduino (P8X32A/Parallax Propeller)

など、(あとなんかあったっけ?いろいろあると思います)

当ブログでも史上最速でCortex-M0に対応したArduino互換APIを提供しています。(STMicroのCortex-M0 Arduinoより早かったはず)

NeXtPino LPC1114 Arduino board

えとせとらのMatty氏より、DIP ARMが載るArduinoボードを提供いただきました。安心のUSB-UARTチップ搭載済み
f:id:Lynx-EyED:20121121000447j:plain
ピンアサインも深く考慮されており、使いやすくなっております。

使ってみた

コレにNetSynth.orgのGenie氏のご厚意により提供いただいたねむいさんTFT-LCDシールド(RC版)を載せてみました。*1
お約束のフラクタル描画
f:id:Lynx-EyED:20121121230006j:plain

eXodusinoライブラリのSPIの変更

NeXtPino登場にあわせ、eXodusinoライブラリのSPIクラスを改良しました
いままで、LPC1114FN28で

   SPI.begin();

とすると、今まではSCKピンはPIO0_6を使用するようになっていましたが、今回の修正でPIO0_10になりました。もし、PIO0_6をSCKピンとして使いたい場合は

   SPI.begin( SCK_P0_6 );

としていただく必要がございます。何卒ご了承ください。

f:id:Lynx-EyED:20121125102552j:plain

ボード入手方法

ITショップ「えとせとら」さんより
ITショップ「えとせとら」
あら、在庫わずか。早いもの勝ちですな。

ボクもマンデルブロ集合描きたい

eXodusinoライブラリが必要になります。
lynxeyed-atsu/eXodusino · GitHub
使い方1.(必須)
Arduino API互換環境eXodusinoをLPC1114 DIPで使うまとめ - Lynx-EyEDの電音鍵盤 新館
使い方2.(ブートローダなど。必須ではない)
Arduino API互換環境eX(ryまとめ その2 - Lynx-EyEDの電音鍵盤 新館

参考:マンデルブロについて参考にさせていただいたサイトです
マンデルブロ集合/C言語サンプル ソースプログラム/佐伯英子技術士事務所(情報工学)
ほぼそのままの実装を使わせていただいております。ありがとうございます。

user_application.cppに以下を記述し、コンパイル後NeXtPinoに書き込みます

#include <math.h>
#include <libmary.h>
#include "TFTLCD.h"

volatile int count = 0;
volatile float magnitude;
volatile float sub_x;
volatile float sub_y;

void setup() {
	Serial.begin(9600);
	SPI.setBitLength(8);
	SPI.setDataMode(SPI_MODE0);
	SPI.setClockDivider(SPI_CLOCK_DIV4);
	SPI.begin();
	//TFT-LCD init
	pinMode(LCD_DC,OUTPUT);
	pinMode(LCD_RES,OUTPUT);
	pinMode(LCD_CS,OUTPUT);

	initDisplay();

	//表示領域の初期化(全画面)
	resetArea();
	fillScreen(0,0);

	delay(1000);
	sub_x = -0.5;
	sub_y = 0.1;
	magnitude = 1;
	Serial.println("LCD Initialization finish...");
}

volatile int generateColor(int count, int base)
{
	int r,g,b;
	int d = (count % base) * 256 / base;
	int m = (int)(d / 42.667);

	switch(m) {
		case 0: r=0;          g=6*d;          b=255;         break;
		case 1: r=0;          g=255;          b=255-6*(d-43);break;
		case 2: r=6*(d-86);   g=255;          b=0;           break;
		case 3: r=255;        g=255-6*(d-129);b=0;           break;
		case 4: r=255;        g=0;            b=6*(d-171);   break;
		case 5: r=255-6*(d-214); g=0;         b=255;         break;
		default: r=0;         g=0;            b=0;           break;
	}

	return (((r >> 3) & 0x1f) << 11) | (((g >> 2) & 0x3f) << 5) | ((b >> 3) & 0x1f);
}


void loop() {

	int oldtime = 0,nowtime = 0;
	select_disp();
	resetArea();
	for(int y = 0;y < 130;y++)			// 虚部(縦方向)
	{
		for(int x = 0; x < 130; x++) {	// 実部(横方向)
			float cr = (x - 64) / 64. / magnitude + sub_x;
			float ci = (y - 64) / 64. / magnitude + sub_y;
			float zr = 0.0, zrN;
			float zi = 0.0, ziN;
			float E = 4.0;				// E:この値を超えたら発散とする
			int t,tmax = 512;			// tmax:最大計算回数

			// 収束検査
			for(t = 0; t < tmax; t++)
			{
				zrN = zr * zr - zi * zi + cr;
				if(zrN > E) break;
				ziN = 2.0 * zr * zi + ci;
				if(ziN > E) break;
				zr = zrN; zi = ziN;
			}

			int colour = generateColor(t, 64);
			int data1 = ((colour >> 8) & 0xff) | 0x100;
			int data2 = (colour & 0x0ff) | 0x100;
			sendData(data1);
			sendData(data2);
		}
	}

	unselect_disp();
	nowtime = millis();
	Serial.print("描画終了時間=");
	Serial.print(nowtime,DEC);
	Serial.println("mSec");
	Serial.print("描画時間=");
	Serial.print((nowtime - oldtime),DEC);
	Serial.println("mSec");
	magnitude = magnitude * 1.2;

	if(count++ > 10)
	{
		count = 0;
		magnitude = 1;
	}
	delay(1);
}

*1:なお、eXodusinoではこのTFT-LCDシールド専用ライブラリを標準で搭載しております

マルツのDIPモジュール基板でeXodusino

eXodusino関連の内容です。

■いままでの内容です。参考までに
Arduino API互換環境eXodusinoをLPC1114 DIPで使うまとめ - Lynx-EyEDの電音鍵盤 新館
Arduino API互換環境eX(ryまとめ その2 - Lynx-EyEDの電音鍵盤 新館


マルツからこんな基板が出たので買ってみました。PK-MYARM-SET
【PK-MYARM-SET】MB 基板付キット - 雑誌・書籍連動キット - その他 キット - マルツエレック【マルツパーツ館WebShop】
お目当ては8pin SOPパッケージのUSB-UARTチップPL2303SA。
Mac OSXでそのままじゃ動かないと噂に聞いていたのでそれの検証もかねて買いました。
f:id:Lynx-EyED:20121020141446j:plain
でけた。


うむ…
はい動きませんありがとうございました。(棒



PL2303SAのページにアクセス
PL2303SA USB to Serial Bridge Controller | Prolific USA
このページの下の方に

Mac OS X Universal Binary Driver v1.4.0 (DMG file format)

という項目があるので、dmgファイルを貰って来てインストールします。終わると強制的に再起動...


再起動後、端末エミュレータなどで

/dev/tty.usbserial

という端末が見えている事を確認できると思います。

LPC1114にeXodusブートローダを書き込むと、シリアルコンソール上で、プログラムの書き込みからいわゆる"printfデバッグ"まで出来ます。
eXodusブートローダの書き込み方法はこちらを参考にしてください。
Arduino API互換環境eX(ryまとめ その2 - Lynx-EyEDの電音鍵盤 新館

WindowsでのシリアルコンソールはTeraTermを使うと便利です。Mac/LinuxではMinicom、GUIが使いやすいCuteComがあります。

前回(Arduino API互換環境eXodusinoをLPC1114 DIPで使うまとめ - Lynx-EyEDの電音鍵盤 新館)もやったLEDホタルを作ります。
マルツの基板では

LED1  -> P1_5 (Lowで点灯)
LED2	 -> P0_7 (Highで点灯)

に接続されています。
LED1とLED2が交互に点灯するようにします。user_application.cppを次のように書き換えます

#include <libmary.h>

#define LED1	P1_5
#define LED2	P0_7

void setup()
{
	Serial.begin(9600);		// UARTのセットアップ(9600baud)
	Serial.println("\r\nStart...");
}

void loop()
{
    for(int i = 0; i < 256; i++)
    {
    	analogWrite(LED1,255 - i);
    	analogWrite(LED2,255 - i);
    	delay(5);
    }

    for(int i = 0; i < 256; i++)
        {
        	analogWrite(LED1,i);
        	analogWrite(LED2,i);
        	delay(5);
        }
}

基板上のUARTのピン設定を済ませたら、リセット(SW1)を押し、1秒以内にターミナル上から[z]キーを入力し、eXodusブートローダを書き込みモードにします。
f:id:Lynx-EyED:20121020150620p:plain
図はCuteComでの書き込み待機状態。詳細はArduino API互換環境eX(ryまとめ その2 - Lynx-EyEDの電音鍵盤 新館をご覧下さい。
書き込みが成功すれば、交互にLEDが点灯します
f:id:Lynx-EyED:20121020150533j:plain



Arduino API互換環境eXodusinoをLPC1114 DIPで使うまとめ

f:id:Lynx-EyED:20120901144546j:plain
ここでは、Arduino API互換環境 eXodusino をLPC1114 DIPで使うにあたっての手順をまとめてみました。

(1) LPCXpresso IDEの用意
(2) eXodusinoのダウンロード
(3) マイコンへの書き込み方法
(4) eXodusinoのLPC1114FN28/102用プログラムのビルド方法

Arduinoに比べて手順がちょっと多いですが、順番に説明していきます。なお、当ブログで書いてきた内容が重複してますので、ご存知の方は(4)のみ読んでいただければと思います。(プリプロセッサの切り替えを追加しましたので)


■必要なもの
・PC
・LPCXpresso IDE 4.2.3以上
・LPC1114FN28/102(DIPのLPC1114マイコン)
・LPCXpressoの左側の、みんなに邪魔あつかいされてくびちょんぱされるアレ(LPC-Link)
・USB-UART(必須ではないけど、ほとんど必須)



(1) LPCXpresso IDEの用意
LPCXpresso IDEはCQのMARY基板などでインストールされた方も多いと思いますが、おそらくその当時のバージョンですとDIPマイコンでは書き込みやデバッグが出来ません。最新のバージョンをもう一度インストールしてください。


インストール方法はCQのページから
LPCXpresso IDEのインストール

LPCXpresso IDEダウンロードは(要ログイン)
Home Page | LPCXpresso, powered by Code Red Technologies

ここではLPCXpressoの詳細設定を取り扱うことは致しません。ダウンロード後、無事起動できる事を確認してください。



(2) eXodusinoのダウンロード
eXodusino[エクソダシノ]とは簡単に言うとArduinoの記述をLPC1114に理解させるための手段です。完全互換ではありませんが、SPIでメモリを読み書きしたり、PWMでLEDを点灯させたり、キャラクタ液晶に文字を表示したり、乱数でさいころゲームを作ったりと、かなりの部分をカバーしています。

ここからダウンロードできます。
lynxeyed-atsu/eXodusino · GitHub
f:id:Lynx-EyED:20120901141814p:plain
(図:この部分の「ZIP」とかいてあるボタンをクリック)
ダウンロード後、解凍すると「lynxeyed-atsu-eXodusino-(数字)」という謎フォルダ名になってしまうので、「exodusino」(鍵かっこ含まず)という名前に変更する。
これをLPCXpresso IDEの作業用ディレクトリに移動など、作業しやすい場所に移動してください。

LPCXpresso IDEを起動します
f:id:Lynx-EyED:20120901142635p:plain
QuickStartウィンドウの[Import Existing Projects]を選択し、先ほど移動したexodusinoフォルダを指定してください。
インポートが完了するとProject Explorerウィンドウに下図のような構成でeXodusinoプロジェクトが展開されます。
f:id:Lynx-EyED:20120901143221p:plain
※以下の作業は2012年11月以降のバージョンアップでは不要になりました

ここでエラーが出た方も多いと思います。不要なプロジェクトがあるためです。cutecom-0.22-0というフォルダ*1が不要です。
このフォルダ上で右クリックし、Resource Configurations → Exclude from Build...を選択します。
f:id:Lynx-EyED:20120901143830p:plain
続いて、Select Allを選択しOK
f:id:Lynx-EyED:20120901143940p:plain

ここでLPCXpresso IDEの必要最小限の設定はおしまいです。



(3) マイコンへの書き込み方法
書き込み方法は3つ有ります

  • LPC-Linkを使いLPCXpresso IDEから直接書き込む
  • Flash Magicを使う
  • eXodusブートローダを使う

一番最初のやり方が、煩雑な手順が無く、確実に思えます。
なおeXodusブートローダを使うとTeraTermなどシリアルコンソールから無手順UARTで書き込みが出来ます。詳細は別エントリで扱おうと思います。

LPCXpressoボードのLPC-Linkを使います。LPC-Linkはこのようなピン配置となっております。JTAGではなくSWDです。
f:id:Lynx-EyED:20130407102833p:plain
上図の右側半分を切断するか、Pカッターなどで電気的に分離し、ピンヘッダを立ててLPC-Linkを横取りします。
なお、LPC1114FN28/102のSWD書き込みに使うピンは
f:id:Lynx-EyED:20120901151721p:plain
対応するピン同士をブレッドボードやユニバーサル基板を使って配線します。
3.3V電源はLPC-Linkから貰ってしまって構わないでしょう。
このままだと、LPCXpresso IDEで書き込み時にエラーを返してくる恐れがあります。LPC-Linkに接続しているデバイスがLPC1114FN28/102である事を明示的に伝える必要があります。
LPCXpresso IDEのProject Explorer → eXodusinoプロジェクトトップフォルダ右クリック → Propertiesを選択
f:id:Lynx-EyED:20120901152810p:plain
下図のように、[C/C++ Build]の項目を展開し、[MCU settings]を選択 → LPC1114FNを選択 → [OK]
f:id:Lynx-EyED:20120901153533p:plain

これで書き込みの準備段階は完了です



(4) eXodusinoのLPC1114FN28/102用プログラムのビルド方法
今回のビルド条件は以下のようなものです

  • デバイス:LPC1114FN28/102
  • ブートローダなし(=LPCXpressoから直接書き込み)
  • マイコンの内蔵クロックで動作

この条件に合わせるようにリンカスクリプトソースコードを書き換えるのはやりたくないので、コンフィグをワンタッチで変更できるようにしました。

LPCXpresso IDEのProject Explorer → eXodusinoプロジェクトトップフォルダ右クリック → Propertiesを選択
f:id:Lynx-EyED:20120901152810p:plain
[C/C++ Build]の項目を選択 → Manage Configurations... → [LPC1114_FN28_102_DIP]を選択 → [Set Active]
[OK] → [Apply] → [OK]
f:id:Lynx-EyED:20120901155829p:plain
これで完了です。

Arduinoのスケッチに相当するファイルが[eXodusinoプロジェクトトップ] → [src] → [user_application.cpp]です。
f:id:Lynx-EyED:20120901160249p:plain
デフォルトでは9600baudで1秒ごとにマイコンが起動してからの時間を秒単位で送信します。
USB-UARTのRX,TXをLPC1114の15,16番ピンに接続するとPCからシリアルコンソールで確認する事が出来ます。
f:id:Lynx-EyED:20120901161903p:plain

#include <libmary.h>

void setup()
{
	Serial.begin(9600);		// UARTのセットアップ(9600baud)
    Serial.println("\r\nStart...");

}

void loop()
{
    Serial.println(millis()/1000,DEC);  // 起動後の経過時間を1秒ごとに更新
    delay(1000);
}

一旦、メニューのProject → Cleanを選択し、その後、Project → Build Allします。
エラーが出現しなければOKです。
いよいよマイコンへ書き込みをします。

LPCXpresso IDEメニューの黒いICマークをクリック。
f:id:Lynx-EyED:20120901162036p:plain

[Browse]を選択
f:id:Lynx-EyED:20120901162244p:plain

[eXodusinoプロジェクトフォルダ]/LPC1114FN28_102_DIP28/eXodusino.axf
が書き込むバイナリです。

これを選択し、[OK]

しばらくすると書き込みが完了し、シリアルから9600baudで
1秒ごとにカウントアップが始まります。
f:id:Lynx-EyED:20120901162738p:plain

実験風景……。
f:id:Lynx-EyED:20120901163837j:plain


おい、Lチカさせろよw

はい。

LPC1114FN28/104のピンアサインを考慮しました。

f:id:Lynx-EyED:20121125102552j:plain

上の図の水色の名称がeXodusinoで使えるピン名です。黄色の四角はそのピンの持つGPIOとは別の機能です。
P0_7とP0_4でLチカしてみました。eXodusinoはこの水色のピンのうちほぼすべてのピンでanalogWriteが使えます。(最大4チャネルまで)
LチカじゃなくてLEDホタルです。P0_7とP0_4に330~500Ωくらいの抵抗を介してLEDをそれぞれに接続すると交互に"ホタル点滅"します。

user_application.cppにこのように記述します。

#include <libmary.h>

void setup()
{
	Serial.begin(9600);		// UARTのセットアップ(9600baud)
	Serial.println("\r\nStart...");

}

void loop()
{
    for(int i = 0; i < 256; i++)
    {
    	analogWrite(P0_7,i);
    	analogWrite(P0_4,255 - i);
    	delay(1);
    }

    for(int i = 0; i < 256; i++)
        {
        	analogWrite(P0_7,255 - i);
        	analogWrite(P0_4,i);
        	delay(1);
        }
}

おしまい





*1:Mac OSXなどunix系環境でTeraTermのようなシリアルコンソールを動作させるためのソフト