Skocz do zawartości

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?

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ę 🙂

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?

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.

Link to post
Share on other sites

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
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.

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?

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?

Link to post
Share on other sites

@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
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
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.

Link to post
Share on other sites

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
Link to post
Share on other sites
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

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!

Anonim
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...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.