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

STM32F303 + ADC+DMA problem z odczytem zmierzonej wartości

snow 07 Sie 2019 19:14 825 7
REKLAMA
  • #1 18102794
    snow
    Poziom 31  
    Posty: 1825
    Pomógł: 178
    Ocena: 201
    Próbuję uruchomić przetwornik do współpracy z DMA. Bez DMA wszystko działa ale przy użyciu DMA nie do końca.

    Przy pomocy CubeMX wygenerowałem taki oto kod:

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


    Przy debugowaniu wartość zmiennej adc_value [0] do której DMA wrzuca dane zmienia się zgodnie ze zmianą napięcia na wyjściu niestety nie zmienia się stan pinu LED_PIN.

    Z góry dziękuję za pomoc :)
  • REKLAMA
  • #2 18102932
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #3 18105104
    snow
    Poziom 31  
    Posty: 1825
    Pomógł: 178
    Ocena: 201
    atrybut volatile jak rozumiem dotyczy zmiennych?

    LED_PIN jest definicją:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    więc jak miałbym to zadeklarować jako volatile?
  • #4 18105728
    osctest1
    Poziom 21  
    Posty: 451
    Pomógł: 36
    Ocena: 74
    Raczej adc_value bo jest zmieniana w tle przez DMA. Tak że kompilator wyoptymalizuje odczyty bo nie widzi niczego co mogło by ją zmieniać.
  • REKLAMA
  • #5 18105775
    snow
    Poziom 31  
    Posty: 1825
    Pomógł: 178
    Ocena: 201
    Próbowałem też w volatile, wyłączyć optymalizację również.

    Próbowalem też robić:

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


    ale też nie było efektu. W STM Studio jak podglądam na żywo jak się zmieniają zmienne to adc_value[0] ciągle przyjmuje nowe wartości opowiadające zmianom napięcia na wejściu ale już zmienna adc ciągle miała wartość 0.

    Przyznam że pierwszy raz się spotykam z takim czymś i nie bardzo wiem gdzie robię błąd.

    Jak robię wszystko normalnie bez DMA:

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


    to wtedy jest ok, ale chciałem to zrobić z pomocą DMA.

    Jeszcze odnośnie mam DMA pytanie bo nie do końca znalazłem odpowiedź na pytanie czy jak DMA jest w trybie normalnym a nie circular i zostanie określony bufor DMA np. 10 próbek to zostanie zebrana tylko jedna próbka czy zapełniony zostanie bufor 10 próbek i po ostatniej próbce zatrzyma się zapis do bufora?
  • REKLAMA
  • #6 18105929
    osctest1
    Poziom 21  
    Posty: 451
    Pomógł: 36
    Ocena: 74
    10 próbek a dokładniej 10 transakcji DMA.

    Z HAL nie pomogę bo uważam że ADC i DMA łatwiej, lepiej a przede wszystkim przewidywalnie (bo wiesz co robisz, a nie tajemnicza biblioteka).
  • #7 18106488
    snow
    Poziom 31  
    Posty: 1825
    Pomógł: 178
    Ocena: 201
    Załączam projekt w Attolic'u. Może ktoś zerknie co może być nie tak.
    Załączniki:
    • F303_Watchdog.zip (909.36 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #8 18107920
    osctest1
    Poziom 21  
    Posty: 451
    Pomógł: 36
    Ocena: 74
    snow napisał:
    Załączam projekt w Attolic'u. Może ktoś zerknie co może być nie tak.
    W tym trybie musisz odpalać start konwersji poza przerwaniami w pętli (przerwania są konieczne bo masz nie cykliczny tryb DMA i po końcu wszystkich transmisji DMA się wyłącza). Jeżeli będziesz to robić w przerwaniach to się one "zapętlą" i kod poza przerwaniami nigdy się nie wykona)

    (pomijam nieistotne fragmenty) kod z stm32F746 (w F303 praktycznie tylko stream na channel musisz zamienić bo w tym kodzie nie ma nic skomplikowanego) bo akurat nie mam nic z F303 podłączonego.

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


    Do czegoś takiego należy użyć trybu CIRC. Jak widać dużo prościej. Jak to zrobić w HAL nie wiem.

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

Podsumowanie tematu

✨ Użytkownik ma problem z odczytem wartości z przetwornika ADC przy użyciu DMA w mikrokontrolerze STM32F303. Po włączeniu DMA, zmienna adc_value, która jest aktualizowana w tle przez DMA, nie przyjmuje oczekiwanych wartości, mimo że w trybie bez DMA wszystko działa poprawnie. Użytkownik próbował zadeklarować adc_value jako volatile oraz wyłączyć optymalizację, ale to nie przyniosło efektu. Inni uczestnicy dyskusji sugerują, aby zadeklarować adc_value jako volatile, aby zapobiec optymalizacji przez kompilator. Wskazano również, że w trybie normalnym DMA, bufor zostanie zapełniony 10 próbkami, a po ostatniej próbce zapis do bufora zostanie zatrzymany. Użytkownik został również poinformowany, że w trybie niecyklicznym DMA, konwersja musi być uruchamiana w pętli poza przerwaniami, aby uniknąć zapętlenia kodu.
Wygenerowane przez model językowy.
REKLAMA