Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

STM32 - USB przesiadka z uvision

kosster 01 Mar 2016 11:37 1395 12
  • #1
    kosster
    Level 12  
    Witam
    temat podobny do https://www.elektroda.pl/rtvforum/topic2327885-30.html,
    Lecz sprawa wygląda troszkę inaczej. Z racji tego, że atollic udostępnił wersję litte postanowiłem przesiąść się z keila. Dotychczas korzystałem z example usb hid na keila.
    W Atollicu skonfigurowałem sobie nowy procesor, wrzuciłem kod z uvision i po małych przeróbkach (dostosowanie do GCC), nawet się skompilował. Niestety podczas debugu procesor się nie uruchamia i siedzi sobie w Reset_Handler() at startup_stm32f10x_hd.s:76 0x80003f8.
    Odkryłem, że usunięcie if (USB_P_EP[num]) oraz USB_P_EP[num](USB_EVT_SETUP); itd z funkcji przerwania void USB_LP_CAN1_RX0_IRQHandler (void) powoduje, że procesor się uruchamia. Wpisanie na stałe numeru USB_EndPoint0(USB_EVT_SETUP) zamiast USB_P_EP[num](USB_EVT_SETUP); też nie pomaga. Wygląda jak by było za mało pamięci na stosie. Ale zwiększałem i to nic nie daje. W czym może być problem?
    Może dodam jak wyglądają pliki startowe
    Code: c
    Log in, to see the code


    i linker

    Code: c
    Log in, to see the code


    Dodam jeszcze gdzie jest problem:
    Code: c
    Log in, to see the code

    gdy za komentuję wszystkie USB_P_EP[num] to procek rusza.
    Ciekawe dla czego procesor nie rusza w ogóle, czy to urok atollica (nie pozwala ruszyć gdy coś jest nie tak?) Ciekawe, że nie wypisuje żadnych komunikatów o błędzie, ani ostrzeżeń. Czy ktoś jest w stanie w tym zakresie mi pomóc?

    Dodano po 1 [godziny] 25 [minuty]:

    A może ktoś z szanownych forumowiczów ma link do "zaciągnięcia" przykładu USB z hidem na Atollica.
  • #2
    tadzik85
    Level 38  
    A w Cubie albo SPLu nie ma przykładu?
  • #3
    kosster
    Level 12  
    Hm w cubie pewnie jest, ale jakoś nie jestem w stanie tego przezwyciężyć. Poziomy abstrakcji są fajne ale zupełnie niepotrzebnie pożerają zasoby uC.
    Moje urządzenie z kodem keila oczywiście odnajduje USB natomiast ten sam kod "przystosowany" (zmiany polegały głównie na dopasowaniu do standardu gcc) na atollicu ten kod nie działa. Czy oby tylko linker i startup jest w porządku? Dla czego powiększenie kodu w funkcji obsługi przerwania powoduje blokowanie i brak startu procesora? Jak można sprawdzić co może być powodem tego zachowania?

    Dodano po 1 [godziny] 16 [minuty]:

    Ciekawe, możliwe że zmiana "dostosowująca" kod nie spełnia swojego zadania:
    zresztą mam wrażenie, że zachowuje sie to tak jak by był problem z wyrównaniem pamięci. W keilu:
    Code: c
    Log in, to see the code


    W Atollicu zmieniłem z __packed na (__attribute__((__packed__)) :
    Code: c
    Log in, to see the code

    Niestety powoduje zakończenie wykonywania programu, i uC idzie sobie wiecznie odpoczywac
  • #5
    kosster
    Level 12  
    A dla czego? Pamiętam, że jak kiedyś przygotowywałem strukturę która miała różnej wielkości zmienne (1, 2 i 4 bajtowe), to przy wysyłce struktury nie były ułożone dokładnie jedne za 2 gimi tylko miały wyrównanie do 32 bitów.
    Ale to może kwestia kompilatora. Robiłem to w uvision.
    Jestem tak blisko uruchomienia, a nie mogę sobie poradzić...
    Usunąłem więc atrybuty wszędzie ale nadal jest tak samo.

    Nie mogę zrozumieć, dla czego gdy w przerwaniu wstawiam USB_EndPoint0(USB_EVT_SETUP); to w ogóle nie jestem w stanie uruchomić procesora. Po załadowaniu programu i rozpoczęciu debugu nie startuje procesor tylko wisi sobie na
    Reset_Handler() at startup_stm32f10x_hd.s:76 0x80003f8
  • #6
    Freddie Chopin
    MCUs specialist
    kosster wrote:
    A dla czego? Pamiętam, że jak kiedyś przygotowywałem strukturę która miała różnej wielkości zmienne (1, 2 i 4 bajtowe), to przy wysyłce struktury nie były ułożone dokładnie jedne za 2 gimi tylko miały wyrównanie do 32 bitów.
    Ale to może kwestia kompilatora. Robiłem to w uvision.


    Przy strukturach to co innego - tutaj argument __packed__ jest użyty po to, żeby rozwiązać problem niewyrównanego dostępu do pamięci (unaligned access) - bo np. odczytujesz 4 bajty z adresu który nie jest podzielny przez 4. Generalnie taki odczyt jest zawsze słabym pomysłem, jednak na ARM Cortex-M jest on możliwy (tyle że wolniejszy), więc atrybut __packed__ nie jest potrzebny. Przy tym wcale nie wiadomo, czy na pewno zrobi to samo co w Keilu (bo - jak sam zauważyłeś - częściej stosuje się go do struktur).

    kosster wrote:
    Nie mogę zrozumieć, dla czego gdy w przerwaniu wstawiam USB_EndPoint0(USB_EVT_SETUP); to w ogóle nie jestem w stanie uruchomić procesora. Po załadowaniu programu i rozpoczęciu debugu nie startuje procesor tylko wisi sobie na
    Reset_Handler() at startup_stm32f10x_hd.s:76 0x80003f8

    No to po prostu sprawdź co jest pod tym adresem. Może być też tak, że układ startuje, ale natychmiast się resetuje, po czym debugger zatrzymuje go znów w handlerze resetu.

    Te wszystkie środowiska są bezsensowne...
  • #7
    kosster
    Level 12  
    No tak faktycznie, w tym przypadku zgadza się :)
    Pod adresem jest:
    Code: text
    Log in, to see the code


    Ciekawe prawda?
    Najfajniejsze, że kompilacja przechodzi bez problemu. To jakie środowisko sugerujesz? Z Eclipsem podczas konfiguracji na windows miałem problemy, bo pomimo wielu starań nigdy nie udało mi się poprawnie skonfigurować środowiska.
  • Helpful post
    #8
    Freddie Chopin
    MCUs specialist
    kosster wrote:
    Najfajniejsze, że kompilacja przechodzi bez problemu. To jakie środowisko sugerujesz? Z Eclipsem podczas konfiguracji na windows miałem problemy, bo pomimo wielu starań nigdy nie udało mi się poprawnie skonfigurować środowiska.

    Jak nie wiesz jak coś skonfigurować to pytaj po prostu na forum.

    https://www.elektroda.pl/rtvforum/topic1313509.html
    https://www.elektroda.pl/rtvforum/topic1339518-0.html

    Raz się pomęczysz, a potem ta cała konfiguracja zajmuje jakieś 5 minut.
  • #9
    kosster
    Level 12  
    Super, jakoś udało mi się Eclipsa uruchomić fakt że w innej wersji Version: Mars Release (4.5.0) ale bez problemu spiąłem to.
    Przerzuciłem kod i co się okazało. Ruszył. Ale do szczęścia trochę brakuje, okazuje się, że nie rozpoznaje USB. Tzn ten sam dokładnie kod śmiga na Keilu, a na eclipse już nie.
    definicje:
    DEBUG
    USE_FULL_ASSERT
    TRACE
    OS_USE_TRACE_SEMIHOSTING_DEBUG
    STM32F10X_HD
    USE_STDPERIPH_DRIVER
    HSE_VALUE=8000000

    Wrzucam startup
    Code: c
    Log in, to see the code


    Code: c
    Log in, to see the code


    Generalnie nic się nie wysypuje, ale niestety nie widzi USB. W przerwanie wchodzi po podpieciu linii ale tak jak by deskryptorów nie wysyłał.
  • #10
    BlueDraco
    MCUs specialist
    Domyślny startup może np. źle konfigurować stos/stertę albo nie definiować nazw procedur obsługi przerwań, więc Twoje obsługi mogą się nie wywoływać.
  • #11
    kosster
    Level 12  
    W przerwanie obsługi na 100% wchodzi, bo widzę to pod debugiem, natomiast nie wysyła deskryptora. Tzn jestem przekonany, że jakiś problem jest w samym przygotowaniu danych albo wysyłce.
    Do tej funkcji dociera
    Code: c
    Log in, to see the code

    a że USB_MAX_PACKET0=16 a EP0Data.Count=18 to cnt ustawia na 16
    Następnie wchodzi w USB_WriteEP(0x80, EP0Data.pData, cnt);
    Code: c
    Log in, to see the code

    I tutaj przerzuca descryptor do ramu pod adres wskazywany przez wskaźnik *pv

    Czy to jest poprawne?
    Powinien też chyba dosłać zaległe 2 bajty.
  • #12
    kosster
    Level 12  
    Czy może mi ktoś podpowiedzieć o co chodzi? Wczoraj w Eclipsie robiłem testy, i nagle dzisiaj już to nie chodzi. Nie zmieniałem nic, uruchomiłem po prostu od nowa Eclipsa. Problem dotyczy zmiennych zadeklarowanych w przerwaniu
    void USB_LP_CAN1_RX0_IRQHandler (void) {
    DWORD istr, num, val;....}
    Które po przypisaniu po chwili znikają i mają wartość optimized out. Optymalizacja kodu jest na -0g.

    Dodano po 6 [minuty]:

    wiadomo jeśli wpiszę volatile to to działa (tzn przechowuje wartosć zmiennej), ale dla czego wczoraj to śmigało a dzisiaj już nie może w dni parzyste chodzi a w nieparzyste już nie...
    Zresztą zupełnie inaczej się zachowuje dzisiaj program niż wczoraj (tzn dużo gorzej -tak jak bym coś w ustawieniach pozmieniał)

    Dodano po 2 [godziny] 13 [minuty]:

    Małe sprostowanie, odnośnie działania/nie działania. Zmieniłem w strukturze

    Code: c
    Log in, to see the code

    i o dziwo wartości w zmiennych lokalnych w przerwaniu przechowują swoje wartości do końca trwania funkcji w której były zadeklarowane.
    Nie rozumiem dla czego to miało wpływ? Nie chce winy przewalać na kompilator, ale nie jest dla mnie ani jasna, ani logiczna ta sytuacja
    W windzie widać zaraportowane: The USB device returned an invalid USB configuration descriptor. W menadżerze urządzeń: nieprawidłowy deskryptor urządzenia.
  • #13
    kosster
    Level 12  
    Witam,
    sprawa się wyjaśniła. Problemem była obsługa EndPoint0, ponieważ było dużo dyrektyw #ifdef i to one powodowały problem w Atollicu (trochę dziwne - ale nie chce mi się tego testować, co było powodem). Po usunięciu ręcznym nie potrzebnych elementów, ruszyło i działa bez zastrzeżeń. Na Eclipsie dyrektywy były poprawnie rozpoznawane, natomiast problem dotyczył atrybutu __packed__ w jednej strukturze (po prostu go nie było). Struktura miała niepoprawną wielkość, a co za tym idzie, nie zgadzały się dane w wysyłce po USB.
    Z góry wszystkim dziękuje za pomoc. Problem został rozwiązany.