2016-10-09 83 views
0

我一直在嘗試使用我的stm32f4 discvery設置一些usb鼠標的基本usb通信。我的董事會沒有usb例子,所以我進去看看其他董事會。stm32cube,usb主機,hid鼠標/鍵盤

stm的立方體庫thingy很容易開發和所有,所以我生成了一個項目立方體包含USB_OTG_FS主機只模式和四個IO引腳的LED。 我看了一下文件,看起來好像讀鼠標按鈕相當平凡,但我無法使它工作。 如果我運行

devtype = USBH_HID_GetDeviceType(&hUsbHostFS); 

它檢測到設備正確。

USBH_HID_MouseInit(&hUsbHostFS) 

返回USBH_OK, 但無論我怎麼努力

mouse=USBH_HID_GetMouseInfo(&hUsbHostFS); 

始終是NULL

「USBH_HID_MouseInit」 從來沒有在文檔(DM00105256.pdf)提到 也只有RTOS示例使用它們。閱讀usb主機獨立的例子,似乎與運行鼠標一樣簡單,只要運行GetDeviceType,輪詢GetMouseInfo,但我不能讓它工作。

這是我添加的代碼,它在main中的執行而

if(Appli_state == APPLICATION_READY){ 
    switch(state) 
    { 
    case 0: 

      devtype = USBH_HID_GetDeviceType(&hUsbHostFS); 
      if(devtype == HID_MOUSE){ 
       HAL_GPIO_WritePin(GPIOD,GPIO_PIN_14,1); 
       HAL_GPIO_WritePin(GPIOD,GPIO_PIN_12,0); 
       state=1; 
      } 
      else if(devtype == HID_KEYBOARD){ 
       HAL_GPIO_WritePin(GPIOD,GPIO_PIN_14,0); 
       HAL_GPIO_WritePin(GPIOD,GPIO_PIN_12,1); 
       state=2; 
      } 
      else{ 
       HAL_GPIO_WritePin(GPIOD,GPIO_PIN_14,0); 
       HAL_GPIO_WritePin(GPIOD,GPIO_PIN_12,0); 
      } 

    break; 

    case 1: 
     if(USBH_HID_MouseInit(&hUsbHostFS)==0){ 
      HAL_GPIO_WritePin(GPIOD,GPIO_PIN_15,1); 
      state=3; 
     } 
     else { 
      HAL_GPIO_WritePin(GPIOD,GPIO_PIN_15,0); 
      state=0; 
     } 

    break; 

    case 3: 
     mouse=USBH_HID_GetMouseInfo(&hUsbHostFS); 
     if(mouse != NULL)HAL_GPIO_WritePin(GPIOD,GPIO_PIN_13,1); 
     else HAL_GPIO_WritePin(GPIOD,GPIO_PIN_13,0); 

    break; 

    default: 
     break; 
    } 
    } 
    if(Appli_state != APPLICATION_READY) state=0; 

休息的代碼不變。就像我之前說的,它檢測到連接,如果它是鼠標,鍵盤或未知設備就好了。我只是無法讓它溝通

回答

0

立方體是越野車,以奇怪的方式編碼,並沒有很好的記錄。

取決於你有,你必須確保時鐘是設置正確(在system_stm32f4.c)

藉助基於STM32F407版本(http://www.st.com/en/evaluation-tools/stm32f4discovery.html),你應該使用這些設置的實際板:

HSE = 8000000 
PLL_M = 8 
PLL_Q = 7 
PLL_N = 336 
PLL_P = 4 

USB OTG FS需要48MHz時鐘。以下是方程式:

USB OTG FS, SDIO and RNG Clock = PLL_VCO/PLLQ 
PLL_VCO = (HSE_VALUE/PLL_M) * PLL_N