STM32Duino を改造して掃除機をArduinoでプログラムできるようにする
STM32が入った掃除機。アレコレしてたらプログラムが書き込めるようになった。
https://qiita.com/nanbuwks/items/f557baebc3406e9a6edb
掃除機は CPU として STM32F103VBT6 を搭載しているのですが、ボード設定を「Generic STM32F103V seriies」とするとクロックの設定で動かない。
「 Nucreo F103 @ 64MHz」だと動く。
理由は、掃除機は外部クロックを搭載しておらず、内蔵クロックで動いているから外部クロックの設定になっているものだとプログラムは書き込めるけれども動作はしない。
「 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開発環境を起動して以下のように選択すると掃除機をプログラムすることができる。
Author And Source
この問題について(STM32Duino を改造して掃除機をArduinoでプログラムできるようにする), 我々は、より多くの情報をここで見つけました https://qiita.com/nanbuwks/items/955337f7909a9fd7af52著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .