Skocz do zawartości

STM32 L073RZ Problem z diodami


yukimikoto

Pomocna odpowiedź

Dzień dobry.

 

Rozpoczęłam już pierwsze programy z moim Nucleo. Chciałam odrobinę przerobić program z diodami "Linijka LED-ów na STM32". Użyłam do tego pętli for, aby zastąpić nią operację przesunięcia bitowego. Niestety, nie uzyskałam zadowalającego efektu. Poniżej wklejam kod oraz dołączam fotografię, co robi Nucleo.

 

#include "stm32l0xx.h"

int main(void)
{
HAL_Init();
__HAL_RCC_GPIOC_CLK_ENABLE();

GPIO_InitTypeDef gpio;

gpio.Pin = GPIO_PIN_0 | GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3 | GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9;
gpio.Mode = GPIO_MODE_OUTPUT_PP;
gpio.Speed = GPIO_SPEED_FREQ_LOW;
gpio.Pull = GPIO_NOPULL;

HAL_GPIO_Init (GPIOC, &gpio);


while (1)
{
	for (uint32_t led = 0; led<=10; led++)
	{
	HAL_GPIO_WritePin(GPIOC, led, GPIO_PIN_SET);
	HAL_Delay(150);
	HAL_GPIO_WritePin(GPIOC, led, GPIO_PIN_RESET);

	if (++led >= 10)


	{
		led = 0;
	}
	
	led++;
	}
}
}

Rozpoczynamy od pinu nr 0 , kontynuujemy aż osiągniemy pin nr 9 , zwiększamy powtórzenia o jeden. Na pinie portu C o numerze led zapalamy diodę. Następnie ją gasimy. Jeżeli nr pinu będzie równy lub większy od 10,  zaczynamy odliczać od nowa. Program sypie się na zmiennej led, on jej nie widzi jako numeru pinu. Widział ją jednak w operacji przesunięcia bitowego w przykładzie kursu.

 

Co tutaj jest źle?

Pozdrawiam

1.jpg

Link do komentarza
Share on other sites

Zmienna led wystarczy, żeby miała 16 bitów. Zerknij sobie na makrodefinicje GPIO_PIN_0, GPIO_PIN_1, ... Każdy z tych symboli kryje pod sobą liczbę szesnastobitową, której dokładnie jeden bit jest jedynką, a reszta zerami (czyli są to potęgi dwójki). Ty zaś jako jeden z argumentów funkcji HAL_GPIO_WritePin podajesz najpierw liczbę 0 (czyli żaden z pinów),, 3 (piny 0 i 1, bo 3 = 21 + 20), itd. Czyli ogólnie jeśli chcesz zaświecić pin o numerze n, to jako argument funkcji podajesz liczbę 2n (oczywiście możesz takie liczby sumować, jeśli chcesz odwołać się do więcej niż jednego pinu w jednym wywołaniu funkcji).

Poza tym pętla for jest trochę dziwnie napisana – w pierwszej iteracji zmienna led ma wartość 0, wtedy udajesz, że ustawiasz jakieś piny (podajesz 0 w miejsce argumentu GPIO_PIN, czyli tak naprawdę nie odwołujesz się do żadnego pinu), czekasz 150 ms, udajesz, że resetujesz wcześniej „ustawione" bity. Następnie inkrementujesz zmienną led (czyli wynosi 1), sprawdzasz, czy 1 jest większe bądź równe 10 – ten warunek nie jest spełniony, dlatego omijasz wnętrze instrukcji warunkowej if. Wtedy inkrementujesz znowu zmienną  (led == 2). Kończysz pętlę i zaczynasz nową iterację ze zmienną led równą 3 (wykonuje się inkrementacja zapisana w „warunkach" pętli). To chyba nie tak miało działać?

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

Damm even I am having a similar kind of issue, I have searched all over the internet and even have posted on number of threads on different forum, no solution seems to work. I am really frustrated, can anyone of you here help me resolve this issue, I am very much tired now.
 

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.