STM32L4 動かしてみる

STM32L4を調べて動かすテスト。

# 経緯
Nucleo で動作確認したものが、基板を起こしたらうまく動かないというのでデバッグ依頼を受けました。

NUCLEO-L432KC 
https://www.st.com/ja/evaluation-tools/nucleo-l432kc.html
を基に作ったもののようです。

CPUはSTM32L432KCU6
![image](https://qiita-image-store.s3.amazonaws.com/0/139524/467c3540-2fe5-b903-8f61-23689b5d59dc.png)

で、STM32Lと呼ばれているもの。
STM32L は STM32 の超低消費電力バージョン。
当初は、STM32 と同じように使えるかなとおもったが、微妙に違うらしいので環境設定など改めて調べてみた。



# Arduino 開発環境を整える

http://dubstylee.net/v/stm32duino_core/
を参考に、
stm32duino/Arduino_Core_STM32
https://github.com/stm32duino/Arduino_Core_STM32
をインストールします。

これは、
「Arduino for STM32」
http://www.stm32duino.com/
のプロジェクトのレポジトリのように見えますが、STM社が管理維持している別のプロジェクトです。

「Arduino for STM32」
の方は
https://github.com/rogerclarkmelbourne/Arduino_STM32
のレポジトリで、過去記事
「STM32F103C8 で遊ぶ」
https://qiita.com/nanbuwks/items/ba37f049f45378da0e2b
などではこちらを使ってきましたが、STM32L系の対応は
https://github.com/stm32duino/Arduino_Core_STM32
の方が良さそうなので今回はこちらを試してみました。

## 環境
- Arduino1.8.5
- Ubuntu 16.04 (AMD64)
- ポータブル環境化したIDEで試していますが、通常の場合でもあまり違わないはず。
- 書込装置として、STM32マイコンの開発で慣れているST-Linkを使います。

## Arduino開発環境の設定


Arduino開発環境は既にインストール終わっているとします。

「ファイル」- 「環境設定」 - 「追加のボードマネージャのURL:」に
https://github.com/stm32duino/BoardManagerFiles/raw/master/STM32/package_stm_index.json
と入力してOK

「ツール」 - 「ボード：・・・」の一番上の「ボードマネージャ...」
から
「STM32 Cores by STMicroelectronics」を選択して「インストール」

# 環境依存の設定
特に何も設定しなくても動作しました。

書込プログラムの設定など、何か必要かもしれませんが、「Arduino for STM32」の設定済みの環境で追加設定したので、クリーンな環境から設定した場合にも必要ないかどうかは不明です。すみません。



# ターゲットボードなどの選択



「ツール」 - 「ボード：」を
「Nucleo-32」 にする。

「ツール」 - 「書込装置:」を
「ST-Link」 にする。

「ツール」 - 「Board part number:」を
「Nucleo L432KC」 にする。


# Lチカやってみる


## 配線

まずは、手配線で最小限の配線を行って、マイコンを動してみます。

![IMG_20180627_221503 (1).jpg](https://qiita-image-store.s3.amazonaws.com/0/139524/27fd29d4-1f0a-7cf5-6116-c601bcf10f33.jpeg)

## スケッチ

```

void setup() {
  pinMode(9, OUTPUT);
}

void loop() {
  digitalWrite(9, HIGH);
  delay(1000);
  digitalWrite(9, LOW);
  delay(1000);
}

```

で確認できた。

# トラブルシューティング

まずは、書き込み時の詳細情報を表示するに設定しておきます。
以下は書き込み時のメッセージです。

## 正常に書けていた場合

```

2018-06-27T22:02:56 INFO /local/data/work/stm32/repo/stlink/src/usb.c: -- exit_dfu_mode
2018-06-27T22:02:56 INFO /local/data/work/stm32/repo/stlink/src/common.c: Loading device parameters....
2018-06-27T22:02:56 INFO /local/data/work/stm32/repo/stlink/src/common.c: Device connected is: L43x device, id 0x10016435
2018-06-27T22:02:56 INFO /local/data/work/stm32/repo/stlink/src/common.c: SRAM size: 0xc000 bytes (48 KiB), Flash: 0x40000 bytes (256 KiB) in pages of 2048 bytes
2018-06-27T22:02:56 INFO /local/data/work/stm32/repo/stlink/src/common.c: Attempting to write 11152 (0x2b90) bytes to stm32 address: 134217728 (0x8000000)
st-flash 1.3.0
Flash page at addr: 0x08001800 erasedEraseFlash - Page:0x4 Size:0x800 EraseFlash - Page:0x5 Size:0x800 2018-06-27T22:02:56 INFO /local/data/work/stm32/repo/stlink/src/common.c: Finished erasing 6 pages of 2048 (0x800) bytes
2018-06-27T22:02:56 INFO /local/data/work/stm32/repo/stlink/src/common.c: Starting Flash write for F2/F4/L4
2018-06-27T22:02:56 INFO /local/data/work/stm32/repo/stlink/src/flash_loader.c: Successfully loaded flash loader in sram
Flash page at addr: 0x08002800 erased2018-06-27T22:02:56 INFO /local/data/work/stm32/repo/stlink/src/common.c: Starting verification of write complete
2018-06-27T22:02:56 INFO /local/data/work/stm32/repo/stlink/src/common.c: Flash written and verified! jolly good!

size: 11152



```




## 書き込みできない


```

st-flash 1.3.0
EraseFlash - Page:0x0 Size:0x800 EraseFlash - Page:0x1 Size:0x800 EraseFlash - Page:0x2 Size:0x800 EraseFlash - Page:0x3 Size:0x800 EraseFlash - Page:0x4 Size:0x800 EraseFlash - Page:0x5 Size:0x800 2018-06-27T21:38:31 INFO /local/data/work/stm32/repo/stlink/src/common.c: Finished erasing 6 pages of 2048 (0x800) bytes
2018-06-27T21:38:31 INFO /local/data/work/stm32/repo/stlink/src/common.c: Starting Flash write for F2/F4/L4
2018-06-27T21:38:31 INFO /local/data/work/stm32/repo/stlink/src/flash_loader.c: Successfully loaded flash loader in sram

Flash page at addr: 0x08000000 erased
Flash page at addr: 0x08000800 erased
Flash page at addr: 0x08001000 erased
Flash page at addr: 0x08001800 erased
Flash page at addr: 0x08002000 erased
Flash page at addr: 0x08002800 erased
size: 11152
stlink_fwrite_flash() == -1
2018-06-27T21:38:38 ERROR /local/data/work/stm32/repo/stlink/src/flash_loader.c: flash loader run error
2018-06-27T21:38:38 ERROR /local/data/work/stm32/repo/stlink/src/common.c: stlink_flash_loader_run(0x8000000) failed! == -1

```

このような場合 ST-LINK のファームが旧いそうで、ファームを最新版にアップすれば解消しました。

## マイコン配線不良

```


2018-06-27T21:51:23 INFO /local/data/work/stm32/repo/stlink/src/usb.c: -- exit_dfu_mode
st-flash 1.3.0
2018-06-27T21:51:23 INFO /local/data/work/stm32/repo/stlink/src/common.c: Loading device parameters....
2018-06-27T21:51:23 WARN /local/data/work/stm32/repo/stlink/src/common.c: unknown chip id! 0


```

原因：マイコン配線の、GND が切れてました




# mbedで使ってみる。

mbed で、NUCLEO-L432KC として開発して、コンパイルすると bin ファイルが落ちてくる
![image](https://qiita-image-store.s3.amazonaws.com/0/139524/a4089c03-73a6-bce0-ac03-adfb9254889d.png)

Arduinoプログラムを書き込むときに呼び出されているプログラムを使って、同じようにパラメータを指定すると書けました。

書き込みのときの情報表示を見て、同じように指定します。

プログラムは

（ArduinoIDEのパス）/packages/STM32/tools/STM32Tools/1.1.0/tools/linux/stlink_upload 
を使っていたので、そのディレクトリに移り、

./stlink_upload ttyUSB0 {upload.altID} {upload.usbID} ~/Downloads/Nucreo_blink_led_PA9.bin 

としたら書けました。なお、ここで使ったファイル名 Nucreo_blink_led_PA9 は、Nucleoのミススペルです。ああ、はずかしい。

ちなみに、複数回コンパイルすると

Nucreo_blink_led_PA9.bin
Nucreo_blink_led_PA9 (1).bin
Nucreo_blink_led_PA9 (2).bin

と増えていきますが、カッコ付きのファイル名は受け付けてくれなかったので毎回ダウンロード済みの Nucreo_blink_led_PA9.bin してからコンパイルするようにしています。