非常にためになる記事がありまして,大いに参考にさせていただきました。ほとんどなぞっただけです。
- 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 用のファームを作ってみました。
用意した定義ファイル
$ ls NUCLEO_L452RE_P/
board.json mpconfigboard.mk stm32l4xx_hal_conf.h
mpconfigboard.h pins.csv
$
Pなし Nucleo L452RE の定義ファイルをコピーしてきて,適当なフォルダーに置いて編集します。
#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コネクターで使えそうでしたので,そのままにしました。
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 26pin PB0 |
N/A PC5 25pin PB0 |
DS11912 67ページ | 27pin PB1 28pin PB2 |
26pin PB1 27pin PB2 |
DS11912 68ページ | 29pin PB10 30pin PB11 N/A VDD12 |
28pin PB10 29pin PB11 30pin VDD12 |
DS11912 72ページ | 54pin PD2 | N/A PD2 |
DS11912 73ページ | 55pin PB3 56pin PB4 57pin PB5 |
54pin PB3 55pin PB4 56pin PB5 |
DS11912 74ページ | 58pin PB6 59pin PB7 60pin PH3 61pin PB8 62pin PB9 N/A VDD12 |
57pin PB6 58pin PB7 59pin PH3 60pin PB8 61pin PB9 62pin VDD12 |
ビルドする
ほぼ並べただけですが簡単なMakefile
を書いてみました。armのコンパイラーは,Platformioがインストールしたものを拝借しました。
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
できました!
MicroPython v1.20.0-489-ga3862e726 on 2023-09-20; NUCLEO-L452RE-P with STM32L452RE
Type "help()" for more information.
>>>
以下はすべてNucleoのLEDが点灯します。
>>> 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のボタンを読んでみます。
>>> from pyb import Switch
>>> s=Switch()
>>> s.value()
True
>>> s.value()
False
おまけ
WeActのSTM32F411ボードがありまして,
そのボードの最新のMicroPythonファームがほしいなと思っていました。
本当に書かれている手順通りであっさりファームができたので,L452RE-P でもその手順を踏襲しました。