Skocz do zawartości

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


Pomocna odpowiedź

@slawekvslawek Gratuluję wytrwałości, wersja z HAL_TIM_DMABurst_MultiWriteStart była wspomniana jako ciekawostka, prawdę mówiąc nie sądziłem że kogokolwiek zainteresuje.

Okazuje się, że w nowszych wersjach HAL wprowadzono dodatkowe testy, a jednym z rezultatów jest to że HAL_TIM_DMABurst_MultiWriteStart może być wywołana tylko raz do czasu aż użyjemy HAL_TIM_DMABurst_WriteStop. W naszym przypadku HAL_TIM_DMABurst_WriteStop jest nieco stratą czasu, ale jeśli jej nie wywołamy to HAL_TIM_DMABurst_MultiWriteStart zwróci błąd.

W najnowszej wersji HAL należałoby zmienić funkcję ws2812b_update na następującą:

void ws2812b_update(void)
{
    HAL_TIM_DMABurst_WriteStop(&htim3, TIM_DMA_UPDATE);
    HAL_TIM_DMABurst_MultiWriteStart(&htim3, TIM_DMABASE_CCR1, TIM_DMA_UPDATE, led_buffer, TIM_DMABURSTLENGTH_1TRANSFER, sizeof(led_buffer));
}

Przy okazji warto przypomnieć, że funkcje HAL mogą zwracać błędy. W kodzie "produkcyjnym" należy zawsze sprawdzać, czy funkcja nie zakończyła się błędem. W kursie tego nie robimy aby uprościć kod, ale jak widać bywa to bardzo ważne i nawet wielokrotnie sprawdzony program może sprawić niespodzianki.

  • Lubię! 2
  • 2 tygodnie później...
(edytowany)

Bardzo zainteresowała mnie "ciekawostka" i obserwacja na analizatorze nieprawidłowości w generowaniu impulsów. Chciałem poprawić bibliotekę ws2812, ale po zmianie na DMABurst nie chciało działać. Świeciła się tylko jeden led na zielono i analizator nie wykrywał impulsu. Zadziałało dopiero po dodaniu pierwszej linii w kodzie funkcji ws2812b_update.

void ws2812b_update(void)
{
	HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);
    HAL_TIM_DMABurst_WriteStop(&htim3, TIM_DMA_UPDATE);
    HAL_TIM_DMABurst_MultiWriteStart(&htim3, TIM_DMABASE_CCR1, TIM_DMA_UPDATE, led_buffer, TIM_DMABURSTLENGTH_1TRANSFER, sizeof(led_buffer));
}

obraz.thumb.png.a40a64741c415a494064a029eee72b60.png

Przy okazji widać że bufor 74HCT125 wprowadza opóźnienia

obraz.thumb.png.f4605ea7973750a9ddf723685ed17a33.png

obraz.thumb.png.442d9674f07ca79304fb4a0f9ba2c2e8.png

Edytowano przez aimeiz
  • 7 miesiące później...
  • 2 tygodnie później...

@herman123 przepraszam za późną odpowiedź, ale dopiero teraz dotarłem do tego pytania. Czy korzystasz z dokładnie tego samego sprzętu, który jest w kursie, czy nie posiadasz zestawów i możliwe, że masz np. inna linijkę diod?

@Treker jeśli chodzi o linijkę diod, to używam tej która była w zestawie. Samą płytkę Nucleo kupiłem kilka miesięcy temu, ponieważ tą która była w zestawie użyłem na stałe w innym projekcie, lecz nadal jest to NUCLEO-L476RG - z MCU STM32L476RGT6.

  • 3 tygodnie później...

@herman123 kolejny raz musze przeprosić za późną odpowiedź, ale całkiem umknęła mi Twoja odpowiedź, a dopiero teraz nadrabiam zaległości na forum temat po temacie i tutaj trafiłem... Czy problem jest nadal aktualny i nie udało Ci się go rozwiązać?

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

Mam duży problem - używam płytki nucleo z F411RE - problem polega na jakiś dziwnych częstotliwościach otrrzymywanych z wyjscia PWM - w ogóle nie majacych nic wspólmego z dostępnym,i wzorami na wartoscoi PSC i ARR. Np Licznik TIM4 - PSC=0 i ARR = 99 częśtotliwość sygnału PWM  = ok 111kHz. Aby otrzymać zbliżoną do tej z lekcji 777kHz musze  wpisac ARR = 15 (! o co chodzi ???) - wtedy mam i tak ok 694kHz. Zegar mam ustawiony na zewnętrzy kryształ 8MHz z STLinka czyli HSE -> PLL 4,x100/2 SYSCLK 100MHz -> /1 , HCLK 100MHz i zegary timerów też maja 100MHz. Co jest nie tak ? Na timerze TIM1 i TIM3 też mia lem podobne wartości. Jeszcze jedno - przebieg mam tylko kiedy ustawiam w zakładce DMA Mode = Circular, przy Mode nie mam przebiegu. No i nie mogę jak w przykładzie wybraż Byte i Half Word jednocześnie tylko odzielnie lub takie same wartości razem. Ktoś pomoże ? Wiem że lekcja by ła na inny procesor ale tu nie mo że być az takich różnic !?.

 

forbot.png

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