Skocz do zawartości

Kurs STM32L4 – #3 – wejścia/wyjścia, czyli GPIO w praktyce


Komentator

Pomocna odpowiedź

Cześć, zacząłem przerabiać ten odcinek i już są pytania:

1. W którym miejscu dokumentacji jest napisane, że pin PA5 odpowiedzialny jest za diodę LD2, a pin PC13 za przycisk (przeglądałem datasheet i reference manual i nie mogę zlokalizować) ?

2. Jak podłączam płytkę do komputera to na czerwono świeci LD1 i LD3,  a jak wgrałem pierwszy program do migania diodą, to dioda LD2 miga poprawnie, LD3 świeci na czerwono a LD1 bardzo szybko miga na czerwono i zielono, czy to poprawne? czy coś tu jest nie tak?

Link do komentarza
Share on other sites

@jd123 sprawdź na schemacie, nie pamiętam jak się go szukało, ale jest gdzieś w obszernym zestawie plików związanych z płytkami nucleo:

MB1136.pdf

1 godzinę temu, jd123 napisał:

LD3 świeci na czerwono

Będzie zawsze świecić jak jest zasilanie:

image.thumb.png.05f7c9e585918aed09f441f0329a3818.png

1 godzinę temu, jd123 napisał:

LD1 bardzo szybko miga na czerwono i zielono, czy to poprawne?

Tak, to jest dioda statusu programatora:

image.thumb.png.7c47d69a2625821c884d2eae14e9ce97.png

  • Pomogłeś! 1
Link do komentarza
Share on other sites

Witam. Bardzo podoba mi się przedstawiony materiał. Jedyną uwagę jaką mam do autora, to prośba o zastosowanie bardziej czytelnego stylu prezentacji kodu. Jak zauważyłem w wątku jeden z kolegów miał problem z nawiasami, ja również zastanawiałem się, gdzie blok funkcji się kończy. Proponuje używać w przyszłości stylu wcięć Allmana (jest jako jeden z domyślnych stylów, które można ustawić), rozwleka kod, ale jest bardziej czytelny, nawiasy zaś są pod instrukcjami, a linie są wcięte wewnątrz bloku funkcji, ułatwi to ogólny przegląd przykładów kodu. Reszta super!  

Link do komentarza
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

@BlackJack wybacz brak odpowiedzi, ale umknęło mi to pytanie. Sprawdź czy masz zaznaczoną odpowiednią opcję w: Project > Properties > C/C++ Bulild > Settings > Tool Settings > MCU Post Build outputs.

Link do komentarza
Share on other sites

Witam!

Dziękuję za rewelacyjny materiał - świetna treść, bardzo fajnym podejściem jest generowanie błędów i iteracyjne poprawianie rozwiązania z przyciskiem. Z perspektywy osoby raczkującej w dziedzinie elektroniki, fragment ten kapitalnie wyjaśnia problematykę i konieczność stosowania filtrów 🙂

Mam jedną uwagę od strony kodowej. Często pojawiają się instrukcje w stylu:

bool is_button_pressed(void) {
  if (HAL_GPIO_ReadPin(USER_BUTTON_GPIO_Port, USER_BUTTON_Pin) == GPIO_PIN_RESET) {
    return true;
  } else {
    return false;
  }
}

Jest to trochę redundantny zapis - sprawdzamy warunek, a następnie w zależności od wyniku stosujemy zwracamy ten sam wynik ręcznie. Dużo prostsze jest:

bool is_button_pressed(void) {
  return HAL_GPIO_ReadPin(USER_BUTTON_GPIO_Port, USER_BUTTON_Pin) == GPIO_PIN_RESET;
}

Wydaje mi się, że nawet dla początkujących osób taka interpretacja kodu (po ewentualnym objaśnieniu) będzie naturalna: "funkcja zwraca wartość mówiącą, czy wartość pinu jest ustawiona na GPIO_PIN_RESET".

Analogicznie, zamiast:

if (is_button_pressed()) {
  led_set(0, true);
} else {
  led_set(0, false);
}

Można napisać:

 led_set(0, is_button_pressed());

Ponownie otrzymujemy nie tylko bardziej zwięzły kod, ale też jego interpretacja jest bardzo naturalna: "ustaw wartość diody 0 odpowiednio do stanu wciśnięcia przycisku".

Pozdrawiam!

  • Lubię! 1
Link do komentarza
Share on other sites

(edytowany)

@pgolab pewnie że można,

bool is_button_pressed(void) {
  return HAL_GPIO_ReadPin(USER_BUTTON_GPIO_Port, USER_BUTTON_Pin) == GPIO_PIN_RESET;
}

Ten zapis można uprościć, jeżeli spojrzysz na definicję:

/** 
  * @brief  GPIO Bit SET and Bit RESET enumeration 
  */
typedef enum
{
  GPIO_PIN_RESET = 0,
  GPIO_PIN_SET
}GPIO_PinState;
/**
  * @}
  */

Ctrl+click zawsze pomaga w takim dociekaniu 😉 

  • bool false to wartość = 0
  • bool true to wartość!= 0 czyli np 1, 2, -1, 1.2.

więc dodaj negację i zadziała:

bool is_button_pressed(void)
  return !HAL_GPIO_ReadPin(USER_BUTTON_GPIO_Port, USER_BUTTON_Pin);

a żeby zachęcić kompilator do optymalizacji możesz jeszcze dać atrybut inline żeby nie robić wywołania takiej funkcji,k órej zadaniem jest posiadanie ładnej nazwy:
 

inline bool is_button_pressed(void)
  return !HAL_GPIO_ReadPin(USER_BUTTON_GPIO_Port, USER_BUTTON_Pin);

 

Edytowano przez Gieneq
Link do komentarza
Share on other sites

Cześć, gdzie mogę znaleźć informacje o tym jak jest realizowane rozwiązanie Pull-up (i tym samym Pull-down), które zostaje skonfigurowane dla pinu PC8 w CubeMX?

A przy okazji dodam, że kurs jak zawsze (kto by się spodziewał) jest genialny! Jestem waszym odbiorcą już od kilku lat i dzięki materiałom o Arduino, elektronice, malince i oczywiście STMie moja nauka w technikum, a teraz na studiach, jest o niebo lepsza.

Dziękuję, że jesteście!

Link do komentarza
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!

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.