2014-12-23 57 views
8

Mam aplikację, którą przesyłam z Kiel IDE do budowania z łańcuchem narzędzi GNU z powodu problemów licencyjnych. Z powodzeniem mogę konfigurować, budować, flashować i uruchamiać aplikację na urządzeniu.STM32 Wypalanie przerwań WWDG, gdy nie jest skonfigurowane

Aplikacja po stronie GNU z jakiegoś powodu utknęła w słabo połączonym programie obsługi przerwania dla WWDG, który jest nieskończoną pętlą. Aplikacja nie włącza WWDG i domyślnie jest wyłączona podczas resetowania. Zweryfikowałem również, że rejestry konfiguracyjne mają domyślne wartości startowe.

Jedyną różnicą, poza kompilatorami, są pliki łącznika i uruchamiania. Jednak zarówno pliki startowe, jak i pliki łączników używane przez oba łańcuchy narzędzi są domyślnie generowane przez STM.

Każdy pomysł, co może być przyczyną tego? Jestem tutaj na końcu mojego rozumu.

Korzystając ze stm32f103XX, proszę o kontakt w razie jakichkolwiek innych informacji.

EDYTOWANIE: Korzystając z poniższych komentarzy, udało mi się potwierdzić, że jest to wywoływany HardFault_Handler. mam to wyjście backtrace poniżej, czy to może być pomocne

GDB BT:

0 HardFault_Handler()

1 (obsługi sygnału nazywa)

2 0x720a3de w ??()

3 0x80005534 w foo()

Backtrace zatrzymane: poprzednią klatkę identyczną do tej ramy

2 rzeczy wyróżniać się do mnie, choć im nie ekspert gdb (uszkodzony stosu?). 1) foo nie jest funkcją, jest ciągiem znaków i 2) 0x0720a3de nie jest poprawnym adresem pamięci, zakres adresów flash zaczyna się od 0x08000000

+1

Czy jesteś pewien, że to naprawdę WWDG? Innym 'while (1);' może dzielić ten kod ze względu na optymalizację. Czy plik mapy pokazuje tylko WWDG pod tym adresem? –

+0

Możesz być na czymś. Wygląda na to, że w pliku .elf wszystkie domyślne symbole irq wskazują na ten sam adres, co przypuszczam, że to tylko zbieg okoliczności, że nazwa WWDG_IRQ jest w debugerze. Dodam funkcje łącznika stong do irqa, więc mogę dowiedzieć się, który dokładnie jest winowajcą. – gettingSmarter

Odpowiedz

7

A więc dzięki kopniakowi w spodnie D Krueger. Udało mi się zrozumieć, że to, co faktycznie było wywołane, było HardFault_Handler. Tak więc każdy, kto natknie się na to stanowisko, sprawdza, który IRQ jest naprawdę wywoływany, pisząc tymczasowe funkcje w celu zabezpieczenia prawdopodobnych sprawców, np. HardFault. Prawdziwym problemem dla wywołania IRQ jest zły dostęp do pamięci przez memcpy, który jestem w drodze do następnego rozwiązania.

+0

Jestem prawie pewien, że przekonasz się, że dostęp do złej pamięci nie jest "* przez memcpy *", ale raczej * Twój telefon * do memcpy. – Clifford

+2

Ostatecznym winowajcą okazało się brak połączenia z odpowiednimi opcjami, z którymi się kompilowałem. Zapomniałem połączyć z opcjami -mthumb i -mcpu = cortex-m3. Więc łączyłem się z niepoprawnymi bibliotekami c. – gettingSmarter

4

miałem dokładnie ten sam błąd jako OP (pozorny WWDG przerwać, ale w rzeczywistości wypalania HardFault_Handler) przy przenoszeniu przykład dla zarządu STM32F3 Discovery skompilować w CooCox CoIDE 1.7.7 z bibliotekami STM32Cube F3 (v1.1.0). Kod sprawdzał się dobrze, o ile nie próbowałem używać żadnych przerwań, ale zaraz po włączeniu przerwań timera SysTick zadziałał wyjątek HardFault.

Problem polegał na tym, że zaniedbałem włączenie do projektu plików stm32f3xx_it.h i stm32f3xx_it.c. Ich brak nie powodował ostrzeżeń/błędów kompilatora. Po skompilowaniu &, kod z przerwaniami działał poprawnie.

0

Miałem bardzo podobny problem podczas łączenia dwóch projektów generowanych oddzielnie przez STM32CubeMX dla procesora STM32F2XX. Jeden projekt korzystał z urządzenia peryferyjnego Ethernet, a drugi nie. Poza tym jedna różnica, dwa projekty wykorzystały ten sam zestaw urządzeń peryferyjnych.

Po zintegrowaniu dwóch projektów ręcznie przez skopiowanie plików, aplikacja trafi do WWDG_IRQHandler po uruchomieniu pierwszego zadania (gdy przerywniki są włączone po raz pierwszy). Najpierw potwierdziłem, że bit WDGA rejestru WWDG nie został rzeczywiście ustawiony i dlatego wyłączono urządzenie peryferyjne WWDG. Następnie zweryfikowałem, że tabela wektorów przerwań została poprawnie zainicjowana. W końcu, po kilku godzinach kopania, zdałem sobie sprawę, że nie zdefiniowałem funkcji ETH_IRQHandler w stm32f2xx_it.c, która wywołała przerwań Ethernet do obsługi przez domyślny handler, zamaskowanie się jako WWDG_IRQHandler - prawdopodobnie z powodu optymalizacji.

0

Miałem ten problem z powodu tej samej przyczyny głównej, co awilhite. Korzystam z Atollic TrueStudio 8.0.0. Użyłem go do uruchomienia projektu dla STM32F030 i (prawdopodobnie ręcznie) dodanego folderu bibliotek ze stm32f0xx.h, który definiuje ADC1_IRQn (numer kanału IRQ używany w konfiguracji NVIC).

I wdrożone ADC1_IRQHandler (void) w moim main.c (jak jestem przyzwyczajony do i zawsze pracował tak daleko - x_IRQn -> x_IRQHandler)

Ale po 2 dniach frustracji, dowiedziałem się, to startup_stm32f0xx.s w moim projekcie definiuje ADC1_COMP_IRQHandler.

Tak więc, w końcu mój przerywacz przerwań ADC był niezdefiniowany i kiedy ADC wygenerował przerwanie, program się zawiesił (przerwanie WWDG).

Mam nadzieję, że pomoże to osobom takim jak ja, które uważają, że wdrożyły swój program obsługi, ale w rzeczywistości nie.