2016年7月3日 星期日

STM32F429 USB HID/VCP/MSC Test(keyboard + mouse + hidraw + virtual com port + mass storage)

1. 本範例是利用stm32f429 discovery board來實做出usb keyboard/mouse/hidraw/virtual com port/mass storage等裝置, 並送出簡單的測試資料來驗證是否正確.



2. 程式完整範例下載連結: (使用IAR EWARM v7.7)
    stm32f429_usb_hid_vcp_msc_example_code

3. main flow:

  • 程式用來切換hid or vcp or msc的設定在stm32f429i_discovery.h中, 現在預設的是MSC, 而底下的KeyBoardTest/MouseTest/HidRawTest等3個define, 則是決定可以進行哪些子項目的測試, 可以全部一起打開, 也可以只打開其中一個.


  • main loop主要在執行button scan, 當確認到按下user button後, 根據不同的define去送出不同的資料.

    • 特別需要注意的是當keyboard/mouse放開時, 需送出release key的event, 否則會看到連發key的情形出現, 而hidraw則不需要.
    4. test flow:
    • HID:
      • keyboard test: 可以先開啟一個空白文字檔來測試, 當按下user button時, 會送出一個小寫(in lowercase letters)的a出現, 放開即馬上停止輸出.
      • mouse test: 當按下user button時, 滑鼠鼠標會朝右上方移動, 放開即馬上停止輸出.
      • hidraw test: 測試時, 可先安裝Bus Hound tool, 接著接上stm32f429 discovery board, 若成功則可以看到我們新增出來的usb device(ex: [44]USB輸入裝置).


    按下user button後, 即可看到我們輸出的資料, 放開不需做其它處理即會自行停止輸出.

    • VCP:
      • 程式開始執行後, 先至裝置管理員確認是否有長出Virtual COM Port.

      • 接著開啟終端機程式(ex: putty)

      • 按下user button後, 就會看到如下的訊息開始打印.

    • MSC:
      • 主要操作的程式接放在usbd_storage_msd.c裡面, 包含disk size(96KB)和SRAM Init/SRAM Write/SRAM Read functions.

      • 程式開始執行後, 會先馬上看到產生需要格式化的訊息出現, 這時選擇格式化磁片.


      • 接著會看到磁碟的基本資訊, 大小正如同我們設定的一樣(96K RAM),按下開始執行格式化.
      • 等待執行完成.

      • 這時候去裝置管理員底下的磁碟機查看, 可以看到STM32 USB RAM-DISK USB Device.

      • 這時候就可以去磁碟底下進行跟隨身碟一樣的操作, 例如新增檔案, 或是資料夾等.

    5 則留言:

    1. 前輩您好 ~ 我也剛在接觸USB_VCP的部分 ,只是使用您的程式時發現無法編譯成功

      是否能在提供一次程式代碼呢 謝謝您的分享

      回覆刪除
    2. Hello:

      可以說一下遇到怎樣的build error嗎?

      JustinWang

      回覆刪除
      回覆
      1. HI~ 前輩您好

        error 的部分已經自行處理掉了

        原因是因為 少了一些資源的連結,例如cm4 這些檔案

        只是前輩想請教您目前我使用上的一個問題尚未處理成功

        我在前輩的程式中加入tim3_NVIC 後他就無法辨識USB的裝置

        我在TIM3計時中斷裡 是希望每0.5秒可以讀取一次ADC後將訊號透過

        USB_VCP傳輸至電腦但目前一直找不到失敗的原因

        想與前輩請教一下 謝謝您的指教~~

        刪除
      2. HI~ 前輩您好

        error 的部分已經自行處理掉了

        原因是因為 少了一些資源的連結,例如cm4 這些檔案

        只是前輩想請教您目前我使用上的一個問題尚未處理成功

        我在前輩的程式中加入tim3_NVIC 後他就無法辨識USB的裝置

        我在TIM3計時中斷裡 是希望每0.5秒可以讀取一次ADC後將訊號透過

        USB_VCP傳輸至電腦但目前一直找不到失敗的原因

        想與前輩請教一下 謝謝您的指教~~

        刪除
    3. 前輩您好~

      剛剛的編譯問題已經順利解決了

      原因是一些檔案的路徑遺失了,例如:cm4 這些資源檔

      目前使用前輩的程式後,自行加入NVIC計時中斷後 USB就找尋不到裝置

      我是想每0.5秒可讀取一次ADC的值後,經由USB_VCP傳輸至電腦

      想與前輩請教一下,這部分的問題該如何除錯

      謝謝您的指教~~

      回覆刪除