Elektroda.pl
Elektroda.pl
X
CControls
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[Rozwiązano] STM32F103C8T6+HAL+CUBE brak przerwania od SysTick

baxter007 06 Gru 2018 13:53 495 12
  • #1 06 Gru 2018 13:53
    baxter007
    Poziom 10  

    Witam,
    Jakiś czas temu używałem dosyć często przerwania co 1ms od SysTick i wysztko było w porządku. Aktualnie już pare godzin szukam problemu dlaczego nie otrzymuję przerwania od tego timera. Skonfigurowany przez CUBE czyli HAL_SYSTICK_Config(f zegara/1000) = w moim przypadku 24000. Funkcja inicjalizyje i startuje timer, niestety nie wykonuje się funkcja:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    a co za tym idzie
    Kod: c
    Zaloguj się, aby zobaczyć kod

    też nie.
    Czy coś zostaje niedopatrzone albo pominięte, jak myślicie ?

    0 12
  • CControls
  • #2 06 Gru 2018 14:28
    stmx
    Poziom 16  

    1. Brak kodu co uniemozliwia jakakolwiek ocene

    0
  • CControls
  • #3 06 Gru 2018 15:12
    LChucki
    Poziom 17  

    W jaki sposób stwierdzasz, ze przerwanie nie wykonuje się? Debugerem?

    0
  • #4 07 Gru 2018 08:04
    baxter007
    Poziom 10  

    HCLK = 24MHz , Cube w funkcji void SystemClock_Config(void) ustawia SysTick w taki sposób:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    rozumiem , że to wystarczy aby SysTick wystartował i dawał przerwanie co 1ms czyli powinien wykonać :
    Kod: c
    Zaloguj się, aby zobaczyć kod

    co za tym idzie :
    Kod: c
    Zaloguj się, aby zobaczyć kod

    oraz:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Pin C13 na starcie ustawiony jest w stan niski i tak pozostaje. W taki sposób domyślam się że nie wykonuje się funkcja od przerwania SysTick. Co mogłem przeoczyć ?

    0
  • #5 07 Gru 2018 08:29
    Freddie Chopin
    Specjalista - Mikrokontrolery

    baxter007 napisał:
    Pin C13 ... Co mogłem przeoczyć ?

    Małe cyferki odsyłaczy przy opisie pinu PC13 w datasheecie.

    Przy okazji istotne jest rozszerzenie pliku w którym masz to przerwanie - czy jest to plik C czy C++.

    0
  • #6 07 Gru 2018 09:26
    stmx
    Poziom 16  

    Tego kodu dalej mało. Czy masz debugger?. Jeżeli konfiguracja jest tylko przez HAL to musi dzialac (chyba że kompilujesz jako C++.

    Ustaw też zmianę tego pinu w obsłudze HF. Zobaczymy czy tam nie ladujesz na dzień dobry

    0
  • #7 07 Gru 2018 09:26
    baxter007
    Poziom 10  

    Dzięki bardzo za odpowiedź, funkcja :

    Kod: c
    Zaloguj się, aby zobaczyć kod

    już się wykonuje , ale
    Kod: c
    Zaloguj się, aby zobaczyć kod
    dalej nie

    0
  • #8 07 Gru 2018 10:28
    stmx
    Poziom 16  

    Pisałem o hard fault handler. Tam ustaw zmianę pinu albo breakpoint debugerra. Standardowo masz łatwo bo wszystkie kończą w jednej funkcji zwanej default handler

    0
  • #9 07 Gru 2018 11:18
    baxter007
    Poziom 10  

    Tak jak piszesz dodałem zmiane pinu który pierwotnie jest w stanie wysokim do:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    i się nie zmienia. Oto co się wykona :
    Kod: c
    Zaloguj się, aby zobaczyć kod


    a to już nie :
    Kod: c
    Zaloguj się, aby zobaczyć kod


    funkcja SysTick_Handler znajduje się w pliku stm32f1xx_it.c
    funkcje HAL_SYSTICK_IRQHandler oraz HAL_SYSTICK_Callback w stm32f1xx_hal_cortex.c
    być może funcję HAL_SYSTICK_Callback w pliku main.c powinienem wywołać inaczej niż to robię ? konsola wyrzuca 'HAL_SYSTICK_Callback' defined but not used ?

    0
  • #10 07 Gru 2018 11:48
    stmx
    Poziom 16  

    Pokaz cale main.c

    gdzies zadeklarowales ja jako static.

    HAL wola funkcje nie static która jest w innym pliku. I dlatego Ci nie dziala (tak w uproszczeniu).

    0
  • #11 07 Gru 2018 12:32
    baxter007
    Poziom 10  

    W main.c czarów nie ma , bo stworzyłem nowy projekt golasa na potrzebę uproszczenia szukania problemu. Nie jestem programistą ani elektronikiem ,a do sprawy podchodzę hobbistycznie jako początkujący. Korzystam z System Workbenach for stm32 + Stm32CubeMX z bibliotekami HAL. Cube szykuje wszystko po czym ja tylko dodaję funkcję HAL_SYSTICK_Callback.
    plik main.c

    Kod: c
    Zaloguj się, aby zobaczyć kod

    część pliku stm32f1xx_it.c
    Kod: c
    Zaloguj się, aby zobaczyć kod


    oraz część pliku stm32f1xx_hal_cortex.c
    Kod: c
    Zaloguj się, aby zobaczyć kod


    gdy podstawiam moją zmianę poziomu na pinie w funkcji void SysTick_Handler(void) czy void HAL_SYSTICK_IRQHandler(void) czy tez __weak void HAL_SYSTICK_Callback(void) to działa, ale w main.c void HAL_SYSTICK_Callback(void) juz nie. z góry dzięki

    0
  • Pomocny post
    #12 07 Gru 2018 13:10
    stmx
    Poziom 16  

    A kto definiuje funkcje wewnatrz main?

    Tzw "nested functions" to jest rozszerzenie gcc, tak zadeklarowana funkcja jest lokalnie widoczna w scope funkcji, w której jest zadeklarowana. Tak ze wywołujesz te "weak"

    przenieś ja poza funkcje main.

    baxter007 napisał:
    W main.c czarów nie ma
    Czyli jednak są. Wywal te miliony komentarzy i pustych linii z funkcji. Przez to zaciemniasz sobie obraz.

    0
  • #13 07 Gru 2018 13:35
    baxter007
    Poziom 10  

    Heh,
    tyle czasu zmarnowane, tak to jest jak się odgrzewa kotlety po kilku latach. dzięki bardzo.

    0