Skocz do zawartości
Komentator

Kurs STM32 F4 - #8 - Zaawansowane funkcje liczników

Pomocna odpowiedź

@BusKetZz witam na forum, cieszę się, że kursy są pomocne 🙂

Dla formalności dopytam - uruchamiasz kod identyczny jak ten z kursu i korzystasz z takiej samej płytki?

Udostępnij ten post


Link to post
Share on other sites

@Treker Zgadza się, uruchamiam identyczny kod (analizowałem kilka razy, do znudzenia, aby uzyskać pewność). Natomiast jeśli chodzi o płytkę, jest to: STM32F407xxx. Nie można powiedzieć, że taka sama, ale z tego co się orientuje procesor to LQFP100, a więc ten sam który jest wykorzystywany w kursie. Jak do tej pory, wszystkie przykłady działały bez zarzutu. Dzisiaj ponownie usiądę nad tym problemem, ale jeśli ktoś coś wie, to byłbym wdzięczny za dodatkową wiedzę 🙂

Udostępnij ten post


Link to post
Share on other sites

Chcialem polaczyc zagadnienie enkodera i PWM w jedno i sterowac jasnoscia diody za pomoca enkodera. Sam enkoder dziala mi prawidlowo lecz jak tylko dodaje na innym timerze funkcje PWM to cos psuje sie z wartosciami z enkodera i pulse_count oraz positions pokazuja duze wartosci nie zmieniajace się podczas krecenia galka enkodera.

Dlaczego tak sie dzieje i jak połączyc te dwie funkcje?

Udostępnij ten post


Link to post
Share on other sites

@danielbr3 ciężko doradzić bez wglądu w program oraz informacji na temat używanego zestawu. Widzę, że masz zarejestrowany zestaw do kursu F1, a to jest kurs F4. Nie wiem, więc z czego korzystasz 😉 Jeśli to pytanie nie jest bezpośrednio związane z kursem to załóż proszę osobny temat i opisz tam dokładnie swój problem.

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Cześć,

Co do tej części kursu, to znalazłem moim skromnym zdaniem ogromny babol w pierwszym programistycznym przykładzie, ale niekoniecznie związany z autorstwem kursu, a raczej CubeMXem. Niestety, użycie przerwania od timera systemowego jest niemożliwe w aktualnej wersji bibliotek generowanych w CubeMXie. Tu można znaleźć dyskusję na ten temat i jednocześnie sposób rozwiązania problemu (dodanie jednej linii kodu w pliku wygenerowanym przez Cube'a). Co ciekawe, z tego pomysłu ST, który rzekomo bug'iem nie jest, niezadowolonych jest baaaardzo wielu użytkowników CubeMXa ;D. I choć trochę deweloperzy ST w tym racji mają moim zdaniem, to jednak aż tak drastyczne kroki nie są na pewno mile widziane zwłaszcza w firmach pracujących na STMach.

Pozdrawiam

Edytowano przez PrimeSoul
  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
22 minuty temu, PrimeSoul napisał:

Niestety, użycie przerwania od timera systemowego jest niemożliwe w aktualnej wersji bibliotek generowanych w CubeMXie.

Praktycznie nigdy nie korzystam z  Callback jakiejkolwiek funkcji. Zawsze swój kod wstawiałem w

  /* USER CODE BEGIN SysTick_IRQn 0 */
 
  /* USER CODE END SysTick_IRQn 0 */

więc problemu nie mam. W Callback  trzeba sprawdzać źródło przerwania (np który uart wywołał przerwanie, który pin EXTI) a wstawiając swój kod w handler nie trzeba nic sprawdzać lub mniej niż w przypadku Callback.

Udostępnij ten post


Link to post
Share on other sites

Mam jeszcze jedną kwestię do tego odcinka poradnika.

Chodzi mi konkretnie o przykład z wygenerowaniem PWM przez DMA zamiast przekazania wypełnienia bezpośrednio do rejestru. Ostatnim razem to zostawiłem, bo nie chciało działać. Przeznaczyłem dzisiaj chyba z 4 h na szukanie rozwiązania i dalej się nie udało. Rzecz w tym, że robię krok po kroku wszystko jak w poleceniach i nie generuje mi PWMa na diodzie. Próbowałem wykonać diagnostykę i jedyne, co zdołałem wynaleźć, to kod błędu "1", czyli "Transfer error", na kanale DMA (przez STMStudio). Najlepsze jest to, że jak wrzucę projekt z paczki to działa. Ale jak skopiuję całego maina (który swoją drogą wygląda u mnie identycznie w części pisanej przez użytkownika) z działającego projektu do mojego, to znowu nie generuje PWM. Wnioskuję po tym, że problem leży gdzieś w plikach wygenerowanych przez CubeMXa i to nawet nie przez błędy w konfiguracji, bo sama konfiguracja w tym przypadku ograniczała się do ustawień, które potem zostały przepisane do funkcji konfigurujących poniżej maina. No i żeby była jasność, wersja bez DMA, a z wpisem bezpośrednio do rejestru timera działa. Zna ktoś może rozwiązanie tego problemu?

Udostępnij ten post


Link to post
Share on other sites

@PrimeSoul a próbowałeś jakoś porównać to co generuje CubeMX (Twoja wersja vs. ta z projektu)? Może uda się znaleźć coś ciekawego za pomocą jakiegoś narzędzia, która automatycznie porównuje różne wersje plików?

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

@Treker Nie próbowałem żadnym narzędziem, bo takich w sumie nigdy nie używałem i żadnego z nich nie znam. Natomiast jak przeglądałem pliki samemu, to na pewno różnice widziałem, choćby wspomniany wyżej SYSTICK_Callback był inaczej zrobiony i wcale nie było to przypadkowe wg deweloperów ST. Fajnie byłoby jakby ktoś bardziej doświadczony ode mnie w STMach spróbował na najnowszym CubeMXie postawić taki PWM sterowany przez DMA, bo może widziałby więcej niż ja w kwestii jakichś nieprawidłowości itp.

Edytowano przez PrimeSoul

Udostępnij ten post


Link to post
Share on other sites

Na pewno @Elvis będzie mógł wypowiedzieć się w tej kwestii 🙂 Doradzisz coś?

Udostępnij ten post


Link to post
Share on other sites

@PrimeSoul przeklikałem cały przykład w najnowszym CubeMX 5.4.0 i wszystko działa poprawnie - chociaż używam aktualnie Atollica zamiast OpenSTM32. Wcześniej te same przykłady robiłem na CubeMX 5.3.0 używając OpenSTM32 i ten przykład działał bez problemu.

Sprawdź, czy na pewno wybrałeś poprawnie wszystkie opcje odnośnie DMA, w szczególności kierunek: "Memory To Peripheral"

pwm09.thumb.png.7c7d6be9fdc4fb73bb30bb29cd0a606a.png

Jak przystało na programistę mogę spokojnie napisać "u mnie działa" 😉

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

@Elvis, właśnie miałem pisać.

Problem DMA rozwiązałem. Oczywiście moja własna głupota okazała się przyczyną. Podczas pierwszego testu nie używałem jednego kanału, a wszystkie 4 i 3 zdefiniowałem sobie na DMA. Okazało się, że tylko 1 ze zdefiniowanych przez DMA kanałów określiłem jako MemtoPeriph, a w pozostałych zapomniałem tego zrobić. A jak później testowałem, to konfiguracja robiona była w stanie lekkiego zdenerwowania i z głupoty... powieliłem ten sam błąd, tym razem już tylko przy 1 kanale. Ech, wstyd mi przed samym sobą.

Dzięki za zaangażowanie wszystkim.

Udostępnij ten post


Link to post
Share on other sites

@PrimeSoul super, że sprawa wyjaśniona. Powodzenia w dalszych eksperymentach 🙂

@Elvis dzięki, za testy i pomoc!

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

A tak swoją drogą, to nie widziałem, żeby ktoś wypisał odpowiedź na pytanie na końcu odcinka kursu, więc dla ciekawych (którzy odpowiedzi nie znali) wrzucam poniżej zrzut z manuala, który to wyjaśnia chyba dość preceyzyjnie.

image.thumb.png.18f8160de39cdf21a566385cb779ed09.png

 

Edytowano przez PrimeSoul
  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...