HOME | Raspberry Pi | ビジネス書籍紹介 | 2026-01-04 (Sun) Today's Access : 169 Total : 1260867. Since 10 Sep. 2019

LPC810 (NXP/ARM Cortex-M0+)
2023.01.30

YouTube でも紹介しています。画像をクリックすると再生できます。

●LPC810M021FN8
LPC810はNXPセミコンダクターズジャパンのARM Cortex-M0+コア搭載の32Bitのマイコンです。 コードサイズ低減のために、UART/I2CのAPIをROM内に持ち、APIを呼び出して使うことができます。
ARM Cortex-M0+(24MHz max:30MHz)
4KB FLASH/1KB RAM
UARTx2/SPIx1/I2Cx1/1.8-3.6v

今回は、LPC810用ライターを作成して、Lチカさせてみました。

●LPC810は生産を終了しています
LPC810はディスコン製品ですが、2023年2月1日時点、オレンジピコショップに大量に在庫があるようです。

当時は80円そこそこの価格だったようですが、仕方ありません。10個購入しました。

トランジスタ技術2014年2月号特集「最軽量!8ピンDIP ARMエントリ誕生」では、このLPC810を紹介しています。
付録には、ARM32ビット・マイコンLPC810 1個と実験用プリント基板、 CD-ROMには、コードをビルドするための「LPCXpresso」と ビルドしたコードをLPC810に書き込むツール「Flash Magic」、サンプルコードなどがはいっています。


特集第2章 組み立て式!Lチカ1日体験コースでは、Lチカと7セグLEDを取り扱っています。

●回路図

トランジスタ技術2014年2月号 P54

このままでは内容を把握しにくいので、LPC810への書込み、Lチカ、7セグLEDの3つの機能に分けます。

■LPC810への書込み機能


LPC810は、5番ピンをグランドに落とすことで、ISP機能が有効になり、UART接続により、プログラムを書き込むことができるようになります。

Programming the LPC810M021FN8

●Adafruit CP2102N Friend - USB to Serial Converter
USBシリアル変換には、Adafruit CP2102N を使いました。

LPC810の1番ピンに、CP2102NのRTSを繋がないと、後述の書込みツール Flash Magic でHEXファイルを転送する際にエラーとなり書き込みできません。

【Adafruit CP2102N】
Power Pins
・5V pins - These are the 5V power pins. They receive 5V output from USB and can supply ~500mA peak.
3V pin - This is the 3.3V power pin. It is the output from the 3.3V regulator and can supply ~500mA peak.
GND pins - These are common ground for power and logic.
FTDI Data Pins
The following pins are found at the back of the board. The pin order matches the FTDI cables in the Adafruit shop and use 3.3V logic, but are 5V compliant. They should work in the vast majority of 3.3V and 5V signal systems.
・CTS - Clear To Send control input. This pin is active low.
TXD - UART data transmit pin. This pin sends the serial output.
RXD - UART data receive pin. This pin receives the serial input.
RTS - Ready To Send control output. This pin is active low.
Control Pins
・SU - SUSPEND pin. This pin is driven high when the device enters the USB suspend state.
・#SU - SUSPENDb pin. This pin is driven low when the device enters the USB suspend state.
・IO2 - GPIO pin. Can be used as a digital input or output.
・IO3 - GPIO pin. Can be used as a digital input or output.
・RST - Reset pin. This pin is active-low.
Modem Pins
・DSR - Data Set Ready control input. This pin is active low.
・DTR - Data Terminal Ready control output. This pin is active low.
・DCD - Data Carrier Detect control input. This pin is active low.
・RI - Ring Indicator control input. This pin is active low.


配線はとてもシンプルです。

しかし、これでは使い勝手が良くないので、汎用的な回路に拡張すると下記のような回路になります。

書込みを行う際は、スライドスイッチにより、5番ピンをグランドに落とします。 リセットスイッチは、プログラム書込み後の再起動に用います。

ユニバーサル基板上に配置しました。

基板下部に、LPC810の8本のピンを直接引き出しているので、ブレッドボードに挿して、そのまま回路を組むことができます。 また、LPC810は基板上の丸ピンソケットに差し込んでいるだけなので、抜き差しも可能です。

■Lチカ回路




●開発環境 LPCXpresso IDE のインストール
LPCXpresso IDE v8.2.2

LPCXpresso を起動します。操作方法はトランジスタ技術2014年2月号や下記書籍などを参考にしてください。

ボクのLPC810工作ノート 鈴木哲哉著
昨今流行のRaspberry PiやArduinoなどとは比較にならないくらいシンプルなLPC810の備える機能を網羅した本書の製作例は、全部の回路図、配線図、部品表を掲載し、電子工作好きの人が集った時のように設計上の愉快な試みを語り、製作上の事務的な説明はサクッとすませ、完成した際の実測値を示し、拘りの製作時における臨場感溢れる写真も満載した「作って楽しい」「読むだけでも楽しい」実作マニア、エア工作マニアどちらにも楽しんでいただけること請け合いの作者渾身の一冊です。

●コーディング
#include "LPC8xx.h"

#define BIT_IO  0b00000100
#define BIT_SW  0b00000010
#define BIT_LED 0b00000100

void SwitchMatrix_Init(){
    LPC_SYSCON->SYSAHBCLKCTRL |= (1<<7);
    LPC_SWM->PINENABLE0 = 0xffffffbfUL; 
}

int main(void)
{
    volatile int8_t SW1;

    SwitchMatrix_Init(); 

    LPC_GPIO_PORT->DIR0 = BIT_IO;

    while(1)  {
        if ( (LPC_GPIO_PORT->PIN0 & BIT_SW ) == BIT_SW ) {
            LPC_GPIO_PORT->CLR0 = BIT_LED;
        }else{
            LPC_GPIO_PORT->SET0 = BIT_LED;
        }
    }
}

【ソースコード解説】

LPC810は、スイッチ・マトリクスという機能を実装しています。 スイッチ・マトリクスは、ユーザが自由に端子と内部の機能回路をスイッチにより割り当てることができます。 この機能により、8ピンDIPのLPC810も各種ペリフェラル(周辺機能)を扱うことができます。

スイッチ・マトリクスの設定

void SwitchMatrix_Init() { 
    LPC_SYSCON->SYSAHBCLKCTRL |= (1<<7);
    LPC_SWM->PINENABLE0 = 0xffffffbfUL; 
}
SwitchMatrix_Init()関数により、LPC810の端子と内部回路を関連付けます。 ここでは、PIO0_2として、I/Oポート機能を4番ピン(LEDの接続端子)に割り当てます。 この設定は、スイッチ・マトリクス・ツールで行います。

LPC810スイッチ・マトリックス・ツールのインストール
Switch Matrix Tool - LPC8xx ver1 20130602.zip
※公式サイトのリンクが切れているようなので、当サイトからダウンロードできるようにしています。

ファイルを解凍すると、拡張子が jar の Javaアーカイブ・ファイルが生成されます。 Javaアーカイブ・ファイルのショートカットをディスクトップ上に貼っておきます。
このJavaアーカイブ・ファイルを起動するには、Java実行環境をダウンロードしてインストールする必要があります。

Java実行環境のインストール
Java for Windows

スイッチ・マトリックス・ツールのショートカットをダブル・クリックして起動します。


デバイス選択画面が開くので、LPC810M021FN8 をクリックします。


今回LEDの点灯に使用する4番ピンをクリックすると、ピンの機能を選択するダイアログが開くので、PIO0_2にチェックをいれます。


このツールにより生成された SwitchMatrix_Init() 関数をコピペして使います。


LPCXpresso の編集画面に SwitchMatrix_Init()関数をコピペしています。

GPIO関連レジスタとビット構成
31~6 5 4 3 2 1 0
未使用ビット PIO0_5 PIO0_4 PIO0_3 PIO0_2 PIO0_1 PIO0_0



LPC810は、電源ピンの6番と7番を除いて、8番ピンから1番ピンに向かって、PIO0_0~PIO0_5 に割り振られています。
LPC810では各種レジスタを操作することで、外部とのやりとりを可能にしています。
int main(void) {
    volatile int8_t SW1;

    SwitchMatrix_Init(); 

    LPC_GPIO_PORT->DIR0 = BIT_IO;

    while(1)  {
        if ( (LPC_GPIO_PORT->PIN0 & BIT_SW ) == BIT_SW ) {
            LPC_GPIO_PORT->CLR0 = BIT_LED;
        }else{
            LPC_GPIO_PORT->SET0 = BIT_LED;
        }
    }
}
GPIOデータ方向レジスタ | 入出力選択ビット(DIRP0)
 0:入力ピン / 1:出力ピン

DIR0 PIO0_5 PIO0_4 PIO0_3 PIO0_2 PIO0_1 PIO0_0
0 0 0 1 0 0
Lチカ回路では、PIO0_1 を入力、PIO0_2 を出力ポートに設定しています。
LPC_GPIO_PORT->DIR0 = 0b00000100;

GPIOポート0ピン・レジスタ | ロジック・レベル・ビット(PORT0)
 0:Lレベル / 1:Hレベル

PIN0 PIO0_5 PIO0_4 PIO0_3 PIO0_2 PIO0_1 PIO0_0
0/1 0/1 0/1 0/1 0/1 0/1
Lチカ回路では、スイッチが押されていないときにPIO0_1がHIGH(1)になります。
if ( (LPC_GPIO_PORT->PIN0 & 0b00000010 ) == 0b00000010 ) {

GPIOポート・セット・レジスタ | ロジック設定ビット(SETP0)
 0:- / 1:Hレベル出力

SET0 PIO0_5 PIO0_4 PIO0_3 PIO0_2 PIO0_1 PIO0_0
0 0 0 1 0 0
スイッチが押されている間、Hレベル(1)にして、LEDを点灯させます。
LPC_GPIO_PORT->SET0 = 0b00000100;

GPIOポート・クリア・レジスタ | ロジック設定ビット(CLRP0)
 0:- / 1:Lレベル出力

CLR0 PIO0_5 PIO0_4 PIO0_3 PIO0_2 PIO0_1 PIO0_0
0 0 0 1 0 0
スイッチを離したときに、Lレベル(1)にして、LEDを消灯させます。
LPC_GPIO_PORT->CLR0 = 0b00000100;


LPCXpresso 左下のパネルにある Build 'LPC810_SW_LED' [Release] をクリックするとビルドが実行され、HEXファイルが生成されます。

■LPC810への書き込み
LPC810のフラッシュ・メモリへの書き込みには、Flash Magic を使用します。
まずは、USBシリアル変換モジュールCP22102Nのデバイスドライバをインストールします。

●CP22102Nデバイスドライバのインストール

デバイスドライバーをインストールして、USBシリアル変換モジュールをWindowsパソコンに接続、デバイスマネージャーを起動すると、 ポート(COMとLPT)のところに、COM3が追加されているのがわかります。
これで、Flash Magic により、HEXファイルの書き込みが可能になります。

●Flash Magicのインストール
Flash Magic Programming Tool for NXP Semiconductors

Flash Magic を起動します。

左上の「Select」ボタンをクリックすると、ダイアログよりデバイスを選択できます。
COM Port には、デバイスマネージャーで認識されているCOMポートを指定します。
「Start」をクリックすると、LPC810へ書き込まれます。

デバイス選択ダイアログ


■Lチカ動作確認

スライドスイッチをHIGHに戻して、リセットボタンを押してプログラムを起動しましょう。プッシュボタンが押されている間、LEDが点灯します。

■7セグメントLED回路

7セグメントLED回路部分です。


外部には、VDD、GND,SCK、RCK、SERの5つのピンを引き出しています。

//ヘッダファイルの読み込み
#include "LPC8xx.h"
#include "lpc8xx_uart.h"

#define RCK     3   // ラッチ出力信号(PIO0_3)
#define SER     1   // シリアルデータ出力信号(PIO0_1)
#define SCK     2   // クロック出力信号(PIO0_2)

extern volatile uint32_t UARTRxCount;           // UART受信カウント変数
extern volatile uint8_t UARTRxBuffer[BUFSIZE];  // 受信データ格納変数

void degit_disp(uint8_t n);                     // 7セグLED表示用関数

void SwitchMatrix_Init()
{
    /* Enable SWM clock */
    LPC_SYSCON->SYSAHBCLKCTRL |= (1<<7);

    /* Pin Assign 8 bit Configuration */
    /* U0_TXD */
    /* U0_RXD */
    LPC_SWM->PINASSIGN0 = 0xffff0004UL;      // UART0機能を使用

    /* Pin Assign 1 bit Configuration */
    /* RESET */
    LPC_SWM->PINENABLE0 = 0xffffffbfUL;      // RESET機能を使用
}

int main(void)
{
    volatile int32_t i, j;                            // ループカウンタ変数
    volatile uint8_t k;                               // 文字コードを数値に変換したデータ変数
    volatile uint8_t LED = 0;                         // LEDの状態フラグ(0:OFF, 1:ON)

    volatile const uint8_t degit_data[] = {           // 7セグLEDの数字構成データの定義
        0b00111111, // 0
        0b00000110, // 1
        0b01011011, // 2
        0b01001111, // 3
        0b01100110, // 4
        0b01101101, // 5
        0b01111101, // 6
        0b00100111, // 7
        0b01111111, // 8
        0b01101111, // 9
    };

    UARTInit(LPC_USART0, 115200);                     // UART初期化関数(115200bpsに設定)

    SwitchMatrix_Init();                              // スイッチ・マトリックスの設定

    //ポートの方向決定(出力ポートに設定)
    LPC_GPIO_PORT->DIR0 |= (1 << RCK);                // ラッチ出力信号端子(PIO0_3)
    LPC_GPIO_PORT->DIR0 |= (1 << SER);                // シリアルデータ出力信号端子(PIO0_1)
    LPC_GPIO_PORT->DIR0 |= (1 << SCK);                // クロック出力信号端子(PIO0_2)

    for (i = 9; i >= 0; i--) {                        // 9→0まで数字のカウントダウン
        degit_disp(degit_data[i]);                    // 7セグLEDに出力表示
        for ( j = 0; j < 0xFFFFF; j++ );              // 表示切り替りのウェイト挿入
    }

    while ( 1 ) {                                     // ループ動作
        if ( UARTRxCount >= 1) {                      // UART受信時(文字数が入力され1以上となる)
            LPC_USART0->INTENCLR = RXRDY;             // UART割り込み禁止
            k = (uint8_t)UARTRxBuffer[0] - '0';       // 数字の文字コードを数値に変換
            if ( (k >= 0) && (k <= 9) ) {             // 受信文字が数字0~9のとき
                degit_disp( degit_data[k] );          // 7セグLEDに出力表示
            }
            k = (uint8_t)UARTRxBuffer[0] - '+';       // 入力文字コードが'+'のとき(k=0)
            if ( (k == 0) || (LED == 1) ) {           // '+'(k=0)もしくは,LED状態フラグがONのとき
                LPC_GPIO_PORT->SET0 = 1 << 2;         // PIO0_2を Hレベル出力(LED1 点灯)
                LED = 1;                              // LED状態フラグ ON
            }
            k = (uint8_t)UARTRxBuffer[0] - '-';       // 入力文字コードが'-'のとき(k=0)
            if ( (k == 0) || (LED == 0) ) {           // '-'(k=0)もしくは,LED状態フラグがOFFのとき
                LPC_GPIO_PORT->CLR0 = 1 << 2;         // PIO0_2を Lレベル出力(LED1 消灯)
                LED = 0;                              // LED状態フラグ OFF
            }
            UARTRxCount = 0;                          // UART受信カウントのリセット
            LPC_USART0->INTENSET = RXRDY;             // UART割り込み許可
        }
    }
}

void degit_disp(uint8_t n)
{
    volatile int16_t i;                      // ループカウンタ変数
    volatile uint8_t out_data;               // 出力データ変数

    LPC_GPIO_PORT->CLR0 = 1 << RCK;          // ラッチ出力 Lowレベル
    for (i = 7; i >= 0; i--) {               // 7→0ビットまで繰り返す
        LPC_GPIO_PORT->CLR0 = 1 << SCK;      // クロック出力 Lowレベル
        out_data = n & (1 << i);             // 出力データを上位ビットから順次指定
        out_data = (out_data >> i) & 0x1;    // データを抽出
        if ( out_data == 1) {                // データが'1'のとき
            LPC_GPIO_PORT->SET0 = 1 << SER;  // シリアルデータ'1'を出力
        }else{                               // データが'0'のとき
            LPC_GPIO_PORT->CLR0 = 1 << SER;  // シリアルデータ'0'を出力
        }                                    //
        LPC_GPIO_PORT->SET0 = 1 << SCK;      // クロック出力 Highレベル
    }                                        //
    LPC_GPIO_PORT->CLR0 = 1 << SCK;          // クロック出力 Lowレベル
    LPC_GPIO_PORT->SET0 = 1 << RCK;          // ラッチ出力 Highレベル
}

■参考文献

PlatformIOでLPC812
LPC810
ARM LPC810 と、MLPS331 で高度計を作成(トランジスタ技術2014年2月号付録 )
Raspberry Pi(ラズベリー パイ)は、ARMプロセッサを搭載したシングルボードコンピュータ。イギリスのラズベリーパイ財団によって開発されている。
2019.12.13 モバイルバッテリーによる瞬間停電対策
2020.01.01 1280x800 HDMI MONITOR
2020.01.12 micro:bitをコマンドラインで使う
2020.02.04 サーマルプリンタを使う
2020.04.10 電卓を制御して数字を表示する
2020.08.03 Seeeduino XIAO
2020.08.09 LGT8F328P - Arduino clone
2020.09.18 電流計測モジュール INA219
2021.02.16 癒しの電子回路
2021.03.06 疑似コンソール
2021.08.08 電子ペーパー
2021.09.04 AVRマイコン・ATTiny85
2021.09.25 pH測定
2021.11.13 NTP時刻取得と活用
2021.11.27 GPS情報取得
2021.12.11 GR-KURUMI
2021.12.25 ATMEGA328P 3.3V/8MHz
2022.01.11 AS-289R2 プリンタシールド
2022.01.25 TM1637 & ATtiny85
2022.02.22 Raspberry Pi Zero 小道具
2022.03.01 ATTinyCore
2022.03.18 Adafruit QT Py + XIAO Expansion board
2022.07.31 サーマルプリンター番外編:通信筒
2023.01.01 FTP Server & SPI Flash SD
2023.02.01 LPC810(ARM Cortex-M0+)
2023.02.15 IchigoJam互換機
2023.03.01 Telnet
2023.04.26 USBメモリをUART接続で利用する
2023.05.14 焦電型赤外線モーションセンサー
2023.07.01 文字化けしないキーボード
2023.08.01 Bluetoothサーマルプリンター
2023.08.12 LattePanda 2G/32GB
2023.09.04 SI-3012KS
2023.12.01 疑似コンソール(C言語編)
2023.12.16 昭和レトロ・温度湿度時刻計
2023.12.25 二酸化炭素濃度監視
2024.01.23 なんちゃってmicro:bit
2024.02.07 オリジナル micro:bit
2024.02.23 ESP32 OTA
2024.03.08 TELNETサーマルプリンター
2024.05.08 ESP32 PROGRAM SELECTOR
2024.05.23 統合開発環境とQwiic
2025.01.24 赤外線リモコン
2025.03.25 QRCode SCANNER
2025.04.08 Keyestudio 328 WiFi Plus
2025.08.23 NanoPi NEO3
2025.09.24 I2C接続microSDモジュール
2025.10.08 UNO 3.3V@8MHz

たいていのことは100日あれば、うまくいく。長田英知著
「時間がなくて、なかなか自分のやりたいことができない」 「一念発起して何かを始めても、いつも三日坊主で終わってしまう」 「色んなことを先延ばしにしたまま、時間だけが過ぎていく」 そこで本書では、そんな著者が独自に開発した、 まったく新しい目標達成メソッド「100日デザイン」について、 その知識と技術を、余すところなくご紹介します。

まんがで納得ナポレオン・ヒル 思考は現実化する
OLとして雑務をこなす日々に飽き足らず、科学者だった父が残した薬品を商品化すべく、起業を決意した内山麻由(27)。彼女はセミナーで知り合った謎の女性からサポートを得ながら、彼女と二人三脚でナポレオン・ヒルの成功哲学を実践し、さまざまな問題を乗り越えていく。 ヒル博士の<ゴールデンルール>に従い、仕事に、恋に全力疾走する彼女の、成功への物語。

今日は人生最悪で最高の日 1秒で世界を変えるたったひとつの方法 ひすいこたろう著
偉人の伝記を読むと、最悪な日は、不幸な日ではなく、新しい自分が始まる日であることがわかります。最悪な出来事は、自分の人生が、想像を超えて面白くなる兆しなのです。偉人伝を読むことで、このときの不幸があったおかげで、未来にこういう幸せがくるのかと、人生を俯瞰する視線が立ち上がるのです。

ご飯は私を裏切らない heisoku著
辛い現実から目を背けて食べるご飯は、いつも美味しく幸せを届けてくれる。 29歳、中卒、恋人いない歴イコール年齢。バイト以外の職歴もなく、短期バイトを転々とする日々。ぐるぐると思索に耽るけど、ご飯を食べると幸せになれる。奇才の新鋭・heisokuが贈るリアル労働グルメ物語!

【最新版Gemini 3に対応!】できるGemini (できるシリーズ)
Geminiを「最強の知的生産パートナー」として使いこなすための、実践的なノウハウを凝縮した一冊です。 基本的な操作方法から、具体的なビジネスシーンでの活用、日々の業務を自動化するGoogle Workspaceとの連携、さらには自分だけのオリジナルAIを作成する方法まで余すところなく解説します。

Rustプログラミング完全ガイド 他言語との比較で違いが分かる!
Rustの各手法や考え方を幅広く解説! 500以上のサンプルを掲載。実行結果も確認。 全24章の包括的なチュートリアル。

ポチらせる文章術
販売サイト・ネット広告・メルマガ・ブログ・ホームページ・SNS… 全WEB媒体で効果バツグン! カリスマコピーライターが教える「見てもらう」「買ってもらう」「共感してもらう」すべてに効くネット文章術

小型で便利な Type-C アダプター USB C オス - USB3.1 オスアダプター
Type-C端子のマイコンボードをこのアダプタを介して直接Raspberry Piに挿すことができます。ケーブルなしで便利なツールです。

Divoom Ditoo Pro ワイヤレススピーカー
15W高音質重低音/青軸キーボード/Bluetooth5.3/ピクセルアート 専用アプリ/USB接続/microSDカード

電源供給USBケーブル スリム 【5本セット】
USB電源ケーブル 5V DC電源供給ケーブル スリム 【5本セット】 電源供給 バッテリー 修理 自作 DIY 電子工作 (100cm)

Copyright © 2011-2027 Sarako Tsukiyono All rights reserved®.