LoginSignup
5
4

More than 5 years have passed since last update.

STM32F103 で USBComposite ライブラリを使う

Last updated at Posted at 2018-10-15

「STM32F103でHIDデバイス」
https://qiita.com/nanbuwks/items/f7f2377c2b252e936baa
で紹介したライブラリ
https://github.com/arpruss/USBHID_stm32f1


「USB Composite library for STM32F1 (HID, Serial, MIDI and XBox360 controller)」
https://github.com/arpruss/USBComposite_stm32f1
になった。

試してみる。

インストール

元々インストールしていた、USBHIDドライバを削除しました。

../(ポータブル環境ディレクトリ)/hardware/Arduino_STM32-master/STM32F1/USBHID_stm32f1
このフォルダごと削除します。
../(ポータブル環境ディレクトリ)/hardware/Arduino_STM32-master/STM32F1/libraries/USBComposite_stm32f1

フォルダを作り、
https://github.com/arpruss/USBComposite_stm32f1
からダウンロードしたZIPを解凍、ここに入れる。
../(ポータブル環境ディレクトリ)/hardware/Arduino_STM32-master/STM32F1/libraries/USBComposite_stm32f1
の直下に、
AbsMouse.cpp USBHID.cpp usb_hid.c
Consumer.cpp USBHID.h usb_hid.h
HIDReports.cpp USBMIDI.cpp usb_mass.c
Joystick.cpp USBMIDI.h usb_mass.h
Keyboard.cpp USBMassStorage.cpp usb_mass_int
などがあるようにする。

Arduino IDEを実行。

HID Keyboard

ミニマムコードは以下の通り。


#include <USBComposite.h>

USBHID HID;
HIDKeyboard Keyboard(HID);

void setup() {
  HID.begin(HID_KEYBOARD);
  Keyboard.begin();
  delay(2000);
}

void loop() {

    Keyboard.println("Hello,world.");
    delay(5000);
}

先のUSBHIDでのコードとは、ちょと違っている。

microSDリーダー

コンパイル

次に、ライブラリサンプルの、sdreader を実行しようとしたら、以下のようにエラー


/home/nanbuwks/Downloads/ardublock/arduino/linux64/arduino-1.8.5_STM32/hardware/Arduino_STM32-master/STM32F1/libraries/USBComposite_stm32f1/examples/sdreader/sdreader.ino:6:19: fatal error: SdFat.h: No such file or directory
 #include "SdFat.h"
                   ^
compilation terminated.
次のフォルダのライブラリUSBComposite_stm32f1バージョン0.91を使用中:/home/nanbuwks/Downloads/ardublock/arduino/linux64/arduino-1.8.5_STM32/hardware/Arduino_STM32-master/STM32F1/libraries/USBComposite_stm32f1 
次のフォルダのライブラリSPIバージョン1.0を使用中:/home/nanbuwks/Downloads/ardublock/arduino/linux64/arduino-1.8.5_STM32/hardware/Arduino_STM32-master/STM32F1/libraries/SPI 
exit status 1
ボードGeneric STM32F103C seriesに対するコンパイル時にエラーが発生しました。

SdFat.h が無いということなので、library manager から sdfat で検索してインストールしたが、うまくいかない。



・・・

スケッチをコンパイルしています...
"/home/nanbuwks/Downloads/ardublock/arduino/linux64/arduino-1.8.5_STM32/portable/packages/arduino/tools/arm-none-eabi-gcc/4.8.3-2014q1/bin/arm-none-eabi-g++" -c -g -Os -w -DDEBUG_LEVEL=DEBUG_NONE -std=gnu++11 -MMD -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -DBOARD_generic_stm32f103c -DVECT_TAB_ADDR=0x8002000 -DERROR_LED_PORT=GPIOB -DERROR_LED_PIN=1 -mcpu=cortex-m3 -DF_CPU=72000000L -DARDUINO=10805 -DARDUINO_GENERIC_STM32F103C -DARDUINO_ARCH_STM32F1  -DSERIAL_USB -DGENERIC_BOOTLOADER -DMCU_STM32F103C8  -mthumb  -march=armv7-m -D__STM32F1__ -DMCU_STM32F103C8  -mthumb  -march=armv7-m -D__STM32F1__ "-I/home/nanbuwks/Downloads/ardublock/arduino/linux64/arduino-1.8.5_STM32/hardware/Arduino_STM32-master/STM32F1/system/libmaple" "-I/home/nanbuwks/Downloads/ardublock/arduino/linux64/arduino-1.8.5_STM32/hardware/Arduino_STM32-master/STM32F1/system/libmaple/include" "-I/home/nanbuwks/Downloads/ardublock/arduino/linux64/arduino-1.8.5_STM32/hardware/Arduino_STM32-master/STM32F1/system/libmaple/stm32f1/include"                                                           "-I/home/nanbuwks/Downloads/ardublock/arduino/linux64/arduino-1.8.5_STM32/hardware/Arduino_STM32-master/STM32F1/system/libmaple/usb/stm32f1" "-I/home/nanbuwks/Downloads/ardublock/arduino/linux64/arduino-1.8.5_STM32/hardware/Arduino_STM32-master/STM32F1/system/libmaple/usb/usb_lib" "-I/home/nanbuwks/Downloads/ardublock/arduino/linux64/arduino-1.8.5_STM32/hardware/Arduino_STM32-master/STM32F1/cores/maple" "-I/home/nanbuwks/Downloads/ardublock/arduino/linux64/arduino-1.8.5_STM32/hardware/Arduino_STM32-master/STM32F1/variants/generic_stm32f103c" "-I/home/nanbuwks/Downloads/ardublock/arduino/linux64/arduino-1.8.5_STM32/hardware/Arduino_STM32-master/STM32F1/libraries/USBComposite_stm32f1" "-I/home/nanbuwks/Downloads/ardublock/arduino/linux64/arduino-1.8.5_STM32/hardware/Arduino_STM32-master/STM32F1/libraries/SPI/src" "-I/home/nanbuwks/Downloads/ardublock/arduino/linux64/arduino-1.8.5_STM32/portable/sketchbook/libraries/SdFat/src" "/tmp/arduino_build_276687/sketch/sdreader.ino.cpp" -o "/tmp/arduino_build_276687/sketch/sdreader.ino.cpp.o"
sdreader:14: error: 'SdFatEX' does not name a type
 SdFatEX sd;
 ^
/home/nanbuwks/Downloads/ardublock/arduino/linux64/arduino-1.8.5_STM32/hardware/Arduino_STM32-master/STM32F1/libraries/USBComposite_stm32f1/examples/sdreader/sdreader.ino: In function 'bool write(const uint8_t*, uint32_t, uint16_t)':
sdreader:21: error: 'sd' was not declared in this scope
   return sd.card()->writeBlocks(startSector, writebuff, numSectors);
          ^
/home/nanbuwks/Downloads/ardublock/arduino/linux64/arduino-1.8.5_STM32/hardware/Arduino_STM32-master/STM32F1/libraries/USBComposite_stm32f1/examples/sdreader/sdreader.ino: In function 'bool read(uint8_t*, uint32_t, uint16_t)':
sdreader:25: error: 'sd' was not declared in this scope
   return sd.card()->readBlocks(startSector, readbuff, numSectors);
          ^
/home/nanbuwks/Downloads/ardublock/arduino/linux64/arduino-1.8.5_STM32/hardware/Arduino_STM32-master/STM32F1/libraries/USBComposite_stm32f1/examples/sdreader/sdreader.ino: In function 'void initReader()':
sdreader:36: error: 'sd' was not declared in this scope
   cardSize = sd.card()->cardSize();  
              ^
/home/nanbuwks/Downloads/ardublock/arduino/linux64/arduino-1.8.5_STM32/hardware/Arduino_STM32-master/STM32F1/libraries/USBComposite_stm32f1/examples/sdreader/sdreader.ino: In function 'void loop()':
sdreader:46: error: 'sd' was not declared in this scope
     if (sd.begin(SD_CHIP_SELECT)) {
         ^
次のフォルダのライブラリUSBComposite_stm32f1バージョン0.91を使用中:/home/nanbuwks/Downloads/ardublock/arduino/linux64/arduino-1.8.5_STM32/hardware/Arduino_STM32-master/STM32F1/libraries/USBComposite_stm32f1 
次のフォルダのライブラリSPIバージョン1.0を使用中:/home/nanbuwks/Downloads/ardublock/arduino/linux64/arduino-1.8.5_STM32/hardware/Arduino_STM32-master/STM32F1/libraries/SPI 
次のフォルダのライブラリSdFatバージョン1.0.7を使用中:/home/nanbuwks/Downloads/ardublock/arduino/linux64/arduino-1.8.5_STM32/portable/sketchbook/libraries/SdFat 
exit status 1
'SdFatEX' does not name a type

・・・/libraries/SdFat/src/SdFatConfig.h

内で、


#define ENABLE_EXTENDED_TRANSFER_CLASS 1

としたらコンパイルできた。

接続

aitendoのアダプタを買ってきて、接続してみました。

IMG_20181015_163941.jpg

SD CS = PA4
SD SCK = PA5
SD MISO = PA6
SD MOSI = PA7

IMG_20181015_163245.jpg

として接続しました。

動作

適当なmicro SDカードを入れて接続してみました。


[19099.436744] usb 1-1.2: new full-speed USB device number 27 using ehci-pci
[19099.546459] usb 1-1.2: New USB device found, idVendor=1eaf, idProduct=0003
[19099.546461] usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[19099.546462] usb 1-1.2: Product: Maple 003
[19099.546463] usb 1-1.2: Manufacturer: LeafLabs
[19099.546463] usb 1-1.2: SerialNumber: LLM 003
[19101.005794] usb 1-1.2: USB disconnect, device number 27
[19101.228836] usb 1-1.2: new full-speed USB device number 28 using ehci-pci
[19101.342356] usb 1-1.2: New USB device found, idVendor=1eaf, idProduct=0029
[19101.342358] usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[19101.342359] usb 1-1.2: Product: Maple
[19101.342360] usb 1-1.2: Manufacturer: LeafLabs
[19101.342797] usb-storage 1-1.2:1.0: USB Mass Storage device detected
[19101.343985] scsi host6: usb-storage 1-1.2:1.0
[19101.344028] scsi host6: runtime PM trying to activate child device host6 but parent (1-1.2:1.0) is not active
[19101.344191] cdc_acm 1-1.2:1.1: ttyACM3: USB ACM device
[19102.366263] scsi 6:0:0:0: Direct-Access     STM      SD Flash Disk    1.0  PQ: 0 ANSI: 2
[19102.366584] sd 6:0:0:0: Attached scsi generic sg1 type 0
[19102.367951] sd 6:0:0:0: [sdb] 15523840 512-byte logical blocks: (7.95 GB/7.40 GiB)
[19102.369456] sd 6:0:0:0: [sdb] Write Protect is off
[19102.369459] sd 6:0:0:0: [sdb] Mode Sense: 03 00 00 00
[19102.370244] sd 6:0:0:0: [sdb] No Caching mode page found
[19102.370248] sd 6:0:0:0: [sdb] Assuming drive cache: write through
[19102.384302]  sdb: sdb1 sdb2
[19102.389664] sd 6:0:0:0: [sdb] Attached SCSI removable disk

さて、このmicroSDカードはRaspberryPi用に設定したものです。パーティーションは前64MBytesがFat,その後の2GBytesがextファイルシステムです。


$ sudo fdisk -l /dev/sdb
Disk /dev/sdb: 7.4 GiB, 7948206080 bytes, 15523840 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x1f9084d7

デバイス   起動  Start 最後から セクタ Size Id タイプ
/dev/sdb1         8192   137215  129024  63M  c W95 FAT32 (LBA)
/dev/sdb2       137216  4233215 4096000   2G 83 Linux

SdFatということでFatファイルシステムだけかなと思ったのですがextファイルシステムもLinuxPCから読めました。

速度計測

適当なファイルをコピーして速度を測ってみます。



$ time cp -a /media/nanbuwks/202638e1-4ce4-45df-9a00-ad725c2537bb/var/cache/ ~/$
cp: '/media/nanbuwks/202638e1-4ce4-45df-9a00-ad725c2537bb/var/cache/apt/archives/lock' を 読み込み用に開くことが出来ません: 許可がありません
cp: '/media/nanbuwks/202638e1-4ce4-45df-9a00-ad725c2537bb/var/cache/debconf/passwords.dat' を 読み込み用に開くことが出来ません: 許可がありません
cp: '/media/nanbuwks/202638e1-4ce4-45df-9a00-ad725c2537bb/var/cache/ldconfig' にアクセスできません: 許可がありません

real    8m20.284s
user    0m0.016s
sys 0m0.420s

$ du --max-depth=1 -h
204M    ./cache

あまり速くありません。204MBytesの読み込みに500秒かかっています。

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4