Skocz do zawartości

Kurs STM32L4 – #7 – przerwania sprzętowe, obsługa błędów


Pomocna odpowiedź

Kurs STM32L4 – #7 – przerwania sprzętowe, obsługa błędów

Problemy z komunikacją przez UART, zbyt późna reakcja mikrokontrolera na sygnał z czujnika lub na naciśnięcie przycisku - to błędy, które można naprawić za pomocą przerwań sprzętowych. Podczas tej części kursu STM32L4 wykorzystamy przerwania do tego, aby usprawnić wcześniejsze programy, zajmiemy się też obsługą błędów.

UWAGA, to tylko wstęp! Dalsza część artykułu dostępna jest na blogu.

Przeczytaj całość »

Poniżej znajdują się komentarze powiązane z tym wpisem.

Link do komentarza
Share on other sites

Przypominamy: w komentarzach do kursów rozmawiamy wyłącznie na tematy związane z konkretnym kursem. Mile widziane są również informacje od osób, które korzystały wcześniej z naszych poradników. Wszystko po to, aby kursanci, którzy mają zamiar korzystać z tego kursu nie musieli "przedzierać" się przez dziesiątki postów na inne tematy. Tematy na pytanie, które nie są związane z kursem można zadawać na naszym forum o mikrokontrolerach.

Link do komentarza
Share on other sites

Zachęcam do lektury kolejnej części naszego kursu STM32L4. Tym razem tematem głównym była obsługa przerwań sprzętowych, ale oczywiście przy okazji przemyciliśmy również całkiem sporo innych tematów. W tym np. opisu wielu popularnych błędów, które mogą doprowadzić do dziwnych błędów w działaniu układu, a nawet do wycieku ważnych informacji z pamięci mikrokontrolera.

Link do komentarza
Share on other sites

Zdjęcie pizzy zmotywowało mnie do rejestracji. Gdzie można ustawiać się w kolejce po swój kawałek? 😉 A tak serio to świetny kurs, jak dla mnie super jest to, że opisujecie tyle przykładów z omówieniem ewentualnych błędów, które można popełnić. To chyba jedna z większych wartości tego kursu. Jak dla mnie do tej pory wszystko było 10/10. Oby tak dalej!

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

@Elvis  Czy "różne szkoły" mają swoje zalety i wady w zależności od potrzeb i wymagań projektu? Tzn. czy są jakieś zastosowania gdzie najlepiej użyć całego programu w procedurach przerwania, a w innych zastosowaniach korzystamy z pierwszej metody gdzie przerwania powinny działać szybko i zaraz kończyć działanie, a resztę poza przerwaniem?

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

@Matthew11 gratuluję czujności! Przykład w kursie zostawiłem, ale dodałem tam stosowną adnotację. Wspomniałem też w ramach ciekawostki o rejestrze SCB->CCR, ale tylko delikatnie, bo to już raczej temat wykraczający trochę poza poziom tego kursu. Zainteresowani na pewno dotrą do powyższej odpowiedzi z dokładnym wyjaśnieniem tematu.

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

Posiedziałem trochę czasu nad tymi przerwaniami. Opis mi się podoba, wszystko czytelne. 

Niemniej sposób obsługi mocno rozbudowany. I mam dwa zasadnicze pytania:

Pierwsze z nich:

Do przycisku mamy aż trzy funkcje, które wywołane są po kolei:

1) void EXTI15_10_IRQHandler(void);

2) void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin);

3) void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);

Dopiero w tej ostatniej HAL_GPIO_EXTI_Callback() wstawiamy swoją funkcję. Rozumiem, że tak się to robi i tego mam się trzymać? Tzn. jeżeli wstawię kod od razu w pierwszej z nich EXTI15_10_IRQHandler() to nie będzie zbyt eleganckie?

 

Drugie pytanie:

Załóżmy, że nie wstawię w kodzie HAL_GPIO_EXTI_Callback(), dlaczego kompilator się nie buntuje, że jej nie ma? Czy jest ona gdzieś zaszyta np. z parametrem "weak" podobnie jak __io_putchar()? 

Link do komentarza
Share on other sites

@padus myślę że opcja wyszukiwarki w IDE może pomóc. Hasło "HAL_GPIO_EXTI*":

image.thumb.png.bdaccc696df1846f2de1811a1aa1ac33.png

Plik stm32l4xx_it.c:

void EXTI15_10_IRQHandler(void)
{
  /* USER CODE BEGIN EXTI15_10_IRQn 0 */

  /* USER CODE END EXTI15_10_IRQn 0 */
  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13);
  /* USER CODE BEGIN EXTI15_10_IRQn 1 */

  /* USER CODE END EXTI15_10_IRQn 1 */
}

W tej funkcji możesz napisać coś od siebie i nie zostanie to wymazane przez Cuba. Sam generator zostawia tu informacje jaki pin sprawdza pod względem przerwań, więc w pozostałym kodzie możesz wrzucić coś bardziej ogólnego. Przechodzisz z Ctrl+click do definicji funkcji i tam:

void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
{
  /* EXTI line interrupt detected */
  if(__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != 0x00u)
  {
    __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);
    HAL_GPIO_EXTI_Callback(GPIO_Pin);
  }
}

Jak widać funkcja sprawdza czy zaszło na pinie przerwanie i zwraca callback do funkcji którą nadpisujesz. Ciekawostka, np. w Java podobna funkcjonalność nazywa się interfejsem lub klasą anonimową.

Zaglądamy do definicji funkcji:

__weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(GPIO_Pin);

  /* NOTE: This function should not be modified, when the callback is needed,
           the HAL_GPIO_EXTI_Callback could be implemented in the user file
   */
}

Komentarz chyba wyjaśnia całą resztę 🙂 

Dnia 3.07.2021 o 19:48, padus napisał:

Tzn. jeżeli wstawię kod od razu w pierwszej z nich EXTI15_10_IRQHandler() to nie będzie zbyt eleganckie?

Jak widać w definicji funkcji jest miejsce na kod użytkownika, więc możesz dać tam coś swojego.

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