logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[STM32F4] Makefile, skrypt linkera i startup dla stm32f4 - przerwania

maciej_zar 07 Mar 2017 17:10 1905 15
REKLAMA
  • #1 16329472
    maciej_zar
    Poziom 7  
    Posty: 13
    Cześć i czołem.
    Od dwóch tygodni walczę na noże z stmem 32f429 i nie bardzo chce cokolwiek działać.
    Problem jest dość trywialny: nie działają przerwania. Jedynie projekt wygenerowany przy pomocy CubeMX'a potrafi zrobić przerwania, ale znowu nie chce przyjmować klas etc. Zresztą, wolę unikać tego narzędzia, wolę rozumieć co gdzie jest i dlaczego.

    Próbuję skonfigurować eclipse, aby zwykłe przerwanie od przycisku działało. Niestety bezskutecznie.
    Przy debugowaniu projektu po wciśnięciu przycisku procek idzie w krzaki, nawet nie wskazuje które - po prostu nic.

    Mój kod na rejestrach do włączania przerwania etc działa - jak udało mi się w CubeMX wygenerować projekt, w którym działały przerwania, to po wklejeniu mojego kodu ciągle działały, czyli okej.
    Znalazłem startup file, z całym wektorem przerwań dostosowanym do mojego procka.
    Skrypt linkera brałem zarówno z projektu z CubeMX jak i z bibliotek stdperiph, na nic.

    Czy możecie mnie naprowadzić na jakąś stronę/skrypt/tutorial jak ustawic Eclipse, żeby to działało? Ewentualnie mogę na czystym kompilatorze robić, bez znaczenia, byleby działało. Szukam wiedzy, niestety moje poszukiwania są bezskuteczne...

    Z góry dzięki za pomoc...
  • REKLAMA
  • #2 16329481
    08FEDRA
    Poziom 13  
    Posty: 110
    Pomógł: 4
    Ocena: 43
    U Freddiego znajdziesz co nieco:
    Link
  • #3 16329543
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    Ponieważ w całym poście jedyną wartą uwagi informacją jest to:

    maciej_zar napisał:
    nie chce przyjmować klas


    to obstawiam że używasz C++. W takim razie gotów jestem się założyć, że nie masz nigdzie przy przerwaniach:

    extern "C" void nazwa_IRQHandler()
    {...}


    Bez owego >extern "C"< przerwania definiowane w plikach C++ nie zadziałają (jeśli tablica wektorów jest w plikach C lub assembler, a zwykle jest).

    Innej pomocy nie ma, bo nie wrzuciłeś kodu.
  • REKLAMA
  • #4 16329642
    maciej_zar
    Poziom 7  
    Posty: 13
    Dobra,

    Zabrałem się do roboty od początku, pobrałem przykład do STM32F407 ze strony Freeddie'go, w Eclipse wrzuciłem Import -> Existing Projects into Workspace.
    Eclipse znalazł tam projekt stm32f4_blink_led, super.
    Zainstalowałem według zaleceń GNU Coreutils.

    Dwie rzeczy teraz do rozwiązania:
    1. Nie widzi stdint.h -> jak mu powiedzieć, gdzie to siedzi?
    2. Jak daję build, to wyrzuca błąd make: Interrupt/Exception caught (code = 0xc00000fd, addr = 0x4217b3).

    Jak będzie budował podstawowy projekt to będę wrzucał kod, jakby coś dalej nie chciało działać.
    Pozdrawiam i dzięki wielkie!

    EDIT: stdint.h znalazłem w katalogu kompilatora, także to ogarnięte.
  • #5 16329988
    Konto nie istnieje
    Konto nie istnieje  
  • #6 16330108
    grko
    Poziom 33  
    Posty: 1386
    Pomógł: 247
    Ocena: 141
    @Piotrus_999 Może od razu napiszesz standardowy wywód na temat wyższości SW4STM32 zamiast zadawać tego typu pytania. Autor wyraźnie napisał:

    Cytat:
    Zresztą, wolę unikać tego narzędzia, wolę rozumieć co gdzie jest i dlaczego.


    @maciej_zar Zamiast tych GNU Coreutils (z tego co wiem to jest tam nieco stara wersja tego) zainstaluj sobie MSYS2 albo przesiądź się na Linuxa jak nie masz oporów do tego systemu. Na początek wywołaj sobie make z linii komend MSYS2.

    Tu masz instrukcję kolegi FCh:
    http://distortos.org/documentation/arm-toolchain-windows/
  • #7 16330285
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    Tak, proponuję zainstalować środowisko wg nowego opisu dla RTOSa, czyli z linku który wrzucił powyżej grko. Czyli MSYS2 zamiast bardzo starej paczki z mojej stronki. Albo Linux <:

    Niemniej jednak nie wiem czy na pewno rozwiązujesz ten problem który miałeś oryginalnie, ponieważ używanie przerwań nie ma _NIC_ wspólnego z makefilem, bardzo mało wspólnego ze skryptem linkera (który albo jest totalnie zły i wtedy przerwania nie będą działać, albo jest dobry i wtedy będą działać) i w sumie ze startupem też...

    Możesz się oprzeć na przykładzie dla STM32F4 z mojej stronki - jest nieco stary, ale generalnie działa OK. Konfigurację projektu zrób sobie lepiej od nowa wg opisu z http://distortos.org/documentation/creating-configuring-project-eclipse/ - pomijasz oczywiście części które Cię nie interesują, za to szczególnie zwróć uwagę na "Indexer configuration".

    No i może trochę więcej szczegółów - używasz C++ czy nie? Dałeś >extern "C"< przy przerwaniach które były zdefiniowane w plikach C++?
  • REKLAMA
  • #8 16331452
    maciej_zar
    Poziom 7  
    Posty: 13
    Cześć,

    Projekt zaraz będę konfigurował od początku.
    Fakt, podałem za mało danych, wybaczcie, skrajna nerwica mnie na to wzięła.
    Od początku:
    Używam SW4STM32, ale chciałbym od tego odejść mocno, bo za dużo automatów i za mało szczegółów, może dlatego, że nie potrafię tego wszystkiego ogarnąć. Kompilatora używałem poprzez naciśnięcie "build". W ustawieniach widzę, że to gcc arm none eabi 5.2.1.

    W projekcie chciałbym użyć C++, bo użycie klas jako takich ułatwi mi zakodowanie tego wszystkiego.
    W ostateczności może być C, ale skoro można w C++, to czemu by nie.

    Na początku kod ograniczał się do ustawienia clocków:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Potem ustawiałem sobie przerwanie od pinu PC13 (przycisk na płytce nucleo) oraz nóżkę PB7 jako wyjście do migania diodką.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    No i funkcja realizująca przerwanie:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    i skrypt linkera:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Dzięki za zainteresowanie tematem!
  • #9 16331458
    Konto nie istnieje
    Konto nie istnieje  
  • #10 16347725
    maciej_zar
    Poziom 7  
    Posty: 13
    @Piotrus_999: Tak, wiem, czytałem, ale najprościej jest sprawdzić, czy przerwanie działa i czy do niego wchodzi (po prostu led'a zapalić w przerwaniu, tyle).

    Po wywaleniu SW4STM i zainstalowaniu czystego Eclipse i skonfigurowaniu według tutoriala od kolegi Freediego przerwania od linii zewnętrznych śmigają aż miło.
    Źródłem przerwania jest ekran dotykowy na scalaczku XPT2046. Chciałbym z nim porozmawiać po SPI, jednak bezskutecznie (coś peszek z tymi STMami u mnie się trzyma)

    Skonfigurowałem piny oraz SPI2 następującym kodem:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    CS software'owy, stm ma być masterem, fpclk/128.

    Konfiguracja przerwania od linii 13:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Jako, że korzystam z płytki Nucleo to usunąłem wszelkie połączenia do innych peryferiałów na tych pinach. Niestety komunikacja nie bardzo działa. Funkcje do obsługi wyświetlacza:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Kod zaczerpnąłem z masy przykładów dostępnych w internecie, zmodyfikowałem na moje potrzeby.

    W przerwaniu odczytuję pozycję X orazy Y dotknięcia poprzez funkcję read_x oraz read_y.

    Podpiąłem pod linie sygnałowe analizator stanów logicznych, CS jest ustawiany prawidłowo, jednakże na CLK oraz MOSI panuje całkowita cisza. Ponadto, układ XPT2046 "odpowiada" na stan logiczny CS'a przepisując go na wyjście MISO.

    Gdzie mogę szukać przyczyny?
  • REKLAMA
  • #11 16347799
    el2010tmp
    Poziom 25  
    Posty: 713
    Pomógł: 97
    Ocena: 44
    maciej_zar napisał:
    GPIOB->AFR[1] |= 0101UL<<20;

    Jeśli chcesz w ten sposób ustawiać bity, to nie 0101UL<<20; tylko 0b0101<<20;
  • #12 16347819
    grko
    Poziom 33  
    Posty: 1386
    Pomógł: 247
    Ocena: 141
    BTW: binarne literały np 0b101 nie są częścią standardu języka. Warto o tym pamiętać.
    Moderowany przez piotrva:

    Usunięto zbędne fragmenty

  • #13 16347932
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    grko napisał:
    BTW: binarne literały np 0b101 nie są częścią standardu języka. Warto o tym pamiętać.

    Zależy którego, bo w C++14 są <:

    Dodano po 1 [minuty]:

    maciej_zar napisał:
    Gdzie mogę szukać przyczyny?

    Wszystkie piny od SPI mają być "alternate function output". Wszystkie. Czyli MISO, MOSI i SCK.
  • #14 16348370
    maciej_zar
    Poziom 7  
    Posty: 13
    Okej, dokształciłem się na temat UL, rozumiem gdzie błąd był.
    Jaka jest w takim razie optymalna metoda wpisywania wartości?
    Wyznaczyć wartość całego rejestru i wpisać np. AFR[0]=0x001B;
    Przesuwać jedynki w odpowiednie miejsca np. AFR[0] = 1<<2 | 1<<5 | 1<<6;
    Czy jeszcze jakaś inna metoda?
  • #15 16348399
    Konto nie istnieje
    Konto nie istnieje  

Podsumowanie tematu

✨ Użytkownik zmaga się z problemem braku działania przerwań w projekcie opartym na STM32F429, preferując ręczną konfigurację zamiast używania CubeMX. Po kilku próbach i błędach, w tym problemach z kompilacją w Eclipse, użytkownik odkrył, że przerwania w C++ wymagają użycia `extern "C"`. Po przejściu na czyste środowisko Eclipse i zastosowaniu odpowiednich ustawień, przerwania zaczęły działać. Użytkownik planuje używać SPI do komunikacji z układem XPT2046, jednak napotyka trudności w konfiguracji pinów i rejestrów SPI. Dyskusja obejmuje również porady dotyczące poprawnego ustawiania rejestrów oraz optymalnych metod ich konfiguracji.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA