Skocz do zawartości

Kurs STM32L4 – #15 – diody RGB WS2812B (liczniki), quiz


Komentator

Pomocna odpowiedź

Chodzi mi o fragment :

if(value & 0x80)

Rozumiem, że wynik tego warunku będzie pozytywny jeśli bitowo value = 1 oraz 0x80 = 1 prawda? Tylko nie rozumiem właśnie kiedy 0x80 będzie pozytywne.

Link do komentarza
Share on other sites

14 godzin temu, Kenny napisał:

Chodzi mi o fragment :

if(value & 0x80)

W tym przypadku "&" jest operatorem bitowym, który oznacza koniunkcję. Więcej na ten temat np. tutaj: https://pl.wikipedia.org/wiki/Koniunkcja_(logika)

Oznacza to, że wartość zmiennej value jest porównywana z liczbą 0x80 bit po bicie. Czyli w praktyce należy zacząć od zapisania wartości zmiennych w systemie binarnym. Załóżmy, że najpierw sprawdzamy przypadek, gdy zmienna value ma wartość zero:

0000 0000 (zmienna value o wartości 0)

1000 0000 (0x80 zapisane binarnie)

Teraz następuje porównanie bit po bicie. Idąc od lewej sprawdzamy pierwszy bit mamy 0 & 1, czyli fałsz. Dalej mamy same 0 w zmiennej 0x80, czyli zawsze będzie fałsz. Teraz kolejny przypadek:

1000 0000 (zmienna value o wartości 128)

1000 0000 (0x80 zapisane binarnie)

Idąc od lewej mamy 1 & 1, czyli prawdę. Pozostałe bity nie mają już znaczenia. Jaki z tego wniosek? Warunek będzie prawdziwy dla dowolnej wartości zmiennej value, której pierwszy bit będzie równy 1, czyli dla każdej liczby binarnej pasującej do wzoru 1XXX XXXX.

Daj znać czy to cos rozjaśniło. To temat związany raczej z samym C, a nie konkretnie z STM32 🙂 

  • Lubię! 1
  • Pomogłeś! 1
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

Dodaję właśnie LEDy WS2812B do projektu co prawda z STM32H7 ale funkcja HAL dla timera z DMA przyjmuje te same argumenty. Nie pamiętam jaki był stan w momencie pisania kursu, ale możliwe że jest drobny błąd w kursie.

Funkcja HAL przyjmuje wskaźnik na bufor:

/**
  * @brief  Starts the TIM PWM signal generation in DMA mode.
  * @param  htim TIM PWM handle
  * @param  Channel TIM Channels to be enabled
  *          This parameter can be one of the following values:
  *            @arg TIM_CHANNEL_1: TIM Channel 1 selected
  *            @arg TIM_CHANNEL_2: TIM Channel 2 selected
  *            @arg TIM_CHANNEL_3: TIM Channel 3 selected
  *            @arg TIM_CHANNEL_4: TIM Channel 4 selected
  * @param  pData The source Buffer address.
  * @param  Length The length of data to be transferred from memory to TIM peripheral
  * @retval HAL status
  */
HAL_StatusTypeDef HAL_TIM_PWM_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, const uint32_t *pData,
                                        uint16_t Length)

Czyli tu jest błąd gdzie przekazujemy adres wskaźnika, ciekawe że działa:

HAL_TIM_PWM_Start_DMA(&htim3, TIM_CHANNEL_1, &test, sizeof(test));

Tu jest już ok, w burst też jest ok:

HAL_TIM_PWM_Start_DMA(&htim3, TIM_CHANNEL_1, (uint32_t*)led_buffer, sizeof(led_buffer));

Uważam też że nienajlepszym pomysłem jest dawanie sizeof(test) w ostatnim argumencie. Sizeof zwraca liczbę bajtów okupowaną przez tablicę lub rozmiar pointera gdyby wrzucić tablicę jako argument funkcji. Gorzej robi się gdy tak jak w STM32H7 minimalny rozmiar dla DMA to 16 bitów halfword, wtedy sizeof tablicy to 2xliczba elementów czyli nie to co trzeba wpisać w argumencie. IMO lepiej dać stałą albo podzielić przez sizeof(test[0]).

 

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

@Gienek O ile rozumiem chodzi Ci o &test ? Faktycznie można byłoby po prostu przekazać "test", bez & - pewnie zostało to z jakiegoś wcześniejszego kodu. Natomiast program działa poprawnie, bo jest poprawny... To taka ciekawostka, albo raczej paskudna cecha języka C. Adres tablicy jest taki sam jak sama tablica, czyli zarówno &test, jak i test ma taką samą wartość - chociaż różny typ. To nie jest adres wskaźnika, ale adres tablicy. Jednak tablice i wskaźniki to co innego, chociaż często wydają się tym samym.

Więcej o tym "fenomenie" podpowie wujek google, pierwszy lepszy link: https://stackoverflow.com/questions/2528318/how-come-an-arrays-address-is-equal-to-its-value-in-c

Natomiast co do DMA na bardziej zaawansowanych mikrokontrolerach to temat rzeka... Zapytam tylko podchwytliwie - jak dbasz o spójność pamięci cache podczas używania DMA na STM32H7?

 

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

@Elvis Ciekawe, tego nie wiedziałem. Zwracam honor 🙂 

18 godzin temu, Elvis napisał:

jak dbasz o spójność pamięci cache podczas używania DMA na STM32H7?

Na razie nie używam, to trudny temat.

  • Lubię! 1
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.