Sterownik PWM – #6 – Problem z odczytem wartości ADC z wykorzystaniem DMA w procesorze STM32G0

Na rozgrzewkę:

W projekcie zbieram pomiar z 12 kanałów ADC, więc użyłem do tego DMA. Po wielu próbach uruchomienia DMA natknąłem się na wpis ST Community o błędzie w bibliotece HAL dotyczącym właśnie DMA. We wpisie chcę pokazać Ci jak rozwiązać problem, aby oszczędzić Ci czasu podczas tworzenia swoich projektów.

Zakres wpisu:

  • Opis problemu
  • Rozwiązanie problemu

Opis problemu:

Po skonfigurowaniu ADC współpracującego z DMA w sposób przedstawiony na Rys. 1 pomiar się nie uruchamiał. 

Zmieniając konfigurację ADC, na taką bez użycia DMA odczyt zaczął działać poprawnie. Po tym teście byłem pewny, że problem jest z DMA. Zacząłem przeglądać Internet i natknąłem się na rozwiązanie wspomnianego problemu na ST Community [1].

Rozwiązanie problemu:

Przyczyną, dlaczego DMA nie działało, był błąd w inicjalizacji peryferiów. Żeby DMA działało poprawnie, musi być zainicjalizowane jako drugie w kolejności. Kolejność inicjalizacji można sprawdzić w CubeIDE w zakładce Project Manager –> Advanced Settings. 

W istniejącym projekcie można rozwiązać problem zgodnie z poniższymi krokami:

  • zamknąć otwarty projekt w CubeIDE,
  • otworzyć plik projektu z rozszerzeniem ioc poprzez Notatnik,
  • znaleźć i usunąć linijkę: ProjectManager.functionlistsort,
  • zapisać ioc w Notatniku,
  • otworzyć projekt za pomocą CubeIDE,
  • sprawdzić czy inicjalizacja wygląda jak na Rys. 2.

Podsumowanie:

Mam nadzieję, że przy pomocy tego wpisu oszczędzisz czas na szukanie błędu w projekcie wykorzystującym DMA.

[1] Dostęp w Internecie: https://community.st.com/s/question/0D53W00001EzCmCSAV/mxdmainit-order-in-the-mainc-file-generated-by-stm32cubemx-how-to-fix

Autor artykułu
Mateusz Pluta

2 Replies to “Sterownik PWM – #6 – Problem z odczytem wartości ADC z wykorzystaniem DMA w procesorze STM32G0

  1. Z tą kolejnością to zawsze są jaja 😀 Ale jak człowiek chociaż raz spędi 3 dni na debugowaniu to się nauczy raz na zawsze 🙂

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.