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
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 🙂
Mam nadzieję, że ten wpis oszczędzi czas osobom chcącym używać DMA.