Nucleo L452RE-P 用に MicroPython をビルドする

非常にためになる記事がありまして，大いに参考にさせていただきました。ほとんどなぞっただけです。

- https://qiita.com/grinpeaceman/items/0425ae4c1e3d891e99ca
- https://blog.boochow.com/article/mp-stm-nucleo-l432kc.html

# Nucleo L452RE-P について

Pのない **Nucleo L452RE** と対してかわらないだろう，と思っていたのですが，
いざArduino風のコネクターにI2Cデバイスを接続すると，動きません。

```
    L452RE          L452RE-P
     CN5             CN7
D15  PB8  I2C1_SCL   PB8  I2C1_SCL
D14  PB9  I2C1_SDA   PB7  I2C1_SDA
    AVDD            AVDD
     GND             GND
D13  PA5  SPI1_SCK  PB13  SPI2_SCK
D12  PA6  SPI1_MISO PB14  SPI2_MISO
D11  PA7  SPI1_MOSI PB15  SPI2_MOSI
D10  PB6  SPI1_CS   PA11  SPIx_NSS
 D9  PC7             PA8
 D8  PA9             PB6

     CN9             CN9

 D7  PA8             PC7
 D6 PB10            PB10
 D5  PB4            PA15
 D4  PB5             PB5
 D3  PB3             PB3
 D2 PA10            PA12
 D1  PA2             PA2
 D0  PA3             PA3
```

SDAが PB9 と PB7 で違いました... MicroPythonではソフトI2Cも使えますので，ピンの指定で動いたのですが，せっかくなので **Nucleo L452RE-P** 用のファームを作ってみました。

# 用意した定義ファイル

```shell-session
$ ls NUCLEO_L452RE_P/
board.json            mpconfigboard.mk      stm32l4xx_hal_conf.h
mpconfigboard.h       pins.csv
$ 
```

Pなし **Nucleo L452RE** の定義ファイルをコピーしてきて，適当なフォルダーに置いて編集します。

```c:mpconfigboard.h（抜粋）
#define MICROPY_HW_BOARD_NAME       "NUCLEO-L452RE-P" // <<-- ここ
#define MICROPY_HW_MCU_NAME         "STM32L452RE"

// （中略）

// I2C buses
#define MICROPY_HW_I2C1_SCL     (pin_B8)    // Arduino D15, pin 3 on CN10
#define MICROPY_HW_I2C1_SDA     (pin_B7)    // Arduino D14, pin 5 on CN10 <<-- ここ

//（中略）

// NUCLEO-64 has one user LED
#define MICROPY_HW_LED1             (pin_B13) // green  <<-- ここ
#define MICROPY_HW_LED_ON(pin)      (mp_hal_pin_high(pin))
#define MICROPY_HW_LED_OFF(pin)     (mp_hal_pin_low(pin))

```

目的の I2C1_SDA を PB7 に変更します。
ついでにLEDのアサインを PB13 に変更します。
SPIはそのままSPI2とすればArduinoコネクターで使えそうでしたので，そのままにしました。

```pins.csv（抜粋）
D2,PA12
D1,PA2
D0,PA3
A0,PA0
A1,PA1
A2,PC3
A3,PC2
A4,PC1
A5,PC0
SCL,PB8
SDA,PB7
SCK,PB13
MISO,PB14
MOSI,PB15

（中略）

SWCLK,PA14
BUTTON,PC13
LED,PB13
PA0,PA0
PA1,PA1
PA2,PA2
PA3,PA3

...
```

他の定義ファイルをみると割と自由に名前をつけているようなので，
私はArduinoコネクターに書かれている記号，普通のSTM32のピン番号両方書いてみました。

Pのありなしで微妙にピンアサインが異なるのですが，定義ファイルでは放置しました。問題があったらまた考えることにします。

|  | STM32L452RET6 | STM32L452RET6P |
| -- | -- | -- |
| DS11912 66ページ | 25pin PC5<br>26pin PB0 | N/A PC5<br>25pin PB0 |
| DS11912 67ページ | 27pin PB1<br>28pin PB2 | 26pin PB1<br>27pin PB2 |
| DS11912 68ページ | 29pin PB10<br>30pin PB11<br>N/A VDD12 | 28pin PB10<br>29pin PB11<br>30pin VDD12 |
| DS11912 72ページ | 54pin PD2 | N/A PD2 |
| DS11912 73ページ | 55pin PB3<br>56pin PB4<br>57pin PB5 | 54pin PB3<br>55pin PB4<br>56pin PB5 |
| DS11912 74ページ | 58pin PB6<br>59pin PB7<br>60pin PH3<br>61pin PB8<br>62pin PB9<br>N/A VDD12 | 57pin PB6<br>58pin PB7<br>59pin PH3<br>60pin PB8<br>61pin PB9<br>62pin VDD12 |


# ビルドする

ほぼ並べただけですが簡単な`Makefile`を書いてみました。armのコンパイラーは，Platformioがインストールしたものを拝借しました。

```Makefile
CROSS_COMPILE=~/.platformio/packages/toolchain-gccarmnoneeabi@1.70201.0/bin/arm-none-eabi-
BOARD=NUCLEO_L452RE_P

all:
	git clone https://github.com/micropython/micropython.git
	cd micropython/; git submodule update --init
	cd micropython/mpy-cross/; make -j4
	cp -r ${BOARD} micropython/ports/stm32/boards/
	cd micropython/ports/stm32/; make BOARD=${BOARD} CROSS_COMPILE=${CROSS_COMPILE} -j

upload:
	cp micropython/ports/stm32/build-${BOARD}/firmware.bin /Volumes/NODE_L452RE/

clean:
	rm -rf micropython
```

できました！

```py:REPL
MicroPython v1.20.0-489-ga3862e726 on 2023-09-20; NUCLEO-L452RE-P with STM32L452RE
Type "help()" for more information.
>>> 
```

以下はすべてNucleoのLEDが点灯します。

```py:REPL
>>> import machine
>>> machine.Pin('LED', machine.Pin.OUT_PP).value(1)
>>> machine.Pin('D13', machine.Pin.OUT_PP).value(1)
>>> machine.Pin('PB13', machine.Pin.OUT_PP).value(1)
```

pyboard用のライブラリーが使えますね。Nucleoのボタンを読んでみます。

```py:REPL
>>> from pyb import Switch
>>> s=Switch()
>>> s.value()
True
>>> s.value()
False
```

# おまけ

WeActのSTM32F411ボードがありまして，
そのボードの最新のMicroPythonファームがほしいなと思っていました。

- https://github.com/WeActStudio/WeAct_F411CE-MicroPython

本当に書かれている手順通りであっさりファームができたので，L452RE-P でもその手順を踏襲しました。