logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

STM32F107RCT6 - [OpenOCD+eclipse]- Hard Fault w EXTI4_IRQHandler

darknovismc 17 Sty 2013 19:16 1902 3
REKLAMA
  • #1 11803011
    darknovismc
    Poziom 10  
    Posty: 26
    Witam,
    Po otrzymaniu przerwania od zewnętrznego przetwornika wchodzę do funkcji:
    void EXTI4_IRQHandler(void)
    {
    int b;
    b = c+d;
    //inna_funkcja(&b);
    if(EXTI_GetITStatus(EXTI_Line4) != RESET)
    {
    EXTI_ClearITPendingBit(EXTI_Line4);
    }
    }
    Program przechodzi przez dwie pierwsze instrukcje int b;b = c+d;.Po wykonaniu trzeciej czyli wywołaniu funkcji bibliotecznej EXTI_GetITStatus(..)
    licznik rozkazów zamiast do ciała ww. funkcji trafia do Hard_Fault_Handler.
    To samo się dzieje jeżeli zadeklaruję jakąkolwiek inną funkcję i wywołam ją z void EXTI4_IRQHandler(void). W moim projekcie korzystam z przykładu stm32cl_blink_led ze stronki freddiego chopina.
    Dołożyłem do tego pliki biblioteki standard peripheral library , stm32f10.h , core_cm3.c.
    Wydaje się to być problem nieprawidłowego odkładania licznika rozkazów na stosie albo alokacji wektora przerwań.
    Proszę o pomoc szczególnie freddiego chopina ponieważ jest autorem plików linkera, startup-a i wektora przerwać(vectors.c), które w innych projektach jak dotąd działałają mi niezawodnie.
  • REKLAMA
  • #2 11803061
    BlueDraco
    Specjalista - Mikrokontrolery
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    Zgaduję, że albo brak stosu, albo brak atrybutu interrupt przy deklaracji procedury, który niestety powinien być w przypadku STM32F1, jak to niedawno wyszło.
  • REKLAMA
  • Pomocny post
    #3 11803177
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    darknovismc napisał:
    Proszę o pomoc szczególnie freddiego chopina ponieważ jest autorem plików linkera, startup-a i wektora przerwać(vectors.c), które w innych projektach jak dotąd działałają mi niezawodnie.

    Zajrzyj do skryptu linkera, przeczytaj ze zrozumieniem jego początkowy fragment, ustaw tak jak trzeba i będzie działać.

    Kluczową sprawą jest przyswojenie sobie tego fragmentu:
    Cytat:
    /* Handler mode (core exceptions / interrupts) can use only main stack */
    /* Thread mode can use main stack (default) or process stack - selected in CONTROL special register */


    ... i odpowiednia konfiguracja oczywiście [;

    4\/3!!
  • #4 11816702
    darknovismc
    Poziom 10  
    Posty: 26
    Zmiana rozmiarów stosów z:
    __main_stack_size = 0;
    __process_stack_size = 1024;

    na :

    __main_stack_size = 1024;
    __process_stack_size = 2048;

    rozwiązała problem. Ruszyłem dalej z projektem. Dziękuję bardzo za pomoc.
REKLAMA