Skocz do zawartości

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


Komentator

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

 

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

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
Link do komentarza
Share on other sites

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

Link do komentarza
Share on other sites

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.

😛

Link do komentarza
Share on other sites

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)) {}
    	}

 

Link do komentarza
Share on other sites

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
Link do komentarza
Share on other sites

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
Link do komentarza
Share on other sites

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
Link do komentarza
Share on other sites

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

Link do komentarza
Share on other sites

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.

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.