STM32F746G-DISCOでUSBホストにキーボードを接続するメモ

 マイコン関連の工作をしているとシリアルデータやピンの変化を長時間ロギングしたいことが多々ある訳ですがPCを使ってログを収集していると何かと不便で、独立したデータロガーが欲しいと思っていました。そんなとき目に留まったのがSTM32F746G-DISCOでした。LCD、SDカード、Arduinoピン互換の端子があり、ロガーにはぴったりのボードだと思いました。

f:id:jun930:20200818145454p:plain

 早速データをSDカードに保存するコードを書いてみたわけですが、データ取得を止めずにデータを抜き出したい、ログを別のファイル名にしたい、ターゲットボードにコマンドを送りたい、などの機能が欲しくなりUSBキーボードからコマンドを送れるようにすることにしました。
 そこで、STM32にUSBホストを作りUSBキーボードを機能させるまでのメモを残しておこうと思います。最初に行うことはSTM32CubeMXでボードを指定してしまうことです。ボードを指定すれば回路図を開いて個々に設定する手間が省け粗方な設定はよろしく行われます。

f:id:jun930:20200818142912p:plain

 USB関連で設定を変更したヵ所は、MiddlewareのUSB_HOSTを選択してClass for FS IPでHIDを選択したのみです。その他、FREERTOSは使わないことにしました。

f:id:jun930:20200818143245p:plain

 ここまでの設定ができたら、コードを生成して正常にコンパイルできることを確認です。(開発環境周りは割愛)

 キーボードの押下イベントを受けられるように自分のコードの任意の場所に以下の関数を作成します。(PRINTF1の部分を適宜変更して使用)

void USBH_HID_EventCallback(USBH_HandleTypeDef *phost)
{
    uint8_t key;
    HID_KEYBD_Info_TypeDef *pki;

    if(USBH_HID_GetDeviceType(phost) == HID_KEYBOARD){
        pki = USBH_HID_GetKeybdInfo(phost);
        key = USBH_HID_GetASCIICode(pki);
        if(key){
            PRINTF1("%c", key);
        }
    }
}

 最後に自分のコードのメインループから、MX_USB_HOST_Process();を呼び出すようにします。Arduino風に書くと、以下のような感じ。

void loop(void)
{
    MX_USB_HOST_Process();
}

  USBキーボードはCN13(USB_FS)の端子に接続しましょう。キー配列は101となっているようです。配列を変更したい場合は、usbh_hid_keybd.cの配列変数を編集すれば良さそうです。

 

以上