Skocz do zawartości

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


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?

@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
  • 1 miesiąc później...

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!  

  • 3 tygodnie później...
  • 2 tygodnie później...

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

  • 3 tygodnie później...

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
(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
  • 2 tygodnie później...

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!

  • 1 miesiąc później...

Hej 🙂

Zakupiłem zestaw z płytka nucleo z botlandu i na samym starcie kursu natrafiłem na problem, przy próbie debugowania migania diodą dostaje taki komunikat

obraz.thumb.png.bea8829ffb03fd24122c067225d3f469.png

Jak to naprawić ?

EDIT:

Gdy uruchomię na świeżo system i próbuje zdebugowac ten sam kod dostaje trochę inny komunikat:

obraz.thumb.png.6591f5eabd3297aaf408dfe949a3e8fe.png

Pomocy 😞

(edytowany)

@Treker

Korzystam z IDE wersji 1.10.1

obraz.thumb.png.65e0e7b8420ee672de938a8250864c63.png

 

Niestety aktualizacja programatora nic nie pomogła (miałem wersje aktualną)

Spróbowałem przeinstalować całe środowisko, ale tutaj również to nic nie dało

Edytowano przez vadmae

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...