stm32cube, usb-хост, скрытая мышь / клавиатура

#usb #host #hid #stm32f4

#usb #хост #скрытый #stm32f4

Вопрос:

Я пытался настроить базовое USB-соединение с USB-мышью, используя мой диск stm32f4. для моей платы нет примеров usb, поэтому я пошел посмотреть на другие платы.

штука с библиотекой кубов stm обещала простую разработку и все такое, поэтому я создал проект с cube, включающим USB_OTG_FS в режиме только для хоста и четырьмя выводами ввода-вывода для светодиодов. Я просмотрел файлы, и мне показалось, что чтение кнопок мыши будет довольно тривиальным, но я не могу заставить его работать. если я запущу

 devtype = USBH_HID_GetDeviceType(amp;hUsbHostFS);
  

он правильно определяет устройство.

 USBH_HID_MouseInit(amp;hUsbHostFS)
  

возвращает USBH_OK,
но независимо от того, что я пытаюсь

 mouse=USBH_HID_GetMouseInfo(amp;hUsbHostFS);
  

всегда имеет значение NULL

«USBH_HID_MouseInit» никогда не упоминается в документации (DM00105256.pdf) кроме того, они используются только в примерах RTOS. При чтении автономного примера usb-хоста может показаться, что для взаимодействия с мышью будет так же просто, как запустить GetDeviceType и опросить GetMouseInfo, но я не могу заставить его работать.

это весь код, который я добавил, он выполняется в основном, пока

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

          devtype = USBH_HID_GetDeviceType(amp;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(amp;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(amp;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;
  

остальная часть кода не изменилась. как я уже говорил, он обнаруживает соединение, и если это мышь, клавиатура или неизвестное устройство, все в порядке. Я просто не могу заставить его общаться

Ответ №1:

Куб содержит ошибки, странно закодирован и плохо документирован.

В зависимости от имеющейся у вас платы вы должны убедиться, что часы настроены правильно (в 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 требуется тактовая частота 48 МГц. Вот уравнения:

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