Skocz do zawartości

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


Pomocna odpowiedź

Teraz przejrzałem przesłane przeć Ciebie pliki i tam jest coś dziwnego... dlaczego w main.c masz tylko zawartość while(1) a resztę maina w stm32l4xx hal msp.c?

Czy to mi się coś źle otworzyło?

314178905_Zrzutekranu2022-12-6o19_06_39.thumb.png.ffdc7b27a3b91c7315ad830df1895444.png1633918916_Zrzutekranu2022-12-6o19_08_07.thumb.png.165cdd46e9e047d8b91e95be12125ed4.png

 

Na pewno z nawiasami i klamrami wszystko jest ok? Bo nie widzę całego kodu, ale wydaje mi się że masz niezamkniętą klamrę od main(). Może łatwiej by było jakbyś wstawił do posta po prostu zawartość main.c?

  • Lubię! 1
1 godzinę temu, trainee napisał:

Zwiększanie wcięcia po każdej klamrze otwierającej pomaga.

Przy wielkości współczesnych monitorów wcięcia obowiązkowo powinny mieć 4 spacje. 🙂

1 godzinę temu, pmochocki napisał:

Przy wielkości współczesnych monitorów wcięcia obowiązkowo powinny mieć 4 spacje. 🙂

Za Linux kernel coding style:

Cytat

Tabs are 8 characters, and thus indentations are also 8 characters. There are heretic movements that try to make indentations 4 (or even 2!) characters deep, and that is akin to trying to define the value of PI to be 3.

Rationale: The whole idea behind indentation is to clearly define where a block of control starts and ends. Especially when you’ve been looking at your screen for 20 straight hours, you’ll find it a lot easier to see how the indentation works if you have large indentations.

Now, some people will claim that having 8-character indentations makes the code move too far to the right, and makes it hard to read on a 80-character terminal screen. The answer to that is that if you need more than 3 levels of indentation, you’re screwed anyway, and should fix your program.

😛

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

Witam! Mam mały problem z przyciskiem, który by resetował linijkę. Dodałem kolejny case do funkcji is_button_pressed. Przycisk podłączyłem analogicznie jak w poprzednim zadaniu do PB11, dodałem nazwę USER_BUTTON3. Problem polega na tym, że mikrokontroler zawsze wykrywa, iż przycisk jest wciśnięty (nawet wtedy, gdy przycisk jest odłączony).

bool is_button_pressed(int button) {
  switch (button) {
  case 0:
    if (HAL_GPIO_ReadPin(USER_BUTTON_GPIO_Port, USER_BUTTON_Pin) == GPIO_PIN_RESET) {
      return true;
    } else {
      return false;
    }
  case 1:
    if (HAL_GPIO_ReadPin(USER_BUTTON2_GPIO_Port, USER_BUTTON2_Pin) == GPIO_PIN_RESET) {
      return true;
    } else {
      return false;
    }
  case 2:
    if (HAL_GPIO_ReadPin(USER_BUTTON3_GPIO_Port, USER_BUTTON3_Pin) == GPIO_PIN_RESET) {
      return true;
    } else {
      return false;

  default:
    return false;
  }
}
}





  int led = 0;
    led_set(led, true);

    while (1)
      {
    	if (is_button_pressed(0)) {
    		// Po wcisnieciu przycisku wylacz diodę
    		led_set(led, false);

    		// Zwieksz zawartosc zmiennej led
    		led++;
    		// Sprawdz czy nie przekracza zakresu
    		if (led >= 10) {
    		  led = 0;
    		}

    		// Wlacz kolejna diode
    		led_set(led, true);

    		// czekamy na zwolnienie przycisku
    		while (is_button_pressed(0)) {}
    	}

    	if (is_button_pressed(1)) {
    		// Po wcisnieciu przycisku wylacz diodę
    		led_set(led, false);

    		// Zmniejsz zawartosc zmiennej led
    		led--;
    		// Sprawdz czy nie przekracza zakresu
    		if (led < 0) {
    		  led = 9;
    		}


    	    // oczekiwanie na ustanie drgań styków
    		HAL_Delay(20);

    		// Wlacz kolejna diode
    		led_set(led, true);

    		// czekamy na zwolnienie przycisku
    		while (is_button_pressed(1)) {}

    		// opóźnienie na wypadek drgań po zwolnieniu przycisku
    		HAL_Delay(20);
    	}

   	if (is_button_pressed(2))
    	{
    		led_set(led, false);
    		led = 0;

    		while (is_button_pressed(2)) {}
    	}

 

2 godziny temu, paranoico napisał:

Witam! Mam mały problem z przyciskiem, który by resetował linijkę. Dodałem kolejny case do funkcji is_button_pressed. Przycisk podłączyłem analogicznie jak w poprzednim zadaniu do PB11, dodałem nazwę USER_BUTTON3. Problem polega na tym, że mikrokontroler zawsze wykrywa, iż przycisk jest wciśnięty (nawet wtedy, gdy przycisk jest odłączony).

bool is_button_pressed(int button) {
  switch (button) {
  case 0:
    if (HAL_GPIO_ReadPin(USER_BUTTON_GPIO_Port, USER_BUTTON_Pin) == GPIO_PIN_RESET) {
      return true;
    } else {
      return false;
    }
  case 1:
    if (HAL_GPIO_ReadPin(USER_BUTTON2_GPIO_Port, USER_BUTTON2_Pin) == GPIO_PIN_RESET) {
      return true;
    } else {
      return false;
    }
  case 2:
    if (HAL_GPIO_ReadPin(USER_BUTTON3_GPIO_Port, USER_BUTTON3_Pin) == GPIO_PIN_RESET) {
      return true;
    } else {
      return false;

  default:
    return false;
  }
}
}





  int led = 0;
    led_set(led, true);

    while (1)
      {
    	if (is_button_pressed(0)) {
    		// Po wcisnieciu przycisku wylacz diodę
    		led_set(led, false);

    		// Zwieksz zawartosc zmiennej led
    		led++;
    		// Sprawdz czy nie przekracza zakresu
    		if (led >= 10) {
    		  led = 0;
    		}

    		// Wlacz kolejna diode
    		led_set(led, true);

    		// czekamy na zwolnienie przycisku
    		while (is_button_pressed(0)) {}
    	}

    	if (is_button_pressed(1)) {
    		// Po wcisnieciu przycisku wylacz diodę
    		led_set(led, false);

    		// Zmniejsz zawartosc zmiennej led
    		led--;
    		// Sprawdz czy nie przekracza zakresu
    		if (led < 0) {
    		  led = 9;
    		}


    	    // oczekiwanie na ustanie drgań styków
    		HAL_Delay(20);

    		// Wlacz kolejna diode
    		led_set(led, true);

    		// czekamy na zwolnienie przycisku
    		while (is_button_pressed(1)) {}

    		// opóźnienie na wypadek drgań po zwolnieniu przycisku
    		HAL_Delay(20);
    	}

   	if (is_button_pressed(2))
    	{
    		led_set(led, false);
    		led = 0;

    		while (is_button_pressed(2)) {}
    	}

 

Może coś jest po prostu źle podłączone. Pokazałbyś zdjęcie układu?

  • Lubię! 1
2 godziny temu, paranoico napisał:

Przycisk podłączyłem analogicznie jak w poprzednim zadaniu do PB11, dodałem nazwę USER_BUTTON3.

@paranoico czy ustawiłeś w Cube PB11 jako wejście i wygenerowałeś nową wersję projektu?

  • Pomogłeś! 1
  • 4 miesiące później...
(edytowany)

Witam, 

jestem nowy na forum. Zacząłem kurs i w programie migającej diody z przyciskiem napotkałem na błąd braku reakcji na przycisk USER

 

kod.thumb.jpg.9978652bb5ed9306cb85ac4d1856e20a.jpg

pin.thumb.jpg.da521236b38b5858bbf969bd42887a94.jpg

Na czym polega mój problem? Proszę o pomoc.

Edytowano przez Gazbi

@Gazbi zacznijmy od tego, że na pewno masz tam coś namieszane z komentarzami, kod jest dodany w złym miejscu. Powinno być tak:

/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
    // Sprawdzamy, czy przycisk został naciśnięty
    if (HAL_GPIO_ReadPin(USER_BUTTON_GPIO_Port, USER_BUTTON_Pin) == GPIO_PIN_RESET) {
        // Jeśli tak to włączamy diodę
        HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_SET);
    } else {
        // A jeśli nie to wyłączamy ją
        HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET);
    }

/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */
}

Po drugie, daj znać na czym polega błąd? Ten kod nie jest związany z miganiem diody (a o to zapytałeś).

Dziękuję za odpowiedź. Przez miganie rozumiałem zapalanie i gaszenie diody przy wciskaniu przycisku. Świadom, że jestem laikiem, pozwolę sobie na dyskusję. Kod jest w pętli while , więc wydaje mi się, że jest właściwie umieszczony. To są tylko komentarze. Problem w tym, że program nie czyta przycisku USER_BUTTON. Dioda jest stale zgaszona. Sprawdzałem, na pinie PC13  po wciśnięciu przycisku następuje zmiana z 3v3 na 0V. Sterowanie diodą jest właściwe.

Przy zmianie z if (HAL_GPIO_ReadPin(USER_BUTTON_GPIO_Port, USER_BUTTON_Pin) == GPIO_PIN_RESET) na ==GPIO_PIN_SET, dioda stale się pali.

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