Skocz do zawartości
Komentator

Kurs STM32 - #4 - Sterowanie portami GPIO w praktyce

Pomocna odpowiedź

Dzięki, Elvis, za wytłumaczenie, rozwinąłeś kwestię bardzo fajnie, nurtuje mnie jednak jeszcze jedno, a mianowicie, jak jest:

1 << 0 = 1 ( = 2 ^ 0)

1 << 1 = 2 ( = 2 ^ 1) itd.

to ta "1" z lewej oznacza (uint16_t)0x0001 czy coś innego?

Udostępnij ten post


Link to post
Share on other sites

Typ tej jedynki powinien wywnioskować sam kompilator na podstawie typu do którego przypisujemy. Ponieważ funkcja GPIO_SetBits jako drugi parametr przyjmuje uint16_t, więc wynik działania będzie do takiego typu skonwertowany.

Inna sprawa, że faktycznie kod może działać trochę inaczej. STM32 jest układem 32-bitowym, a parametry funkcji są najczęściej przekazywane w rejestrach - więc nawet jeśli parametr jest uint16_t, w rzeczywistości będzie 32-bitową wartością rejestru...

W sumie jedynym wyjściem byłoby sprawdzenie jak wygląda wygenerowany kod asemblera - albo nie wnikanie w szczegóły 😉

Udostępnij ten post


Link to post
Share on other sites

Hmm, ładnie to opisałeś, natomiast jak teraz patrzę, to źle zadałem pytanie, chodziło mi o to, czemu tam jest jedynka? Co on tam robi, skoro potęgujemy dwójkę?

Udostępnij ten post


Link to post
Share on other sites

Synergia, nie potęgujemy dwójki, przesuwamy jedynkę binarnie:

1<<0 = 1 (001)

1<<1 = 2 (010)

1<<2 = 4 (100)

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

To teraz już rozumiem, dzięki 😅 a tak z ciekawości, można przesuwać inne cyfry, poza jedynką, czy tylko ją?

Udostępnij ten post


Link to post
Share on other sites

Witam Forumowiczów!

Mam pytanie co do kursu. Jeden z użytkowników wspomniał, że używa płytki NUCLEO-F411RE. Również taką na dniach zamówiłem. Pierwszy program ze zmiennymi (z 3 lekcji kursu) skompilował się i działał poprawnie, jednak przy konfiguracji portów wystąpiły problemy. Początkowo przepisywałem ręcznie aby lepiej zrozumieć kod, jednak gdy wystąpiły pierwsze błędy, to skopiowałem kod i zmieniłem jedynie nazwę używanych bibliotek tak aby pasowały do używanej przeze mnie płytki, tzn stm32f4xx.h. Rozumiem, że biblioteki mogą się trochę różnić i przez to nie pasują niektóre wartości funkcji podawane przeze mnie. Zaglądałem do bibliotek aby znaleźć poprawne wartości, których mógłbym użyć, jednak nie poradziłem sobie z dwiema wartościami, konkretnie pierwsza wartość funkcji " RCC_APB2PeriphClockCmd" i wartość, za pomocą której podciąga się wyjście przez rezystor do zasilania (program wyświetla komunikat "symbol could not be resolved/first use in this function". Dodam jeszcze, że zainstalowałem program oraz sterowniki zgodnie z instrukcjami na poprzednich lekcjach. Jako załącznik dodaję zdjęcie z okna programu. Nie chciałem zakładać oddzielnego tematu, dlatego dołączyłem się do tego ponieważ jest on pokrewny.

Z góry dziękuję za odpowiedź.

PS. Znalazłem w karcie katalogowej, że GPIOA jest podpięty do szyny AHB1 i zmieniłem to w odpowiednich miejscach, jednak dalej mam błąd przy komendzie z podciąganiem przez rezystor do zasilania.

PS2. Jestem o krok bliżej, bo udało mi się za pomocą bibliotek ustawić gpio.GPIO_Mode = GPIO_Mode_OUT;

PS3. Udało mi się skompilować i wgrać program. W bibliotekach doszedłem też do tego, że trzeba użyć parametru "GPIO_PuPd_UP" jeżeli chce się podciągnąć przez rezystor.

Udostępnij ten post


Link to post
Share on other sites

juras, gratuluję, że udało się rozwiązać szybko problem 🙂 Jeśli będziesz miał pytania w przyszłości, to załóż osobny temat. W komentarzach do kursu rozmawiamy tylko o F103, aby nie robić zamieszania.

Udostępnij ten post


Link to post
Share on other sites

Jest błąd w tym kursie, bo jest błąd w bibliotekach STM i prosiłbym o poprawę tego. Tu jest mój film z tym jak należy to konfigurować:

Wyjaśniam problem:

1) Gdyby było tak jak w biliotekach, czyli SysTick_Config(SystemCoreClock / 1000); daje 1ms, to w waszym kodzie musielibyście ustawić delay_ms(1000); aby uzyskać 1 sekundowe opóźnienie, bo mili to 0,001s, a jak podłączyć to do oscyloskopu, to otrzymacie całkiem co innego.

2) Doświadczalnie doszedłem do tego, że SysTick_Config(SystemCoreClock / 1000); oznacza 100 tyknięć zegara na 1 sekundę. Czyli 2,5ms na jeden cykl.

3) W filmie pokazuję jak konfigurować Systicka do swoich potrzeb. Czyli jeśli chcemy uzyskać 37Hz, to należy wpisać SysTick_Config(SystemCoreClock / 185), a jeśli chcemy 10 ms, to wystarczy 4 razy powtórzyć systick z ustawieniem SysTick_Config(SystemCoreClock / 1000). czyli 2,5ms *4 = 10ms

na filmie chyba dosyć jasno to wyjaśniam, w razie co można pytać.

Udostępnij ten post


Link to post
Share on other sites

avrkwiat, jestem pewien że Twój problem wynika z złego ustawienia taktowania procesora. Zakładając taktowanie 64MHz i dobre zdefiniowanie stałej "SystemCoreClock", funkcja SysTick_Config() ustawi rejestr SysTick->LOAD na wartość 63999. I tyle. Jak chcesz to ustaw sobie te Systicka ręcznie (robiłem tak nim powstał CubeMX i zawsze było tak jak powinno):

void SysTick_Conf(void)
{
SysTick->LOAD=63999; //zakladajac taktowanie 64MHz
SysTick->VAL =0;
SysTick->CTRL=0x7;
}
  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Na 100% to jest wina taktowania i konfiguracji, bo jak dobieram to oscyloskopem, to wszystko śmiga jak należy.

Tu jest film jak ja to zawsze robiłem:

Robiłem to na procesorze STM32F107vct6, który standardowo ma HSI 8MHz i stąd te 2,5ms jeśli nie konfiguruje zewnętrznego HSE. Czyli na wewnętrznym zegarze i SysTick_Config(SystemCoreClock / 1000);

Ostatnio zacząłem update'ować moją starą stronę internetową i zacząłem szukać jakiś lepszych metod, żeby przekazać moją wiedze innym. Ale chyba najprościej jest właśnie proporcją i oscyloskopem 🙁

Udostępnij ten post


Link to post
Share on other sites

avrkwiat, miło widzieć, że osoby piszące inne kursy programowania czytają to co przygotowaliśmy na Forbocie. Wydaje mi się, że nieco pochopnie wyciągasz wnioski odnośnie materiału zaprezentowanego w kursie i chyba trochę na wyrost założyłeś, że jesteś jedyną osobą używającą oscyloskopu.

Próbowałem obejrzeć załączone wideo, jednak ilość niedociągnięć od strony merytorycznej była nieco powyżej progu, który mogę wytrzymać, więc musisz mi wybaczyć, że nie znam całego zaprezentowanego przez Ciebie materiału.

Masz rację co do błędu w bibliotekach ST, zgłaszałem ten błąd do OpenSTM32, jednak nie jest on aż tak duży jak podajesz. W przypadku STM32F103 stała SystemCoreClock wynosi 72000000, czyli odpowiada częstotliwości taktowania 72MHz. W przypadku używania generatora RC, system pracuje z częstotliwością 64MHz, co jednak nie tłumaczy błędu na poziomie 5x.

Jednak jeśli masz chwilę czasu, możemy niejako wspólnymi siłami spróbować odkryć gdzie jest przyczyna rozbieżności między komentarzami w kodzie przykładowym, a uzyskanymi przez Ciebie pomiarami. Takie doświadczenie mogłoby okazać się pouczające dla innych użytkowników forum.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
Robiłem to na procesorze STM32F107vct6, który standardowo ma HSI 8MHz i stąd te 2,5ms jeśli nie konfiguruje zewnętrznego HSE. Czyli na wewnętrznym zegarze i SysTick_Config(SystemCoreClock / 1000);
Czy nie było by sensowniej po prostu wpisać
SysTick_Config(8000000 / 1000);

Niż robić cały tutorial i wyliczać dzielenie z proporcji?

Udostępnij ten post


Link to post
Share on other sites

Elvis, 1) Może mnie źle zrozumiałeś, bo widzę, że odebrałeś to jako atak. Nie o to mi chodzi, chodzi o to, że mieliście zrobiony kurs w którym były Systick wyjaśniony szybko i łatwo. Bez konieczności pisania nowych bibliotek. Dlatego uznałem, że fajnie jakby to działało. Wtedy nie musiałbym sam się męczyć. Wrzuciłbym film z waszym linkiem i pokazał, że ten kod na waszej stronie działa bez żadnych dodatkowych modyfikacji, bo tak byłoby szybciej z mojego punktu widzenia. Jak można zauważyć zrobiłem tak z waszym kursem na LPC 😉, jak coś jest dobre, to nie ma co tam kombinować.

Niestety wyszło mi, że trzeba w tym kodzie jeszcze majstrować, dlatego fajnie poprawić to, aby wszyscy z tego skorzystali, bo docieracie do wielu ludzi.

2) Oczywiście mogę popracować nad tym co jest przyczyną takiej rozbieżności, bo cały dzień to za mną chodzi, ale teraz mam troszkę innej pracy (tej która daje mi chleb 😉 ). Pewnie zrobiłem gdzieś błąd w deklaracji zegara, ale nie mam teraz czasu tego sprawdzać.

3) Co do moich materiałów, to będę wdzięczny za pokazanie mi błędów w myśleniu, bo przecież tak właśnie ludzie się rozwijają i można się uczyć tylko od lepszych, więc jak wiesz więcej, to chętnie się poduczę od Ciebie.

Harnas, Oczywiście, że można by wpisać 8000000/1000. Zgadzam się w 100%, ale w ten sposób pokazałbym jak uzyskać tylko 1ms, a nie pokazałbym jak uzyskać np 1,5ms. Wiem, że dla osób, które programują już kilka lat jest to normalne, ale ludziom w technikum dobrze nakreślić takie rozwiązanie, ponieważ teraz w szkole nie uczą proporcji.

Póki co robię kursy dla uczniów z technikum, którzy chcą zacząć programować, a ja nie mam tyle czasu, aby z każdym siedzieć osobno. Kursy wideo są w tym przypadku najlepsze, bo można pokazać co i gdzie trzeba skopiować i wkleić.

Udostępnij ten post


Link to post
Share on other sites

Podłączenie płytki i odkurzenie projektu zajmie mi chwilę, więc mam w międzyczasie prośbę - czy mógłbyś mi przysłać pełny kod źródłowy programu który uruchamiałeś? O ile widzę używasz innej płytki niż w kursie, innego procesora i innego środowiska... to trochę utrudni sprawę, ale nie znaczy że nie da się ogarnąć.

Natomiast żeby łatwiej było się dogadać, dobrze byłoby znać obie konfiguracje - moja jest w kursie, płytka Nucleo procesor stm32f103, kody dostępne, środowisko OpenSTM32.

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, aby zacząć 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...