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

[STM32F446] STM32F446: Konflikt priorytetów DMA I2S i przerwań przycisków w odtwarzaczu audio

Soberro 18 Paź 2017 11:50 831 7
REKLAMA
  • #1 16764127
    Soberro
    Poziom 7  
    Posty: 29
    Ocena: 1
    Witam,
    jak w temacie programuję odtwarzacz audio. Korzystam z dekodera Helix, dane pobieram z karty uSD poprzez FAT i interfejs SDIO. Korzystam z DMA przy odczycie jak i przy przesyłaniu danych do I2S. Biblioteki z których korzystałem ustawiały priorytet DMA I2S na niski. Powodowało to problem z odtwarzaniem. Po zmianie priorytetu na wysoki(0 lub 1) udało się odpowiednio odtworzyć pliki mp3. Odtwarzanie muzyki działa dopóki priorytet DMA jest wyższy od priorytetu przerwań od przycisków, które obsługują wyświetlacz. Zatem albo mogę obsługiwać przyciski albo odtwarzać muzykę, a chciałbym dodać opcje przewijania piosenki oraz jej zmiany. Ustawienie obu priorytetów na równe sobie też powoduję że nie gra muzyka. Przepatrzyłem rejestry konfiguracyjne DMA i nie znalazłem żadnego który by sugerował na przykład przerwanie DMA przez inne przerwanie. Z góry dziękuję za pomoc.

    Pozdrawiam,
    Łukasz
  • REKLAMA
  • Pomocny post
    #2 16764163
    BlueDraco
    Specjalista - Mikrokontrolery
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    Sama fraza "priorytet przerwań od przycisków" sugeruje błąd koncepcyjny w projekcie, bo przycisków nie obsługuje się an przerwaniach. Z kolei priorytety DMA nie mają nic wspólnego z priorytetami przerwań, więc całość brzmi mocno podejrzanie. Moim zdaniem błąd w koncepcji całości powodujący kolejne błędy w implementacji programowej. Jeżeli używasz DMA tylko do odczytu z karty i transmisji do I2S, to powinno to działać dobrze niezależnie od priorytetów obu transmisji.
  • REKLAMA
  • #3 16764171
    Soberro
    Poziom 7  
    Posty: 29
    Ocena: 1
    Zatem powinienem obsługiwać przyciski w głównej pętli, lub w programie sprawdzać w odpowiednich momentach czy został któryś naciśnięty?
  • REKLAMA
  • #4 16764177
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • Pomocny post
    #5 16764197
    grko
    Poziom 33  
    Posty: 1386
    Pomógł: 247
    Ocena: 141
    @Piotrus_999 Te tajemnicze biblioteki są dostępne w internecie od ponad 10 lat bo sam używałem ich do pracy magisterskiej. Użycie google pozwoli Ci rozwikłać ta zagadkę.

    @Soberro Według mnie masz problem z problem z obsługą przerwań od przycisku. Byćmoże robisz tam coś czego nie powinieneś. Bez kodu nie da się więcej powiedzieć. Powinieneś zrezygnować (tak jak zostało wcześniej wspomniane) z przerwań od GPIO i zaimplementować polling +deboincing stanu GPIO np co 1ms. Możesz to zrobić w tym przerwaniu od timera albo w pętli głównej (jak jest nieblokująca) albo w oddzielnym zadaniu jak używasz RTOSa.
  • #6 16764209
    Konto nie istnieje
    Konto nie istnieje  
  • Pomocny post
    #7 16764220
    grko
    Poziom 33  
    Posty: 1386
    Pomógł: 247
    Ocena: 141
    @Piotrus_999 czytanie ze zrozumieniem sie kłania. Proszę: http://bfy.tw/EXOL
  • #8 16765777
    Soberro
    Poziom 7  
    Posty: 29
    Ocena: 1
    Zmieniłem obsługę przycisków z generowania przerwań na sprawdzanie ich stanów w przerwaniu timera. Oczywiście wydaje mi się, że mogłem pomylić pojęcia priorytetu przerwań DMA, a priorytet DMA. Człowiek się uczy całe życie, a z ARM'em mam styczność dopiero od ponad miesiąca. Dodatkowo dodałem sprawdzanie stanów przycisków przed uzupełnianiem bufora do odtworzenia. Dziękuję wszystkim za pomoc.

Podsumowanie tematu

✨ Użytkownik programuje odtwarzacz audio oparty na STM32F446, wykorzystując dekoder Helix oraz interfejs SDIO do odczytu danych z karty uSD. Napotkał problem z priorytetami DMA dla I2S oraz przerwaniami od przycisków, co uniemożliwiało jednoczesne odtwarzanie muzyki i obsługę przycisków. Po zmianie priorytetu DMA na wysoki, odtwarzanie plików mp3 działało, ale występowały konflikty z przerwaniami przycisków. Użytkownicy zasugerowali, aby zamiast przerwań od GPIO, zastosować polling oraz debouncing w pętli głównej lub w przerwaniu timera. Użytkownik wprowadził zmiany, rezygnując z przerwań dla przycisków i implementując sprawdzanie ich stanów w przerwaniu timera, co poprawiło działanie odtwarzacza.
Wygenerowane przez model językowy.
REKLAMA