廉価版STM32F407VGT6にmicroPythonを移植

#はじめに
　最近、廉価版のSTM32F407VGT6というボードを入手しました。CPU:ARM® 32-bit Cortex®-M4、1 Mbyte of Flash memory、192+4 Kbytes of SRAM というなかなかのものです。
まずは、使ってみようとおもい、STM32CubeIDE でLチカをやってみました。
マイクロ USB ポートはついているのですが、DFU 以外では認識されないようです。
　あるWEBサイトに、1.5KΩでプルアップすれば認識されるとい書き込みがあったので試してみましたが、Windows10では、不明なデバイスになってしまいます。
　そこで、ST-Link もどき（Amazonで売っていた緑色のプラスティックのやつ）と ST-Link Utility にて無事書き込み、Lチカすることができました。
ちなみに、LEDは、アノードが 3.3V、カソードが PE0 につながっているので、PE0 を Low にすることで、点灯します。 
　そうこうしているうちに、MicroPython を動かしてみようと思い立ち、いろいろ試した結果、取り合えず、L チカまでは、できたので、報告します。（マイクロ USB も使えるようになりました）

#具体的に
　基本的には、他のSTM32系のMicroPython と同様の手順でビルドしてボードに書き込むだけです。
　
##環境
OS:Windows10 および UBUNTU 18.04 LTS（Windows Subsystem for Linux） 
Tool：Cコンパイラ（sudo apt-get install build-essential でインストール）
その他パッケージ（libffi-dev、gcc-arm-none-eabiなど）
　　　　なお、STM32-ST-LINK Utility は、Windows版を使用したのでUBUNTUには入れていません。
		  
具体的な、開発環境の構築については、他に丁寧に記述されているページがあるので「STM32 MicroPython」で検索して参照してください。

##board 定義ファイル
　MicroPythonをビルドするときに、STM32F407VGT6に記述したファイルが必要になります。
　これは、下記フォルダにある、STM32F4DISCOVERY用の定義情報を少しだけ書き換えて使用します。
　
		boards/STM32F4DISC

　CPU は同じものが載っていますが、DISCOVERYにはオーディオやセンサー等が載っていますが、廉価版にはLED とスイッチしか載っていません。
　まずは、動かすことを目的とし、各種デバイスには目をつむり、LED と スイッチのみを廉価版に合わせました。

　フォルダすべてをコピーして、F407VGT6 という名前にします。そして、mpconfigboard.h を書き換えます。
　リストの〇数字 の10か所です。

```
#define MICROPY_HW_BOARD_NAME       "STM32F407VGT6"        // ①
#define MICROPY_HW_MCU_NAME         "STM32F407"

#define MICROPY_HW_HAS_SWITCH       (1)
#define MICROPY_HW_HAS_FLASH        (1)
#define MICROPY_HW_ENABLE_RNG       (1)
#define MICROPY_HW_ENABLE_RTC       (1)
#define MICROPY_HW_ENABLE_DAC       (1)
#define MICROPY_HW_ENABLE_USB       (1)

// HSE is 8MHz
#define MICROPY_HW_CLK_PLLM (8)
#define MICROPY_HW_CLK_PLLN (336)
#define MICROPY_HW_CLK_PLLP (RCC_PLLP_DIV2)
#define MICROPY_HW_CLK_PLLQ (7)

// UART config
#if 0
// A9 is used for USB VBUS detect, and A10 is used for USB_FS_ID.
// UART1 is also on PB6/7 but PB6 is tied to the Audio SCL line.
// Without board modifications, this makes UART1 unusable on this board.
#define MICROPY_HW_UART1_TX     (pin_A9)
#define MICROPY_HW_UART1_RX     (pin_A10)
#endif
#define MICROPY_HW_UART2_TX     (pin_A2)
#define MICROPY_HW_UART2_RX     (pin_A3)
#define MICROPY_HW_UART2_RTS    (pin_A1)
#define MICROPY_HW_UART2_CTS    (pin_A0)
#define MICROPY_HW_UART3_TX     (pin_D8)
#define MICROPY_HW_UART3_RX     (pin_D9)
#define MICROPY_HW_UART3_RTS    (pin_D12)
#define MICROPY_HW_UART3_CTS    (pin_D11)
#if MICROPY_HW_HAS_SWITCH == 0
// NOTE: A0 also connects to the user switch. To use UART4 you should 
//       set MICROPY_HW_HAS_SWITCH to 0, and also remove SB20 (on the back
//       of the board near the USER switch).
#define MICROPY_HW_UART4_TX     (pin_A0)
#define MICROPY_HW_UART4_RX     (pin_A1)
#endif
// NOTE: PC7 is connected to MCLK on the Audio chip. This is an input signal
//       so I think as long as you're not using the audio chip then it should
//       be fine to use as a UART pin.
#define MICROPY_HW_UART6_TX     (pin_C6)
#define MICROPY_HW_UART6_RX     (pin_C7)

// I2C busses
#define MICROPY_HW_I2C1_SCL (pin_B6)
#define MICROPY_HW_I2C1_SDA (pin_B7)
#define MICROPY_HW_I2C2_SCL (pin_B10)
#define MICROPY_HW_I2C2_SDA (pin_B11)

// SPI busses
#define MICROPY_HW_SPI1_NSS  (pin_A4)
#define MICROPY_HW_SPI1_SCK  (pin_A5)
#define MICROPY_HW_SPI1_MISO (pin_A6)
#define MICROPY_HW_SPI1_MOSI (pin_A7)
#define MICROPY_HW_SPI2_NSS  (pin_B12)
#define MICROPY_HW_SPI2_SCK  (pin_B13)
#define MICROPY_HW_SPI2_MISO (pin_B14)
#define MICROPY_HW_SPI2_MOSI (pin_B15)

// CAN busses
#define MICROPY_HW_CAN1_TX (pin_B9)
#define MICROPY_HW_CAN1_RX (pin_B8)
#define MICROPY_HW_CAN2_TX (pin_B13)
#define MICROPY_HW_CAN2_RX (pin_B12)

// USRSW is pulled low. Pressing the button makes the input go high.
#define MICROPY_HW_USRSW_PIN        (pin_D15)                                  // ②
#define MICROPY_HW_USRSW_PULL       (GPIO_PULLUP)                              // ③
#define MICROPY_HW_USRSW_EXTI_MODE  (GPIO_MODE_IT_RISING)
#define MICROPY_HW_USRSW_PRESSED    (GPIO_PIN_RESET)                           // ④

// LEDs
#define MICROPY_HW_LED1             (pin_E0)  // red                           // ⑤
//#define MICROPY_HW_LED2             (pin_D12) // green                       // ⑥
//#define MICROPY_HW_LED3             (pin_D13) // orange                      // ⑦
//#define MICROPY_HW_LED4             (pin_D15) // blue                        // ⑧
#define MICROPY_HW_LED_ON(pin)      (mp_hal_pin_low(pin))                      // ⑨
#define MICROPY_HW_LED_OFF(pin)     (mp_hal_pin_high(pin))                     // ⑩

// USB config
#define MICROPY_HW_USB_FS              (1)
#define MICROPY_HW_USB_VBUS_DETECT_PIN (pin_A9)
#define MICROPY_HW_USB_OTG_ID_PIN      (pin_A10)
```

##ビルドと書き込み

　stm32 フォルダにて、下記コマンドを実行します。

```
	make BOARD=F407VGT6
```

　するとたくさんのメッセージが流れた後、build-F407VGT6 というフォルダが作成されます。その中に firmware.hex というファイルがありますので、これを ST-Link Utility でボードに書き込みます。
　

#まとめ

　まだ、使い込んではいませんが、マイクロ USB を接続すると、USB ドライブとして参照することができ、中に 下記ファイルがあります。
　※ USB を使えるようにするために、A12ピンを手持ちの 2.2KΩでプルアップしています。（写真）

	boot.py
	main.py
	pybcdc.inf
	README.txt

![stm32f407vgt6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245347/b6f7bd60-1216-0764-b3e5-622f26d7b09f.png)


　スイッチとLEDの動作を確認するために、下記 プログラムを main.py に書き込んで、再起動すると無事に動き、スイッチを押すとLEDが点灯し、離すと消灯しました。

```
import pyb, time

pressed = False
while(True):
    if pyb.Switch().value():
        if not pressed:
            pyb.LED(1).on()
            pressed = True
    else:
        if pressed:
            pyb.LED(1).off()
            pressed = False
```

　なお、ここに記述した内容は、あくまで個人の体験談であり、他の環境での動作を保証するものではありません。