STM32Duino を改造して掃除機をArduinoでプログラムできるようにする

STM32が入った掃除機。アレコレしてたらプログラムが書き込めるようになった。
https://qiita.com/nanbuwks/items/f557baebc3406e9a6edb


掃除機は CPU として STM32F103VBT6 を搭載しているのですが、ボード設定を「Generic STM32F103V seriies」とするとクロックの設定で動かない。

「 Nucreo F103 @ 64MHz」だと動く。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/27aeb461-1a70-7705-fdb0-80554420876a.png)

理由は、掃除機は外部クロックを搭載しておらず、内蔵クロックで動いているから外部クロックの設定になっているものだとプログラムは書き込めるけれども動作はしない。


「 Nucreo F103 @ 64MHz」だとデフォルトがHSIの設定になっているので動作する。

けれどもポートマッピングがへんてこだったりシリアルを使おうとするとSerial2でアクセスしないといけなったりするので噴く。

またポートもPC15までしか定義されていないのでPDとかPEとかにマッピングされているセンサなどを使おうとしてもできない。

なので掃除機用のプロファイルを作って便利に使えるようにしよう。

あらかじめ、Arduinoディレクトリに移動しておく。

そこから、作業ディレクトリに移る。

```

$ cd hardware/Arduino_STM32-master/STM32F1/
```

ここを作業ディレクトリとする。

まず、構成が比較的近いSTM32F103Tをコピーして掃除機用のハードウェア設定をつくる

```

$ cp -a variants/generic_stm32f103t variants/generic_stm32f103vb_hsi
```

次に、設定をメニューに反映する。

```

$ vim board.txt 
```


以下の内容を適当なところに書き加える。

```

###################### Generic STM32F103T (HSI) for cleaner ########################################

genericSTM32F103VB_HSI.name=Cleaner (Feng Rui / STM32F103VB / HSI / STLink)
genericSTM32F103VB_HSI.vid.0=0x1EAF
genericSTM32F103VB_HSI.pid.0=0x0004
genericSTM32F103VB_HSI.build.variant=generic_stm32f103vb_hsi
genericSTM32F103VB_HSI.build.vect=VECT_TAB_ADDR=0x8000000
genericSTM32F103VB_HSI.build.core=maple
genericSTM32F103VB_HSI.build.board=GENERIC_STM32F103T
genericSTM32F103VB_HSI.upload.use_1200bps_touch=false
genericSTM32F103VB_HSI.upload.file_type=bin
genericSTM32F103VB_HSI.upload.auto_reset=true
genericSTM32F103VB_HSI.upload.tool=maple_upload
genericSTM32F103VB_HSI.upload.protocol=maple_dfu

## STM32F103V8 -------------------------
genericSTM32F103VB_HSI.menu.device_variant.STM32F103T8=STM32F103T8 (20k RAM. 64k Flash)
genericSTM32F103VB_HSI.menu.device_variant.STM32F103T8.build.cpu_flags=-DMCU_STM32F103T8
genericSTM32F103VB_HSI.menu.device_variant.STM32F103T8.build.ldscript=ld/jtag_t8.ld
genericSTM32F103VB_HSI.menu.device_variant.STM32F103T8.upload.maximum_size=65536
genericSTM32F103VB_HSI.menu.device_variant.STM32F103T8.upload.maximum_data_size=20480

## STM32F103VB -------------------------
genericSTM32F103VB_HSI.menu.device_variant.STM32F103TB=STM32F103TB (20k RAM. 128k Flash)
genericSTM32F103VB_HSI.menu.device_variant.STM32F103TB.build.cpu_flags=-DMCU_STM32F103TB
genericSTM32F103VB_HSI.menu.device_variant.STM32F103TB.build.ldscript=ld/jtag.ld
genericSTM32F103VB_HSI.menu.device_variant.STM32F103TB.upload.maximum_size=131072
genericSTM32F103VB_HSI.menu.device_variant.STM32F103TB.upload.maximum_data_size=20480

#---------------------------- UPLOAD METHODS ---------------------------

genericSTM32F103VB_HSI.menu.upload_method.STLinkMethod=STLink
genericSTM32F103VB_HSI.menu.upload_method.STLinkMethod.upload.protocol=STLink
genericSTM32F103VB_HSI.menu.upload_method.STLinkMethod.upload.tool=stlink_upload
genericSTM32F103VB_HSI.menu.upload_method.STLinkMethod.build.upload_flags=-DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG=1 -DSERIAL_USB -DGENERIC_BOOTLOADER

#-- CPU Clock frequency

genericSTM32F103VB_HSI.menu.cpu_speed.speed_64mhz_HSI=64Mhz (HSI)
genericSTM32F103VB_HSI.menu.cpu_speed.speed_64mhz_HSI.build.f_cpu=64000000L

#-- Optimizations
genericSTM32F103VB_HSI.menu.opt.osstd=Smallest (default)
genericSTM32F103VB_HSI.menu.opt.osstd.build.flags.optimize=-Os
genericSTM32F103VB_HSI.menu.opt.osstd.build.flags.ldspecs=
genericSTM32F103VB_HSI.menu.opt.oslto=Smallest Code with LTO
genericSTM32F103VB_HSI.menu.opt.oslto.build.flags.optimize=-Os -flto
genericSTM32F103VB_HSI.menu.opt.oslto.build.flags.ldspecs=-flto
genericSTM32F103VB_HSI.menu.opt.o1std=Fast (-O1)
genericSTM32F103VB_HSI.menu.opt.o1std.build.flags.optimize=-O1
genericSTM32F103VB_HSI.menu.opt.o1std.build.flags.ldspecs=
genericSTM32F103VB_HSI.menu.opt.o1lto=Fast (-O1) with LTO
genericSTM32F103VB_HSI.menu.opt.o1lto.build.flags.optimize=-O1 -flto
genericSTM32F103VB_HSI.menu.opt.o1lto.build.flags.ldspecs=-flto
genericSTM32F103VB_HSI.menu.opt.o2std=Faster (-O2)
genericSTM32F103VB_HSI.menu.opt.o2std.build.flags.optimize=-O2
genericSTM32F103VB_HSI.menu.opt.o2std.build.flags.ldspecs=
genericSTM32F103VB_HSI.menu.opt.o2lto=Faster (-O2) with LTO
genericSTM32F103VB_HSI.menu.opt.o2lto.build.flags.optimize=-O2 -flto
genericSTM32F103VB_HSI.menu.opt.o2lto.build.flags.ldspecs=-flto
genericSTM32F103VB_HSI.menu.opt.o3std=Fastest (-O3)
genericSTM32F103VB_HSI.menu.opt.o3std.build.flags.optimize=-O3
genericSTM32F103VB_HSI.menu.opt.o3std.build.flags.ldspecs=
genericSTM32F103VB_HSI.menu.opt.o3lto=Fastest (-O3) with LTO
genericSTM32F103VB_HSI.menu.opt.o3lto.build.flags.optimize=-O3 -flto
genericSTM32F103VB_HSI.menu.opt.ogstd=Debug (-g)
genericSTM32F103VB_HSI.menu.opt.o3lto.build.flags.ldspecs=-flto
genericSTM32F103VB_HSI.menu.opt.ogstd.build.flags.optimize=-Og
genericSTM32F103VB_HSI.menu.opt.ogstd.build.flags.ldspecs=


```


次に、wirishディレクトリの中をNucre_f103rbのものと置き換える

```

$ cp -a variants/nucleo_f103rb/ variants/generic_stm32f103vb_hsi/wirish
```


更に、variants/generic_stm32f103vb_hsi/board/boards.h の最後の方


```

enum {
    PA0, PA1, PA2, PA3, PA4, PA5, PA6, PA7, PA8, PA9, PA10, PA11, PA12, PA13,PA14,PA15,
	PB0, PB1, PB2, PB3, PB4, PB5, PB6, PB7
};

```

となっているのを

```

enum {
	PA0, PA1, PA2, PA3, PA4, PA5, PA6, PA7, PA8, PA9, PA10, PA11, PA12, PA13,PA14,PA15,
	PB0, PB1, PB2, PB3, PB4, PB5, PB6, PB7, PB8, PB9, PB10, PB11, PB12, PB13,PB14,PB15,
	PC0, PC1, PC2, PC3, PC4, PC5, PC6, PC7, PC8, PC9, PC10, PC11, PC12, PC13,PC14,PC15,
	PD0, PD1, PD2, PD3, PD4, PD5, PD6, PD7, PD8, PD9, PD10, PD11, PD12, PD13,PD14,PD15,
	PE0, PE1, PE2, PE3, PE4, PE5, PE6, PE7, PE8, PE9, PE10, PE11, PE12, PE13,PE14,PE15
};
```
system/libmaple/stm32f1/include/series/stm32.h
の適当な箇所に以下を追加する

```

#elif defined(MCU_STM32F103T8)
#   define STM32_F1_LINE                STM32_F1_LINE_PERFORMANCE
#   define STM32_NR_GPIO_PORTS          5
#   define STM32_SRAM_END               ((void*)0x20005000)
#   define STM32_HIGH_DENSITY

#elif defined(MCU_STM32F103TB)
#   define STM32_F1_LINE                STM32_F1_LINE_PERFORMANCE
#   define STM32_NR_GPIO_PORTS          5
#   define STM32_SRAM_END               ((void*)0x20005000)
#   define STM32_HIGH_DENSITY
```


variants/generic_stm32f103vb_hsi/board.cpp
のポート定義を追加する

```

{&gpiob, &timer4, NULL,  8, 3, ADCx}, /* PB8 */ //SDIO_D4
        {&gpiob, &timer4, NULL,  9, 4, ADCx}, /* PB9 */ //SDIO_D5
    {&gpiob,   NULL, NULL, 10, 0, ADCx}, /* PB10 */ //I2C2_SCL/USART3_TX
    {&gpiob,   NULL, NULL, 11, 0, ADCx}, /* PB11 */ //I2C2_SDA/USART3_RX
    {&gpiob,   NULL, NULL, 12, 0, ADCx}, /* PB12 */ //SPI2_NSS/I2S2_WS/I2C2_SMBA/USART3_CK
    {&gpiob,   NULL, NULL, 13, 0, ADCx}, /* PB13 */ //SPI2_SCK/I2S2_CK/USART3_CTS
    {&gpiob,   NULL, NULL, 14, 0, ADCx}, /* PB14 */ //SPI2_MISO/TIM1_CH2N/USART3_RTS
    {&gpiob,   NULL, NULL, 15, 0, ADCx}, /* PB15 */ //SPI2_MOSI/I2S2_SD


    {&gpioc,   NULL, &adc1,  0, 0,   10}, /* PC0 */
    {&gpioc,   NULL, &adc1,  1, 0,   11}, /* PC1 */
    {&gpioc,   NULL, &adc1,  2, 0,   12}, /* PC2 */
    {&gpioc,   NULL, &adc1,  3, 0,   13}, /* PC3 */
    {&gpioc,   NULL, &adc1,  4, 0,   14}, /* PC4 */
    {&gpioc,   NULL, &adc1,  5, 0,   15}, /* PC5 */
    {&gpioc, &timer8, NULL,  6, 1, ADCx}, /* PC6 I2S2_MCK/SDIO_D6*/
        {&gpioc, &timer8, NULL,  7, 2, ADCx}, /* PC7 I2S3_MCK/SDIO_D7*/
    {&gpioc, &timer8, NULL,  8, 3, ADCx}, /* PC8 SDIO_D0*/
    {&gpioc, &timer8, NULL,  9, 4, ADCx}, /* PC9 SDIO_D1*/
    {&gpioc,   NULL, NULL, 10, 0, ADCx}, /* PC10 UART4_TX/SDIO_D2 */
    {&gpioc,   NULL, NULL, 11, 0, ADCx}, /* PC11 UART4_RX/SDIO_D3 */
    {&gpioc,   NULL, NULL, 12, 0, ADCx}, /* PC12 UART5_TX/SDIO_CK */
    {&gpioc,   NULL, NULL, 13, 0, ADCx}, /* PC13 TAMPER-RTC/ Limited output*/
    {&gpioc,   NULL, NULL, 14, 0, ADCx}, /* PC14 OSC32_IN/ Limited output*/
    {&gpioc,   NULL, NULL, 15, 0, ADCx}, /* PC15 OSC32_OUT/ Limited output*/

        {&gpiod,   NULL, NULL,   0, 0, ADCx} , /* PD0 OSC_IN */
        {&gpiod,   NULL, NULL,   1, 0, ADCx} , /* PD1  OSC_OUT */
        {&gpiod,   NULL, NULL,   2, 0, ADCx} , /* PD2  TIM3_ETR/UART5_RX SDIO_CMD */
        {&gpiod,   NULL, NULL,   3, 0, ADCx} , /* PD3  FSMC_CLK */
        {&gpiod,   NULL, NULL,   4, 0, ADCx} , /* PD4  FSMC_NOE */
        {&gpiod,   NULL, NULL,   5, 0, ADCx} , /* PD5  FSMC_NWE */
        {&gpiod,   NULL, NULL,   6, 0, ADCx} , /* PD6  FSMC_NWAIT */
        {&gpiod,   NULL, NULL,   7, 0, ADCx} , /* PD7  FSMC_NE1/FSMC_NCE2 */
        {&gpiod,   NULL, NULL,   8, 0, ADCx} , /* PD8  FSMC_D13 */
        {&gpiod,   NULL, NULL,   9, 0, ADCx} , /* PD9  FSMC_D14 */
        {&gpiod,   NULL, NULL,  10, 0, ADCx} , /* PD10  FSMC_D15 */
        {&gpiod,   NULL, NULL,  11, 0, ADCx} , /* PD11  FSMC_A16 */
        {&gpiod,   NULL, NULL,  12, 0, ADCx} , /* PD12  FSMC_A17 */
        {&gpiod,   NULL, NULL,  13, 0, ADCx} , /* PD13  FSMC_A18 */
        {&gpiod,   NULL, NULL,  14, 0, ADCx} , /* PD14  FSMC_D0 */
        {&gpiod,   NULL, NULL,  15, 0, ADCx} , /* PD15  FSMC_D1 */

        {&gpioe,   NULL, NULL,   0, 0, ADCx} , /* PE0  TIM4_ETR / FSMC_NBL0 */
        {&gpioe,   NULL, NULL,   1, 0, ADCx} , /* PE1  FSMC_NBL1 */
        {&gpioe,   NULL, NULL,   2, 0, ADCx} , /* PE2  TRACECK/ FSMC_A23 */
        {&gpioe,   NULL, NULL,   3, 0, ADCx} , /* PE3  TRACED0/FSMC_A19 */
        {&gpioe,   NULL, NULL,   4, 0, ADCx} , /* PE4  TRACED1/FSMC_A20 */
        {&gpioe,   NULL, NULL,   5, 0, ADCx} , /* PE5  TRACED2/FSMC_A21 */
        {&gpioe,   NULL, NULL,   6, 0, ADCx} , /* PE6  TRACED3/FSMC_A22 */
        {&gpioe,   NULL, NULL,   7, 0, ADCx} , /* PE7  FSMC_D4 */
        {&gpioe,   NULL, NULL,   8, 0, ADCx} , /* PE8  FSMC_D5 */
        {&gpioe,   NULL, NULL,   9, 0, ADCx} , /* PE9  FSMC_D6 */
        {&gpioe,   NULL, NULL,  10, 0, ADCx} , /* PE10 FSMC_D7 */
        {&gpioe,   NULL, NULL,  11, 0, ADCx} , /* PE11 FSMC_D8 */
        {&gpioe,   NULL, NULL,  12, 0, ADCx} , /* PE12 FSMC_D9 */
        {&gpioe,   NULL, NULL,  13, 0, ADCx} , /* PE13 FSMC_D10 */
        {&gpioe,   NULL, NULL,  14, 0, ADCx} , /* PE14 FSMC_D11 */
        {&gpioe,   NULL, NULL,  15, 0, ADCx} , /* PE15 FSMC_D12 */
```


とし、更に

```

variants/generic_stm32f103vb_hsi/board/board.h 
```
の

```

#define BOARD_NR_GPIO_PINS      80

```



とすれば、使用するポートが増える。

これで、Arduino開発環境を起動して以下のように選択すると掃除機をプログラムすることができる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/29d64eae-5620-391d-f95e-3ef3e8c31ed7.png)