NXP MCUXpressoを使ってみる

# NXP純正IDEであるMCUXpresso
MCUXpressoの触りだけでも知りたかったので、少々トライした記録である。

## 環境
秋月電子で購入可能なLPC11U35が搭載された[ボード](https://akizukidenshi.com/catalog/g/gK-12144/)を利用。安価だったためこれを選択。Windows10上でMCUXpressoを使う。

## MCUXpressoダウンロード
[ここ](https://www.nxp.com/design/software/development-software/mcuxpresso-software-and-tools-/mcuxpresso-integrated-development-environment-ide:MCUXpresso-IDE?tab=Design_Tools_Tab)からダウンロードできる。NXPのアカウントが必要だった（はず）。

## 準備
SDKなどを使うのが通常のようだが、LPC11U35については、MCUXpressoで使えるのか不明であった。その代わりに、[ここ](https://www.embeddedartists.com/products/lpc11u35-quickstart/)のResourcesにあった[サンプルソースコード](https://www.embeddedartists.com/wp-content/uploads/2018/07/qsb_lpc11u35_120509.zip)をインポートする方法をとった。
![OpenProjectFileSystem.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/a7c47d72-d050-d0a7-077c-45f0c6a01046.png)
「Open Projects from File System」を選び、
![SelectedFromArchive-Finish.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/d92d0ded-e3a7-7c3b-83cb-e31499e95570.png)
「Archive」をクリックし、さきほどDownloadしたサンプルコードのzipファイルを選ぶ。サンプルコードとなる”s_demo”（メインプログラム）とLibrary２つを選択し「Finish」をクリック。インポート後は下記のようになる。
![AfterImported.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/8a82e475-f7d9-d9b4-0d17-3fe170eb6492.png)

## テスト環境
本ボードに接続されたボタンを押したら、ボード内のLEDが点灯することを実現する。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/30f2054f-3e7b-aba9-63c2-ca1a659a9e49.jpeg", width=50%>
ボタンはGPIO0_22に接続されている（LEDはGPIO0_7に接続）。ピン配置については、秋月電子の本ボードのリンク先（[説明書](https://akizukidenshi.com/download/ds/akizuki/AE-LPC11U35-MB/AE-LPC11U35-MB.pdf)、[データーシート](https://akizukidenshi.com/download/ds/embdd/LPC11U3X.pdf)）も参照。

### コード作成準備
さきほどのs_demoをコピーして作るのが簡単。下記メニューのCopy&Paste。
![PrjCopyPaste.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/2e2c41a0-5ed5-6a92-cd37-cbf03417f42e.png)
ここでは、Paste時に「btn_led」というプロジェクト名をつけた。
![RenamePrj.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/e4a1037f-ea93-f88c-932d-1767591dbdbf.png)
![BtnLEDProj.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/534e440c-48df-e340-566a-9456679dd711.png)
ライブラリとして、先ほどのインポート時のライブラリが含まれていることを確認。
![必要なライブラリ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/b6bfefe4-3dc4-8cf2-f5d0-77b041c997f7.png)

### コード
main.cを下記のように修正。

```c:main.c
#ifdef __USE_CMSIS
#include "LPC11Uxx.h"
#endif

#include <cr_section_macros.h>
#include <NXP/crp.h>

#include "gpio.h"

// p0.7 is connected to LED3 on LPC11U35 QSB Board
#define LED_PORT 0  // Port for led
#define LED_BIT  7  // Bit on port for led
#define LED_ON   1  // Level to set port to turn on led
#define LED_OFF  0  // Level to set port to turn off led

// Variable to store CRP value in. Will be placed automatically
// by the linker when "Enable Code Read Protect" selected.
// See crp.h header for more information
__CRP const unsigned int CRP_WORD = CRP_NO_CRP ;

int main(void) {

  // Initialize GPIO
  GPIOInit();

  // Set LED pin as output
  GPIOSetDir(LED_PORT, LED_BIT, 1 );
  // Set 20 pin of port 0 as input
  GPIOSetDir(0, 20, 0);

  GPIOSetBitValue( LED_PORT, LED_BIT, LED_OFF );
  while (1) {
	  if (!GPIOGetPinValue(0, 20)) {
		  GPIOSetBitValue( LED_PORT, LED_BIT, LED_ON );
	  } else {
		  GPIOSetBitValue( LED_PORT, LED_BIT, LED_OFF );
	  }
  }
}

```

GPIO制御関数は、サンプルコード及びライブラリ内にあったgpio.c/hを参照した。なお、変数「CRP_WORD」は必要のようだ（削除するとBuildできない）。

### ビルド
「Build Project」をクリック。
![Build.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/1aa92de4-bb59-3057-3db3-e226b297e263.png)

### バイナリ作成
本ボードをMass Storageとして認識させ、プログラムを転送するには、bin形式が必要。「Create binary」をクリック。
![Binary.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/463825e3-d024-a623-9ae1-c4b300bd2c84.png)
さらに、チェックサムを付加する必要があるらしい。コマンドプロンプトから付加する。
![Prompt.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/07cb5981-2544-df5c-e6e9-a242f449037e.png)

```
F:\Workspace\NXP\proj\btn_led\Debug>checksum -p lpc11u35 -d btn_led.bin
Written checksum 0xefffed0d at offset 0x1c in file btn_led.bin
Previous value 0xefffed0d at offset 0x1c in file btn_led.bin
```

### ボードへコピー
[ここ](https://akizukidenshi.com/download/ds/akizuki/AE-LPC11U35-MB/AE-LPC11U35-MB.pdf)の説明にあるとおり、ボードのSW1とSW2とを押し、SW1を押したままSW2を話すと、ボードがUSB Mass Storageとして認識される。
![Firmware.bin削除.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/81cb5b43-f10a-0109-deea-b99f1aaa5047.png)
「firmware.bin」を削除し、さきほどの「btn_led.bin」をコピーする。

## 実験
コピー後、リセットする（SW2を押す、USBケーブルの挿し直し）と、プログラムが動作する。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/54dde693-4dfe-5886-4a96-281e31b50cef.jpeg", width=60%>
成功。