56-USB_HID_HOST-Library (STM32F4)

Mit dieser Library kann eine USB-Maus oder eine USB-Tastatur am USB-OTG-Port vom Discovery-Modul betrieben werden.

Die Library hat vier Funktionen :
1. Eine “Init-Funktion”
Die muss beim start einmal aufgerufen werden.

2. Die “HOST_Do-Funktion”
Diese muss zyklisch, am besten in der while(1) aufgerufen werden. Sie liefert den Status vom USB-Device zurück. Dieser Status muss ausgewertet werden und erst wenn ein USB-Device (Mouse oder Keyboard) erkannt wurde, darf auf das Device zugegriffen werden.

3. Die “GetKey-Funktion” liefert (wenn eine USB-Tastatur angeschlossen ist) den Ascii-Code der gedrückten Taste zurück (bzw. 0 wenn keine Taste gedrückt ist)

4. Die “GetMouse-Funktion” liefert (wenn eine USB-Maus angeschlossen ist) eine “1″ zurück, wenn neue Maus-Daten vorhanden sind, ansonsten eine “0″. Die Mausdaten stehen in der Struktur “USB_MOUSE_DATA”

Hinweis : bei mir kommt es ab und zu vor, das nach dem einstecken von einem Device, dieses nicht erkannt wird (Status = “USB_HID_DEV_NOT_SUPPORTED”). Ein abziehen und erneutes einstecken bringt dann nichts mehr, es muss ein Hardware Reset ausgelöst werden !! -> keine Ahnung was das ist, falls da jemand Fehler suchen will …viel Spass.

USB-Tastatur :
es wird nur das drücken einer Taste erkannt, eine gedrückt gehaltene Taste löst kein neues event aus (Tasten repeat funktioniert also nicht)

USB-Maus :
ein Mausrad wird nicht unterstützt
die Grenzen der Maus-Koordinaten können in einem H-File eingestellt werden
(im Moment 320 x 240)

Benutzte Pins :

1
2
3
4
5
PA9   -> USB_OTG_VBUS
PA10  -> USB_OTG_ID
PA11  -> USB_OTG_DM
PA12  -> USB_OTG_DP
PC0   -> USB_VBUS_Enable

Voraussetzungen :

1
2
Benutzte Module der CooCox-IDE : GPIO, MISC
Benutzte Librarys : keine

Enumerationen :

1
2
3
4
5
6
7
8
9
10
11
typedef enum {
  USB_HID_HOST_NO_INIT =0,   // USB-Schnittstelle noch nicht initialisiert
  USB_HID_DEV_DETACHED,      // kein Device angeschlossen
  USB_HID_SPEED_OK,          // USB-Speed wird unterstützt
  USB_HID_SPEED_ERROR,       // USB-Speed wird nicht unterstützt
  USB_HID_DEV_NOT_SUPPORTED, // Device wird nicht untersützt
  USB_HID_OVER_CURRENT,      // Überstrom erkannt
  USB_HID_DEV_CONNECTED,     // Device verbunden noch nicht bereit
  USB_HID_MOUSE_CONNECTED,   // Mouse verbunden und bereit
  USB_HID_KEYBOARD_CONNECTED // Tastatur verbunden und bereit
}USB_HID_HOST_STATUS_t;

Funktionen :

1
2
3
4
void UB_USB_HID_HOST_Init(void);                // zum init des USB-Host
USB_HID_HOST_STATUS_t UB_USB_HID_HOST_Do(void); // zum check vom Device-Status
uint8_t UB_USB_HID_HOST_GetKey(void);           // zum auslesen der Keyboard-Daten
uint8_t UB_USB_HID_HOST_GetMouse(void);         // zum auslesen der Maus-Daten

Beispiel :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
//--------------------------------------------------------------
// File     : main.c
// Datum    : 28.08.2013
// Version  : 1.0
// Autor    : UB
// EMail    : mc-4u(@)t-online.de
// Web      : www.mikrocontroller-4u.de
// CPU      : STM32F4
// IDE      : CooCox CoIDE 1.7.4
// GCC      : 4.7 2012q4
// Module   : CMSIS_BOOT, M4_CMSIS_CORE
// Funktion : Demo der USB-HID-Host Library
// Hinweis  : Diese zwei Files muessen auf 8MHz stehen
//              "cmsis_boot/stm32f4xx.h"
//              "cmsis_boot/system_stm32f4xx.c"
//--------------------------------------------------------------
 
#include "main.h"
#include "stm32_ub_led.h"
#include "stm32_ub_usb_hid_host.h"
 
//--------------------------------------------------------------
void mouse_function(void)
{
  UB_Led_On(LED_ORANGE);
  // Maus-Daten abfragen
  UB_USB_HID_HOST_GetMouse();
  // Grüne LED mit linker Maustaste ein/ausschalten
  if(USB_MOUSE_DATA.btn_left==MOUSE_BTN_PRESSED) {
    UB_Led_On(LED_GREEN); // grüne LED einschalten
  }
  else {
    UB_Led_Off(LED_GREEN); // grüne LED ausschalten
  }
}
 
//--------------------------------------------------------------
void key_function(void)
{
  uint8_t akt_key=0;
 
  UB_Led_On(LED_BLUE);
  // Keyboard-Daten abfragen
  akt_key=UB_USB_HID_HOST_GetKey();
  // Grüne LED mit Tasten "1" und "2" ein/auschalten
  if(akt_key=='1') {
    UB_Led_On(LED_GREEN); // grüne LED einschalten
  }
  if(akt_key=='2') {
    UB_Led_Off(LED_GREEN); // grüne LED ausschalten
  }
}
 
//--------------------------------------------------------------
int main(void)
{
  USB_HID_HOST_STATUS_t host_status;
 
  SystemInit(); // Quarz Einstellungen aktivieren
 
  // Init der LEDs
  UB_Led_Init();
 
  // Init vom USB-OTG-Port als HID-HOST
  // (zum betreiben von USB-Mouse oder USB-Tastatur)
  UB_USB_HID_HOST_Init();
 
  while(1)
  {
    // pollen vom USB-Status
    host_status=UB_USB_HID_HOST_Do();
    if(host_status==USB_HID_MOUSE_CONNECTED) {
      // wenn USB-Maus gefunden wurde
      mouse_function();
    }
    else if(host_status==USB_HID_KEYBOARD_CONNECTED) {
      // wenn USB-Keyboard gefunden wurde
      key_function();
    }
    else if(host_status==USB_HID_DEV_NOT_SUPPORTED) {
      // wenn Fehler beim USB-Device
      UB_Led_On(LED_RED);
    }
    else {
      // wenn kein USB-Device vorhanden
      UB_Led_Off(LED_ORANGE);
      UB_Led_Off(LED_BLUE);
      UB_Led_Off(LED_GREEN);
    }
  }
}

Hier die Library zum Download :

ub_stm32f4_usb_hid_host_v100

Hier der komplette CooCox-Projektordner zum Download :

Demo_56_USB_HID_HOST

2 Antworten auf 56-USB_HID_HOST-Library (STM32F4)

  1. Johnny Dreher sagt:

    Hello, I’m trying to read a gamepad USB with a STM32F407 board. Can you help me?

  2. Johnny Dreher sagt:

    Hello, I’m trying to convert this library to read a gamepad, but I’m realy confused. Can you help me?
    Thanks a lot.


Wie hat Dir dieser Artikel gefallen?

1 Stern2 Sterne3 Sterne4 Sterne5 Sterne (Noch keine Bewertungen)
Loading...

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert