2016-10-09 82 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