Skocz do zawartości

Kurs STM32L4 - USB


padus

Pomocna odpowiedź

Prosto, zwięźle i na temat. Dzięki za odpowiedź. 

Czy  autorzy przewidują w tym kursie odcinek dotyczący portu USB? Chodzi mi o to, że chciałbym się podłączyć do procesora nie poprzez przejściówkę i USART2 ale bezpośrednio poprzez USB. Nigdy tego nie robiłem, podejrzewam, że jest jakaś biblioteka na procesor oraz sterowniki do PC z wirtualnym COM'em.

Link do komentarza
Share on other sites

@padus w ramach tego kursu nie poruszamy tematyki USB, ale nie wykluczone, że temat ten pojawi się w ewentualnej kontynuacji 😉 Jeśli jesteś mocno zainteresowany USB to zerknij do naszego starego, zarchiwizowanego kursu STM32F4 - tam pojawił się przykład wykorzystanie USB. Uprzedzam jednak, że jest to stary materiał i część informacji może być już nieaktualna (dlatego kurs został zarchiwizowany).

  • Lubię! 1
Link do komentarza
Share on other sites

Pozwoliłem sobie wydzielić ponieważ temat jest dość ciekawy i można coś tu dodać. Link do tematu, z którego został wydzielony:

@padus Niedawno próbowałem swoich sił w podłączeniu STM32 do komputera jako myszy wiec mogę coś podpowiedzieć. Nie jeste mspecjalistą ale działa 🙂

Pierwszy problem to że potrzebujesz oscylator HSE - kwarc X3 8MHz, którego nie masz wlutowanego fabrycznie na płytce.

image.thumb.png.31910505e8dd7bbedba9ed99767d63b8.png

Jak przylutujesz (uwaga na pady zworek, które łatwo oderwać...) to wchodzisz w RCC i ustawiasz HSE:

image.thumb.png.0c0967d029455e4adab17ad04fa946c0.png

Ustawienia USB

image.thumb.png.bd381c0d0cd57a525efe05c07504ef32.png

Clock config:

image.thumb.png.3b834e8d086eab3883518ef8713da5df.png

Middleware -> wybierz HID

image.thumb.png.e39b856df1bbca2912379dba9aefc0b0.png

Tylko problem... na płytce nie ma dodatkowego USB. Więc trzeba zrobić swoje. Tu podpatrzyłem ze schematu STM32F3 Discovery, złącze i kilka rezystorów:

image.thumb.png.6705f67e34a3fa1e16d2263402925ff7.png

Diody możesz sobie dla testu darować, bo zasilanie masz z mini USB. Podłączasz złącze USB możliwie blisko wyprowadzeń - na luźnych kabelkach mogą być problemy. U mnie to wygląda tak...

image.thumb.png.d93619975e359df1b22b502bbd7977d1.png

Domyślnie deskryptor dotyczy prac w roli myszy, możesz to sprawdzić w pliku usbd_hid.c:

/* USB HID device Other Speed Configuration Descriptor */
__ALIGN_BEGIN static uint8_t USBD_HID_OtherSpeedCfgDesc[USB_HID_CONFIG_DESC_SIZ] __ALIGN_END =
{
  0x09,                                               /* bLength: Configuration Descriptor size */
  USB_DESC_TYPE_CONFIGURATION,                        /* bDescriptorType: Configuration */
  USB_HID_CONFIG_DESC_SIZ,                            /* wTotalLength: Bytes returned */
  0x00,
  0x01,                                               /* bNumInterfaces: 1 interface */
  0x01,                                               /* bConfigurationValue: Configuration value */
  0x00,                                               /* iConfiguration: Index of string descriptor describing the configuration */
#if (USBD_SELF_POWERED == 1U)
  0xE0,                                               /* bmAttributes: Bus Powered according to user configuration */
#else
  0xA0,                                               /* bmAttributes: Bus Powered according to user configuration */
#endif
  USBD_MAX_POWER,                                     /* MaxPower 100 mA: this current is used for detecting Vbus */

  /************** Descriptor of Joystick Mouse interface ****************/
  /* 09 */
  0x09,                                               /* bLength: Interface Descriptor size */
  USB_DESC_TYPE_INTERFACE,                            /* bDescriptorType: Interface descriptor type */
  0x00,                                               /* bInterfaceNumber: Number of Interface */
  0x00,                                               /* bAlternateSetting: Alternate setting */
  0x01,                                               /* bNumEndpoints */
  0x03,                                               /* bInterfaceClass: HID */
  0x01,                                               /* bInterfaceSubClass : 1=BOOT, 0=no boot */
  0x02,                                               /* nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse */
  0,                                                  /* iInterface: Index of string descriptor */

W linii:

 0x02,                                               /* nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse */

Masz dalej w tym pliku deskryptor podstawowej konfiguracji myszy:

__ALIGN_BEGIN static uint8_t HID_MOUSE_ReportDesc[HID_MOUSE_REPORT_DESC_SIZE] __ALIGN_END =
{
  0x05,   0x01,
  0x09,   0x02,
  0xA1,   0x01,
  0x09,   0x01,

  0xA1,   0x00,
  0x05,   0x09,
  0x19,   0x01,
  0x29,   0x03,

  0x15,   0x00,
  0x25,   0x01,
  0x95,   0x03,
  0x75,   0x01,

  0x81,   0x02,
  0x95,   0x01,
  0x75,   0x05,
  0x81,   0x01,

  0x05,   0x01,
  0x09,   0x30,
  0x09,   0x31,
  0x09,   0x38,

  0x15,   0x81,
  0x25,   0x7F,
  0x75,   0x08,
  0x95,   0x03,

  0x81,   0x06,
  0xC0,   0x09,
  0x3c,   0x05,
  0xff,   0x09,

  0x01,   0x15,
  0x00,   0x25,
  0x01,   0x75,
  0x01,   0x95,

  0x02,   0xb1,
  0x22,   0x75,
  0x06,   0x95,
  0x01,   0xb1,

  0x01,   0xc0
};

Funkcja do przygotowania bufora do wysłania:

static void Mouse_Data_Send(uint8_t* buff, uint8_t button, int8_t Cursor_Move_X, int8_t Cursor_Move_Y, int8_t Scrool_Value)
{
    buff[1] = 0x00; buff[2] = 0x00; buff[3] = 0x00; buff[4] = 0x00;
    //Lub memset memset(buff, 0x00, 4);
    if(Cursor_Move_X <= 127 && Cursor_Move_Y >= (-127) && Cursor_Move_X <= 127 && Cursor_Move_Y >= (-127))
    {
    	buff[1]=Cursor_Move_X;
    	buff[2]=Cursor_Move_Y;
    }
    else
    {
    	buff[1]=0;
    	buff[2]=0;
    }

    buff[0] = button;
}

Dalej mamy bardzo wygodną funkcję do komunikacji:

USBD_HID_SendReport(&hUsbDeviceFS,HID_Buffer,4);

I przykładowy program kręcący kursorem:

  /* USER CODE BEGIN WHILE */

  float mx0 = 0.0, my0 = 0.0, mx1, my1;
  float rad = 0.0, theta = 0.0;

  while (1)
  {
	  theta += 20.0/250.0;
	  rad = 90.0*cos(theta * 4.0);

	  mx1 = (int)(rad*cos(theta));
	  my1 = (int)(rad*sin(theta));

	  Mouse_Data_Send(HID_Buffer, 0x00, (int)(mx1-mx0), (int)(my1-my0), 0x00);
	  USBD_HID_SendReport(&hUsbDeviceFS,HID_Buffer,4);

	  mx0 = mx1;
	  my0 = my1;

	  HAL_Delay(20);

    /* USER CODE END WHILE */

Wgrywamy, podłaczamy:

image.thumb.png.90457962c703f85d390cfdba2fcfbf16.png

I efekt jest taki:

image.thumb.png.5a38b48645c9e2f891d860755b226460.png

 

Edytowano przez Gieneq
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

1 godzinę temu, Gieneq napisał:

Pierwszy problem to że potrzebujesz oscylator HSE - kwarc X3 8MHz, którego nie masz wlutowanego fabrycznie na płytce.

Nie zawsze potrzebujesz - np. STM32L432KBU6 obsługuje USB bez kwarcu. Ale to tylko taka luźna dygresja.

https://oshwlab.com/business/stm32er3_copy

Może nie jest to najlepszy przykład, ale jest tam ogarnięte USB (CDC) bez użycia kwarcu.

  • Lubię! 1
Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.