LPC810の書き込み&プログラム開発に関する備忘録

部品箱から、大昔に買ったLPC810がたくさん出てきた。

LPC810というのは、「8ピンARM」などと称していっとき話題になった、
NXPのARMマイコンで、多分流行った頃に買ったのだと思う。

8ピンの小さなパッケージにもかかわらず、ARM Cortex-M0コアを搭載した32bitマイコンであるということで話題になったものと思われる。当時はmbedも全盛期だったはずで、mbedのオンラインコンパイラを使った開発例もしばしば見かけた。

今となってはもっと良いマイコンがあるので積極的に設計に採用しようとは思わないものの、この在庫分に関しては、せっかくなのでなんとか料理してやりたい。
しかしながら、電子工作界隈でのLPC810に関する記事は流行当時のものばかりで、そもそも2025年にはどうすればプログラムがビルドできるのかすらよくわからなかった。

そんなわけで、何とか調べてLチカまではできるようになったので、その備忘録を残しておく。

#方針

普通のARMマイコンなので、究極的にはARMのコンパイラを持ってきて、データシートを読みながらリンカスクリプトを書いてビルドしてやればいいのだろうが、流石に面倒なので、できるだけ高級な(と言ってもプログラムメモリが貧弱なのでそこまで強力な抽象化ができるわけではないのだが)ツールを使おうとしてみる。

#プログラムのビルド

流行当時の記事をみると、mbedのオンラインコンパイラを使っている例と、LPCXpressoを使っている例がある。

mbedのオンラインコンパイラは、mbedのサービスが終了してしまったので使えない。その後の後継サービスもあるようだけれど、そもそもプログラムメモリが大きくはないので、mbedを使うくらいならもう少し薄い環境でやりたい。(RoboCup Juniorをやっている時にmbed 5を使っていたが、あれは結構デカい)

そういうわけなので、LPCXpressoを使ってみる方法で行くことにする。
しかし、実はLPCXpressoもソフトウェアとしてはdeprecatedらしい[1]

そういうわけで、その後継のMCUXpressoを使ってみることにする。

#MCUXpressoのインストール

無料。やるだけだった。MCUXpressoのダウンロードページからダウンロードして、インストールするだけ。 STとかだとこういうツールがWindowsだけというのはありがちだが、Macでも普通に使えた。

#プロジェクトの作成

  1. MCUXpressoを起動して、新規プロジェクトを作成する。
  • [File] → [New] → [Create a new C/C++ project]
  • Preinstalled MCUsからLPC810を選択。
  • ボードは選択せずにNext
  1. ウィザードの選択
  • “C++ Project” を選択してNext.[2]
  • "LPCOpen"とかいうウィザード群もあって、こっちの方が新しいらしいのだけれど、私の手元では上手くいかなかったので、一旦LPC810向けのLPCOpenライブラリはなさそうなので、LPCOpenではない方(CMSISというライブラリ群らしい)を選択する
  1. プロジェクト名の設定
  • ここではLチカなので"blink"にしておきました
  1. ライブラリの設定

CMSISライブラリを選択する。たぶんここでハードウェアごとの設定を指定するようになっているのだろうと思われる。
私はNXPのマイコンはマジで初心者なので、合ってるかわからん。
MCUとしてLPC810を選択していれば、それぞれ一択になるはずなので、選択できるものを選択する。

  1. DSPライブラリの設定

DSP(Digital Signal Processing / ディジタル信号処理)に使う高級な関数群を使うかどうかの設定。
基本は使わないのでいいはず。デカいので、不要なら無視してNextでいいはず。
高速フーリエ変換とか使いたい場合は使うといいのかもしれないが、使ったことないのでわからん。

  1. MTBの設定

Micro Trace Bufferを使うか、使う場合はどのくらいの容量を割くかの設定ができる。
こんなことをしているとメモリがすぐに足りなくなるので、使わない。

  1. CRPの設定, C++の設定

MTB同様、無視していく。

  1. プロジェクトの作成
    Finish.10秒くらいかかった。

  2. post-build stepsの設定
    このままでもビルドはできるのだけれど、これだとaxfファイルしか生成されないので、binファイルを生成するように設定する。
    [Project]→[Properties]→C/C++ Build → Settings → Build Steps の中にある、Post-build stepsに、コメントアウトされた部分があるので、アンコメントしておく。

#プログラムの実装

今回はポート2(4番ピン)でLチカする。
blink.cppを以下のように書き換えた。

#ifdef __USE_CMSIS
#include "LPC8xx.h"
#endif
#include <cr_section_macros.h>

#include "lpc8xx_clkconfig.h"
#include "lpc8xx_gpio.h"

volatile uint32_t msTicks = 0;
volatile uint32_t power=0;


void SysTick_Handler(void) {
	msTicks++;
}
void systick_delay (uint32_t delayTicks) {
	uint32_t currentTicks = msTicks;
	while ((msTicks - currentTicks) < delayTicks);
}

#define LED_PIN 2

int main(void) {

    // Clock configuration
	SystemCoreClockUpdate();
	SysTick_Config(SystemCoreClock / 1000);

	LPC_SYSCON->SYSAHBCLKCTRL|=(1<<6); // Provide clock to switch matrix
	LPC_SWM->PINENABLE0|=(1<<3); // Enable fixed pin function PIO0_2
	LPC_GPIO_PORT->DIR0 |= (1 << LED_PIN); // Set LED_PIN as output

	while(1) {
		uint32_t current = msTicks;
		LPC_GPIO_PORT->NOT0|= (1 << LED_PIN); // flip LED
		while(msTicks<current+1000){ // wait 1s
			asm volatile ("nop"::);
		}
	}
	return 0; // unreachable
}

#ビルド

上のハンマーのボタンか、Cmd+Bでビルドできる。

#書き込み

書き込みには、USB-シリアル変換回路を使う。
以下のような回路が必要。

私は、LPC810書き込み装置 | 電脳伝説を参考にして、以下のようなボードを組んだ。

実験する分にはブレッドボードに直に組んでしまえばよいと思う。

回路ができたら、書き込みにはlpc21ispを使う。

Windows向けにはFlash Magicなどのより高級なツールもあるらしいが、Macで使えるのはこれが一番安定している感じがする。
先ほどビルドしたプログラムは、プロジェクトディレクトリ下のDebug/blink.binにビルドされているので、これを使って書き込む。
(リリースビルドだとRelease/blink.binになる)

ISPボタン(SW2)を押しながらリセットボタン(SW1)を押すことで書き込みモードに入る。

lpc21isp -bin blink.bin -control /dev/tty.usbserial-0001 115200 12000
  • /dev/tty.usbserial-0001は、自分の環境に合わせて変更すること。
  • 115200はボーレート、12000はマイコン側のクロック周波数。

書き込みが成功すると、自動でリセットされ、LEDが1秒おきに点滅するはず。

#おわりに

LPCOpenを使いたい。
ってかRustで書きたい。


  1. Wayback machine ↩︎

  2. C Projectでもいいと思うけど、C++が使えるならそのほうが嬉しいからね。Rustも使えたりしないかなぁと思うけど、プログラムサイズがどうなるかが課題と思う。 ↩︎