LoginSignup
11
9

More than 5 years have passed since last update.

STM32F103C8T6でUSB HIDを実装

Last updated at Posted at 2017-11-05

はじめに

通称Blue PillとよばれているSTM32F103C8T6ボード。AliexpressではU$1.7程度で売っているST Microの32bit RISCプロセッサ基板。Arduino Microと勘違いして購入してしまい、放置していたものをUSB HIDとして有効活用してみることにした。格安でUSB HIDを実装できることを確認したので、その手順を公開しようと思います。

用意するもの - ハードウェア

  1. STM32F103C8T6 HTB1PemDJpXXXXXHXpXXq6xXFXXXM.jpg
  2. ST-LINK V2 プログラマです。これがないとプログラム書き込みできません。(無くてもできるようですが有ったほうが便利です。やすいし) IMG_9703-800.JPG

用意するもの - ソフトウェア

  1. System Workbench for STM32
    開発環境です。いろいろ有るようですが私はこれを使用しました。
  2. STM32CodeMx
    雛形コードジェネレータです。すごく便利。無くても良いです。
  3. STM32 ST-LINK Utility
    ST-LINK V2用のソフトウェアです。プログラム書き込み時に使用します。

個々の入手方法使用方法はぐぐってください。

STM32CubeMXでコード生成する

Clipboard02.png
New Projectをクリック

Clipboard03.png
STM32F103C8で検索し、Start Projectをクリック
Clipboard04.png
1. USB Device(F5)をチェック
2. USB_DEVICEでHIDを選択
3. RCCでCrystal/Ceramicを選択
Clipboard05.png
クロック設定はこのように。

Clipboard06.png
コードを出力します。このとき"Toolchain / IDE"をお使いの開発環境に合わせることを忘れずに!

これで基本コードの生成は完了です。

System Workbenchでコード編集&コンパイルする

Clipboard08.png
File->Importで先程生成のコードをインポートします。Existing Projects into Workspaceを選択してください。

Clipboard12.png
キーボードのHIDとするため、修正を加えます。HID_EPIN_SIZEを5に、HID_MOUSE_REPORT_DESC_SIZEを78に。
Clipboard13.png
HID_MOUSE_ReportDescをキーボード向けに書き換えます。
__ALIGN_BEGIN static uint8_t HID_MOUSE_ReportDesc[HID_MOUSE_REPORT_DESC_SIZE] __ALIGN_END =
{
// 78 bytes
0x05, 0x01, // Usage Page (Generic Desktop Ctrls)
0x09, 0x06, // Usage (Keyboard)
0xA1, 0x01, // Collection (Application)
0x85, 0x01, // Report ID (1)
0x05, 0x07, // Usage Page (Kbrd/Keypad)
0x75, 0x01, // Report Size (1)
0x95, 0x08, // Report Count (8)
0x19, 0xE0, // Usage Minimum (0xE0)
0x29, 0xE7, // Usage Maximum (0xE7)
0x15, 0x00, // Logical Minimum (0)
0x25, 0x01, // Logical Maximum (1)
0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0x95, 0x03, // Report Count (3)
0x75, 0x08, // Report Size (8)
0x15, 0x00, // Logical Minimum (0)
0x25, 0x64, // Logical Maximum (100)
0x05, 0x07, // Usage Page (Kbrd/Keypad)
0x19, 0x00, // Usage Minimum (0x00)
0x29, 0x65, // Usage Maximum (0x65)
0x81, 0x00, // Input (Data,Array,Abs,No Wrap,Linear,Preferred State,No Null Position)
0xC0, // End Collection
0x05, 0x0C, // Usage Page (Consumer)
0x09, 0x01, // Usage (Consumer Control)
0xA1, 0x01, // Collection (Application)
0x85, 0x02, // Report ID (2)
0x05, 0x0C, // Usage Page (Consumer)
0x15, 0x00, // Logical Minimum (0)
0x25, 0x01, // Logical Maximum (1)
0x75, 0x01, // Report Size (1)
0x95, 0x08, // Report Count (8)
0x09, 0xB5, // Usage (Scan Next Track)
0x09, 0xB6, // Usage (Scan Previous Track)
0x09, 0xB7, // Usage (Stop)
0x09, 0xB8, // Usage (Eject)
0x09, 0xCD, // Usage (Play/Pause)
0x09, 0xE2, // Usage (Mute)
0x09, 0xE9, // Usage (Volume Increment)
0x09, 0xEA, // Usage (Volume Decrement)
0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0xC0, // End Collection
};

キーコード送出のコードを書きます。

Clipboard14.png
Clipboard15.png
"N"を1秒毎に送出するコードです。
キーコードはアスキーコードではありません。こちらのキーコード表を参照してください。53ページにあります。

Clipboard18.png
ハンマーマークのアイコンをクリックしてコンパイルします。
エラーが発生しなければコンパイルは完了します。

書き込み

ST-LINKと接続します。
IMG_20171105_100846.jpg
BOOT0のジャンパーを1にセットして、リセットボタン押下します。
ジャンパーコネクタが小さいので、写真ではケーブルにしています。

STM32 ST-LINK Utilityを起動し、Ctrl+Pを押下。ここでエラーが発生する場合は、上記ジャンパを設定忘れか、リセット忘れです。
Clipboard20.png
Browseを押下して、先程コンパイルしたファイルを選択します。プロジェクトフォルダのDebugもしくはReleaseフォルダのしたに.binというファイルがありますので、それを選択。
重要 Browseによるファイル選択は書き込みの度におこなってください。コード修正したのに書き込み後の動作かわらないということが発生します。

Clipboard22.png
Startを押下して書き込みます。

実行

BOOT0のジャンバを0に戻しリセットボタン押下すれば、プログラムが実行されます。
今回はHIDでキーボード仕様のため、USBケーブルを接続することでキー入力が生成されます。
プログラムの例ではNキーを1秒毎に入力されるのが分かるはずです。
Clipboard23.png

おわりに

STM32F103C8T6でHIDを実現するための資料がなかったので作成しました。参考になれば幸いです。

Special Thanks!

大変参考になったサイトです。STM32 - Custom USB HID device step by step

Ikeda

11
9
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
11
9