mbedのオンラインコンパイラでLPC1114のGPIOをレジスタで叩くときの注意点

LPC1114マイコンをライブラリの DigitalOut 等を使うことなく、mbedのオンラインコンパイラ上でレジスタを叩いて高速なGPIOを実現するさいの注意点です。レジスタを叩くことについては、以下のリンク先に詳しい解析が載っています。

monoist.atmarkit.co.jp

こちらのページのように LPC_GPIO0->DIR で GPIO ピンの入出力の方向を設定できますが、設定が反映されないピンがあります。
反映されないピンは以下の通りでした。

  • 3 (P0_10 / SWCLK)
  • 4 (P0_11 / R)
  • 9 (P1_0 / R)
  • 10 (P1_1 / R)
  • 11 (P1_2 / R)
  • 12 (P1_3 / SWDIO)
  • 23 (P0_0 / RESET)

ピンアサイン参考:Beginning LPC1114FN28 with Arch | mbed

ピンアサインを見ると、SWCLK、R、SWDIO、RESET の機能を有するピンだけ入出力設定が反映されないことがわかります。
また、リンク先のピンアサイン表の「PIOx_y」の左側に何かが書かれているピンだけ設定が反映されない、とも言えます。

ピンの設定について調べていくと、以下のページが見つかりました。

digimono-boys.blogspot.jp
white-clouds-in-sky.blogspot.jp

どうやら、ピンアサイン表の一番左側にある機能がデフォルトの設定になるようです。

  • 例えば、ピン3はデフォルトで SWCLK が有効になっているので、入出力の方向を設定(LPC_GPIO0->DIR に代入する)しても GPIO の機能にはなりません。
  • また、ピン1は PIO0_8 が一番左側にあるので、このピンのデフォルトの設定は GPIO であることもわかります。

この GPIO や R、AD変換 などといった機能を設定するレジスタがあります。


以下は、ピン23以外(理由は後述)の全てのピンでLチカができるプログラムです。

#include "mbed.h"
int main(){
    LPC_IOCON->SWCLK_PIO0_10 = 0xd1;
    LPC_IOCON->R_PIO0_11 = 0xd1;
    LPC_IOCON->R_PIO1_0 = 0xd1;
    LPC_IOCON->R_PIO1_1 = 0xd1;
    LPC_IOCON->R_PIO1_2 = 0xd1;
    LPC_IOCON->SWDIO_PIO1_3 = 0xd1;
    //LPC_IOCON->RESET_PIO0_0 = 0xd1;
    
    LPC_GPIO0->DIR = 0xFFFF;
    LPC_GPIO1->DIR = 0xFFFF;
    while(1){
        LPC_GPIO0->DATA = 0xFFFF;
        LPC_GPIO1->DATA = 0xFFFF;
        wait(0.5);
        LPC_GPIO0->DATA = 0x0000;
        LPC_GPIO1->DATA = 0x0000;
        wait(0.5);
    }
}

問題のピンは、以下の行で GPIO モードに設定しています。設定値の 0xd1 はたまたま全てのピンで共通の値でした。

    LPC_IOCON->SWCLK_PIO0_10 = 0xd1;
    LPC_IOCON->R_PIO0_11 = 0xd1;
    LPC_IOCON->R_PIO1_0 = 0xd1;
    LPC_IOCON->R_PIO1_1 = 0xd1;
    LPC_IOCON->R_PIO1_2 = 0xd1;
    LPC_IOCON->SWDIO_PIO1_3 = 0xd1;
    //LPC_IOCON->RESET_PIO0_0 = 0xd1;

設定の値はこちらのユーザーマニュアル(https://www.nxp.com/documents/user_manual/UM10398.pdf)で見ることができます(「SWCLK_PIO0_10」等でページ内検索を掛けると該当の部分が出てきます)。


ピン23(P0_0) の設定はコメントアウトしてあります。筆者はISPモードで bin を書き込む LPCISP というソフト(mbed LPC1114でLチカしてみた(2) - しなぷすのハード製作記)を使っています。このソフトは自動でリセットを掛けてISPモードに突入して書き込みを行ってくれます。そのため、ピン23を GPIO モードに設定するとマイコンの電源が入った直後にこのピンが GPIO として働いてしまい、自動リセットは掛かりません。

どうしてもピン23を GPIO として使いたい、ピン23を GPIO に設定してしまってプログラムを新しく書き込めない…といった状況なら、手動でリセットを掛けて書き込みをする方法で状況を解決します。

www.nxp-lpc.comこちらのサイトの「ISP」の欄の要約になりますが、

  1. 電源を落とす
  2. ピン23(RESET)、ピン24(ISPエントリーピン) を Low にして電源を入れる
  3. ピン23を High にする

という手順のあと、LPCISPを使って書き込みをします。電源を落とさなければならないので、面倒な手順を踏むことになります。