#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