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

STM32F407 - Jak ustawić priorytet przerwania dla EXTI5 i wyższych?

drzasiek 26 Wrz 2012 12:57 2103 15
REKLAMA
  • #1 11349895
    drzasiek
    Specjalista CNC
    Posty: 2212
    Pomógł: 106
    Ocena: 3233
    Nie wiem, czy z pośpiechu czy z głupoty, ale nie mogę znaleźć rozwiązania.
    Pacjent to STM32F407.
    Problem: Chcę ustawić priorytet przerwania zewnętrznego od PE5.
    Nie ważne, czy używam do tego funkcji CMSIS, ja akurat robię to na piechotę.
    Ale zarówno jako argument np funkcji NVIC_EnableIRQ() albo bezpośrednio do rejestru
    NVIC->ISER[x]
    czy też jako indeks
    NVIC->IP[]
    muszę podać numer przerwania.
    No ale jak tu podać numer przerwania od EXTI5 skoro definicje kończą się na EXTI4?
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    A numer 11 to już DMA..

    Pewnie jak zwykle przy takich pytaniach bywa, jakiś prosty szczegół mi umyka.
    Proszę o naprowadzenie.
  • REKLAMA
  • Pomocny post
    #2 11349961
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    Ale Ty tak na poważnie pytasz?

    P.S. Numeru przerwania nie polecam stosować jako indeksu dla rejestrów ISER/ICER...

    4\/3!!
  • REKLAMA
  • #3 11349998
    drzasiek
    Specjalista CNC
    Posty: 2212
    Pomógł: 106
    Ocena: 3233
    Freddie Chopin napisał:
    Ale Ty tak na poważnie pytasz?

    Wnioskując po tym zdaniu, rozwiązanie jest bardzo proste a ja palnąłem jakąś głupotę.
    Więc jeszcze raz, a Ty jeśli możesz to powiedz mi gdzie robię tą gafę.
    Rejestr NVIC->ISERx to tablica składająca się z Trzech 32 bitowych rejestrów a więc łącznie 96 bitów.
    Przerwania o numerach 0-31 włączamy w NVIC->ISER[0], 32-63 w NVIC->ISER[1] a wyższe w NVIC->ISER[2];
    Jeśli ustawiam przerwania o numerach 0-31 to mogę stosować do tego numer przerwania.
    Więc jeśli chcę włączyć przerwanie od ADC (ma numer 18) to piszę tak:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    jeśli chcę włączyć od EXTI2 to piszę tak:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    A co jeśli chcę od EXTI5? Nie ma ono numeru? No gdzie ta gafa?
  • REKLAMA
  • Pomocny post
    #4 11350012
    gaskoin
    Poziom 38  
    Posty: 4159
    Pomógł: 436
    Ocena: 102
    To zjedź niżej do 23. Nie wiem co Cię skłoniło do nieprzeczytania dalszej części tej listy :)
  • Pomocny post
    #5 11350025
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    Przez czas jak pisałeś te dwa posty już ze 4x przejrzałbyś CAŁĄ listę przerwań, bo nie wiem skąd założenie, że koniecznie muszą być po kolei.

    P.S. Co złego jest w funkcji z CMSISa robiącej to samo co Ty tylko czytelniej? Przy okazji jak być jej użył, to nie robiłbyś zupełnie bezsensownego ORa...

    P.S.2. Funkcja z CMSIS jest typu inline - nie da się tego zrobić bardziej optymalnie.

    4\/3!!
  • #6 11350064
    drzasiek
    Specjalista CNC
    Posty: 2212
    Pomógł: 106
    Ocena: 3233
    O żesz.. :oops:
    Teraz powinienem się zapaść pod ziemię..
    Tak jak przeczuwałem, powodem zadawania takich pytań jest pośpiech lub głupota..
    W moim przypadku to chyba tylko głupota.
    Freddie Chopin napisał:
    Przez czas jak pisałeś te dwa posty już ze 4x przejrzałbyś CAŁĄ listę przerwań, bo nie wiem skąd założenie, że koniecznie muszą być po kolei.

    No właśnie mam taką robotkę w domu cały dzień, z przerwami 2-3 minutowymi co ok 5 minut stąd moje marne skupienie...
    Jakbym siadł nad tym, i tylko nad tym to bym wkońcu przejrzał całą listę.
    No ale to mnie i tak nie tłumaczy..

    Freddie Chopin napisał:

    P.S. Co złego jest w funkcji z CMSISa robiącej to samo co Ty tylko czytelniej? Przy okazji jak być jej użył, to nie robiłbyś zupełnie bezsensownego ORa...

    P.S.2. Funkcja z CMSIS jest typu inline - nie da się tego zrobić bardziej optymalnie.

    4\/3!!


    To nie jest kwestia tego, czy w funkcji CMSIS jest coś złego.
    Ja zrobiłem bezsensownego ora tylko w przykładzie, funkcja CMSIS robi za to bezsensownego anda i o jedno bezsensowne przesunięcie bitowe więcej :)
    Nie ważne w moim przypadku, to był tylko przykład.
    Wybór numeru EXTI i portów nie był przypadkowy, mają się one zmieniać dynamicznie w programie dostosowując wg pewnej zmiennej, więc będzie tylko coś na zasadzie xx=yy.
    Tzn tak być miało, stąd moje złudne założenie że numer przerwania od EXTI5 będzie zaraz po numerze przerwania od EXTI4.
    Pewnie dlatego, że tak bardzo chciałem, żeby tak było to tam tego szukałem.
    Teraz sprawa się nieco komplikuje, ale to nie problem.
    Dzięki za pomoc :)
  • #7 11350087
    gaskoin
    Poziom 38  
    Posty: 4159
    Pomógł: 436
    Ocena: 102
    Nie robi, bo kompilator to zwija do odpowiedniej liczby podczas kompilacji. Chyba, że ktoś ma zmienne przerwania w co wątpię.

    ISER to rejestr tylko do ustawiania, wpisywanie tam zer jest równoważne ze zrobieniem niczego.
  • #8 11350091
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    drzasiek napisał:
    Ja zrobiłem bezsensownego ora tylko w przykładzie, funkcja CMSIS robi za to bezsensownego anda i o jedno bezsensowne przesunięcie bitowe więcej

    Biorąc pod uwagę fakt, że 99,666% przypadków użycia tej funkcji to stały parametr, myślę że optymalizator sobie z tymi przesunięciami poradzi.

    drzasiek napisał:
    Teraz sprawa się nieco komplikuje, ale to nie problem.

    Komplikacja jest minimalna - rozwiązaniem tego typu problemów jest tablica gdzie "ciągłym" parametrem jest indeks.

    4\/3!!
  • REKLAMA
  • #9 11350110
    drzasiek
    Specjalista CNC
    Posty: 2212
    Pomógł: 106
    Ocena: 3233
    gaskoin napisał:
    Nie robi, bo kompilator to zwija do odpowiedniej liczby podczas kompilacji. Chyba, że ktoś ma zmienne przerwania w co wątpię.

    Freddie Chopin napisał:

    Biorąc pod uwagę fakt, że 99,666% przypadków użycia tej funkcji to stały parametr, myślę że optymalizator sobie z tymi przesunięciami poradzi.


    Kompilator zrobi z tego liczbę, przy kompilacji.
    A ja właśnie przerwania zmieniam ciągle, w trakcie działania programu.
    Więc kompilator tu już nie pomoże.

    Freddie Chopin napisał:

    Komplikacja jest minimalna - rozwiązaniem tego typu problemów jest tablica gdzie "ciągłym" parametrem jest indeks.

    4\/3!!

    Dlatego też napisałem:
    drzasiek napisał:
    Teraz sprawa się nieco komplikuje, ale to nie problem.

    Z dużym naciskiem na:
    drzasiek napisał:
    ale to nie problem.

    :]
  • #10 11350120
    gaskoin
    Poziom 38  
    Posty: 4159
    Pomógł: 436
    Ocena: 102
    drzasiek napisał:
    gaskoin napisał:
    Nie robi, bo kompilator to zwija do odpowiedniej liczby podczas kompilacji. Chyba, że ktoś ma zmienne przerwania w co wątpię.

    Freddie Chopin napisał:

    Biorąc pod uwagę fakt, że 99,666% przypadków użycia tej funkcji to stały parametr, myślę że optymalizator sobie z tymi przesunięciami poradzi.


    Kompilator zrobi z tego liczbę, przy kompilacji.
    A ja właśnie przerwania zmieniam ciągle, w trakcie działania programu.
    Więc kompilator tu już nie pomoże.


    Chłopie zlituj się :) Przecież nie będziesz tam podawał zmiennego parametru.
  • #11 11350154
    drzasiek
    Specjalista CNC
    Posty: 2212
    Pomógł: 106
    Ocena: 3233
    Ok, polemizować z wami to chyba rzeczywiście nie jest dobry pomysł :)
    Najwyżej się można jeszcze bardziej pogrążyć :D
    Chciałem powiedzieć, że mam coś takiego:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    gdzie:
    iser jest zmienną, która tak czy siak w programie istnieje, bo wykorzystuję ją dodatkowo jako flagę.
    iser jest zmienną ciągle modyfikowaną w programie.
    Oczywiście, mógłbym tą zmienną tak zapisywać, aby była numerem przerwania a nie jego wartością bitową i wykorzystać ją jako argument funkcji NVIC_EnableIRQ(), ale strasznie mi pasowała ta wartość bitowa przy okazji jako argument innej funkcji, wyświetlającej źródło wyzwalacza na ekranie oraz funkcja modyfikująca tą zmienną również tak jest napisana.
    Stąd takie a nie inne podejście.
    Wszystko można zmienić, ale wtedy byłoby kilka dodatkowych rzeczy do zmiany w moim programie.
  • #12 13066469
    mgiro
    Poziom 22  
    Posty: 635
    Pomógł: 1
    Ocena: 30
    Witam,

    Podłącze się do tematu. Do każdego z EXTI jest podłączone kilka portów np. EXTI0 to PA0, PB0 itd. To dla każdej rodziny chyba tak samo jest. Pytam odnośnie F1.

    Teraz chcemy wykorzystać przerwanie od PA0 i PB0. Jak w przerwaniu rozpoznać, z którego portu (A czy B) przyszło przerwanie?

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #13 13066489
    BlueDraco
    Specjalista - Mikrokontrolery
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    To proste - przerwanie przyszło z tego portu, który ustawiłeś jako źródło przerwania EXTI0. ;)
  • #14 13066598
    mgiro
    Poziom 22  
    Posty: 635
    Pomógł: 1
    Ocena: 30
    Ale chyba mogę ustawić, że źródłami przerwań będą nóżki PA0 oraz PB0. Wiec wówczas jak rozpoznać, z której nożki przyszło przerwanie?
  • #15 13066627
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    mgiro napisał:
    Ale chyba mogę ustawić, że źródłami przerwań będą nóżki PA0 oraz PB0.

    To spróbuj i daj nam znać jak to zrobić.

    4\/3!!
  • #16 13066680
    mgiro
    Poziom 22  
    Posty: 635
    Pomógł: 1
    Ocena: 30
    ok, to w tym przypadku jest zbędna linijka kodu:

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


    można od razu wyczyścić flage, ponieważ wiemy, że przerwanie przyszło od linii 0. Dobrze rozumiem?

Podsumowanie tematu

LABEL_AI_GENERATED
Użytkownik STM32F407 ma problem z ustawieniem priorytetu przerwania zewnętrznego dla EXTI5, ponieważ nie może znaleźć odpowiedniego numeru przerwania, gdyż definicje kończą się na EXTI4. W odpowiedziach wyjaśniono, że rejestr NVIC->ISER składa się z trzech 32-bitowych rejestrów, a przerwania są podzielone na grupy. Użytkownik został również zachęcony do korzystania z funkcji CMSIS, która upraszcza proces ustawiania przerwań. Dodatkowo, poruszono temat rozpoznawania źródła przerwania, gdy wiele portów jest podłączonych do jednego EXTI, co wymaga sprawdzenia, z którego portu przerwanie faktycznie pochodzi.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA