[PROJEKT] Rejestrator sygnałów analogowych na STM32 – jednokanałowy oscyloskop USB

Pierwszym plikiem, który zostanie zmodyfikowany będzie platform_config.h (tutaj i w kolejnych plikach w celach przejrzystości projektu zostaną usunięte fragmenty kodów, które dotyczą innych platform lub nie są wykorzystywane jak np. funkcja USART). Powinien on zawierać następujące elementy:

Ostatnie 3 wiersze z dyrektywą #define opisują wyprowadzenie PA0, które będzie służyło do sterowania włączeniem/wyłączeniem urządzenia z szyny USB. W pliku hw_config.c znajduje się funkcja USB_Interrupts_Config(), w której jest wybierana grupa priorytetów i konfigurowane samo  przerwania od modułu USB – należy to uwzględnić przy konfigurowaniu przerwań aplikacji użytkowej:

Dalej ważnym będzie określenie jakie endpointy urządzenia USB są dostępne w projekcie i w razie potrzeby ich zmodyfikowanie i/lub dodanie nowych (można to zrobić czytając sam kod projektu lub wykorzystać program testlibusb-win dostępny w pobranej bibliotece libusb-win32 do obsługi portu USB z poziomu PC. Gotowy projekt wirtualnego portu COM umożliwia komunikację z wykorzystaniem jednego z 4 endpointów:

  • Endpoint 0 IN oraz OUT jest wykorzystywany w procesie enumeracji, gdy urządzenie jest podłączane do komputera i konfigurowane,
  • Endpoint 1 IN, który jest przypisany do interfejsu 1 i który posiada adres 0x81, służy do wysyłania do komputera 64-bajtowych paczek (transmisja typu bulk),
  • Endpoint 2 IN, przypisany do interfejsu 0 pod adresem 0x82 z maksymalny rozmiarem wysyłanych do komputera paczek 8-bajtów (transmisja typu interrupt),
  • Endpoint 3 OUT, podobnie jak EP1 jest przypisany do interfejsu 1, ale posiada adres 0x03 i służy do odbierania z komputera 64-bajtowych paczek (transmisja typu bulk).

Do odbierania komend z komputera zostanie wykorzystany EP3_OUT, a do wysyłania danych do komputera będzie otwarty i skonfigurowany EP3_IN w celu przedstawienia sposobu w jaki można to zrobić. Pozostałe włączone już endpointynie będą wykorzystywane i mogą nie działać poprawnie przy próbie dostępu do nich z aplikacji PC.

W pliku usb_conf.h znajduje się poniższy fragment kodu:

Dla otwieranego EP3_IN należy jeszcze dodać następujący wiersz:

Powyższy adres wynika z tego, że EP3_OUT ma rozmiar 64 bajtów, a więc kończy się na adresie 0x150. Dalej w pliku znajduje się fragment kodu, w którym należy zakomentować te definicje endpointów które będąotwarte, czyli:

Teraz już można wykonać właściwe otwarcie EP3_IN dodając w funkcji Virtual_Com_Port_Reset() w pliku usb_prop.c następujący fragment:

oraz dodać wpis do deskryptora konfiguracji w tablicy Virtual_Com_Port_ConfigDescriptor[] pliku usb_desc.c zaraz za deskryptorem EP3_OUT:

Również należy zmienić rozmiar tej tablicy w pliku usb_desc.h dodając 7 bajtów:

Ostatnią czynnością przy konfiguracji komunikacji po USB i zahaczającą o kolejny etap projektu jest dodanie/modyfikacja callback’ów w pliku usb_endp.c. Należy tutaj wiedzieć, że wywołanie tychże callback’ów następuje po transmisji, czyli po zapisaniu/odczytaniu do/z endpointa danych. W obu przypadkach na końcu każdej takiej funkcji są umieszczane wywołania procedur zapisu kolejnych danych do wysłania, ustawieniu ich rozmiaru oraz aktywowanie gotowości endpointa do pracy. Callback od EP3_OUT wygląda następująco:

Do pobrania

O autorze