Skocz do zawartości

Problem z Kursem - Przerwania od przycisków w STM32


Ozzi

Pomocna odpowiedź

Cześć jestem tutaj nowy i potrzebowałbym małej pomocy moi drodzy 🙂 Mam problem z "Kurs STM32 F1 HAL – #4 – sterowanie GPIO w praktyce" z podroździałem "Przerwania od przycisków w STM32" mianowicie nie mogę skompilować programu:

#include "stm32f1xx.h"

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)

{

HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5); // zmień stan diody

}

int main(void)

{

SystemCoreClock = 8000000; // taktowanie 8Mhz

HAL_Init();

__HAL_RCC_GPIOA_CLK_ENABLE();

__HAL_RCC_GPIOC_CLK_ENABLE();

GPIO_InitTypeDef gpio;

gpio.Mode = GPIO_MODE_OUTPUT_PP;

gpio.Pull = GPIO_NOPULL;

gpio.Pin = GPIO_PIN_5;

gpio.Speed = GPIO_SPEED_FREQ_LOW;

HAL_GPIO_Init(GPIOA, &gpio);

gpio.Mode = GPIO_MODE_IT_RISING_FALLING;

gpio.Pull = GPIO_PULLUP;

gpio.Pin = GPIO_PIN_13;

HAL_GPIO_Init(GPIOC, &gpio);

HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);

while (1)

{

}

}

Tak jak jest napisane umieszczam w stm32f1xx_it.c funkcję (trzeba ją jakoś zapisać? ja to tylko wkleiłem i tyle):

void EXTI15_10_IRQHandler(void)

{

HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13);

}

Ale cały czas mam te same błędy =( :

'EXTI15_10_IRQ' undeclared (first use in this function)

make: ***[scr/main.o] Error 1

recipe for target 'src/main.o' failed

Symbol 'EXIT15_10_IRQ' could not be resolved

Dodam, że nie posiadam NUCLEO-F103RB tylko NUCLEO-F030R8. Zmieniałem zawsze #include "stm32f1xx.h na stm32f0xx.h i wszystko działa. Nie mam zielonego pojęcia dlaczego to nie chce działać. Może ktoś zna odpowiedź na to? Z góry dziękuję i pozdrawiam 🙂

__________

Komentarz dodany przez: Treker

Kody programów należy umieszczać przez narzędzie KOD (znajdziesz je w edytorze pod ikonką "<>"). Dzięki niemu składania programów jest automatycznie kolorowana, a wtedy wszystkim znacznie łatwiej analizować wklejone programy. Proszę to poprawić - z góry dziękuję za zrozumienie i pomoc przy utrzymaniu porządku na forum.

Link do komentarza
Share on other sites

'EXTI15_10_IRQ' undeclared (first use in this function)
no dziwne, bo w całym kodzie jaki wkleiłeś niema, czegoś takiego jak EXTI15_10_IRQ :/ no i się, tak zastanawiam, jak kompilator, może czegoś nie widzieć, czego niema.
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

Gość es2

W C, funkcji "void nazwa_funkcji(void) "nie trzeba deklarować. Oczywiście można ustawic kompilator tak aby dawał ostrzeżenie.

Nie trzeba tez deklarować funkcji z parametrami czy zwierającymi wartość ale pod warunkiem, że wywołana będze w dalszej części kodu. Tak samo jest w Pascalu.

Link do komentarza
Share on other sites

Ja tam się dopiero uczę, ale wydawało mi się, ze kompilator musi widzieć definicję lub jej samą deklarację przed wywołaniem.

A jak wejdziesz w #include "stm32f1xx.h" to znajdujesz EXTI15_10_IRQ ? Zastanawia mnie to, dlaczego o takie cos krzyczy, skoro w ogole takiego czegos niema w Twoim kodzie

Link do komentarza
Share on other sites

Zobacz - tyle lat w C programuję a czegoś nowego się dowiedziałem 😉

@es2: Popatrz sobie na kod, zobacz w jakim kontekście użyta jest funkcja a potem zastanów się, skąd biedny kompilator ma z wyprzedzeniem wiedzieć co oznacza dany symbol.

Żeby nie było niedomówień:

a) Deklaracja musi wystąpić przed pierwszym użyciem

b) Wywołanie niezdeklarowanej funkcji powoduje automatyczną deklarację

int funkcja();

a nie

void funkcja(void);

Oczywiście dotyczy to wyłącznie wywołania, a nie sytuacji gdy funkcja jako taka (a nie jej wywołanie) występuje jako element wyrażenia (tak jak w kodzie kolegi wątkotwórcy)

c) Definicja funkcji może być jednocześnie jej deklaracją, oczywiście spełniony musi być warunek a)

Akurat z tego swego czasu egzamin zdawałem 🙂

Tak że bądź łaskaw pouczać kolegów na Onecie a nie tutaj.

Link do komentarza
Share on other sites

Gość es2

Zgadza się

int funkcja(void)

a nie

void funkcja(void)

Widać o 1:45 nie funkcjonuje się gorzej niż o 10:00.

C lubi int, bo domyślnym rozmiarem zmiennej jest int o bliżej nieokreślonym rozmiarze.

[ Dodano: 20-07-2018, 08:39 ]

Tak że bądź łaskaw pouczać kolegów na Onecie a nie tutaj.

Bez uszczypliwości proszę, bo kolega też NIE JEST NIEOMYLNY! A może się mylę?

Link do komentarza
Share on other sites

Ozzi, kurs "Kurs STM32 F1 HAL" został przygotowany i przetestowany na STM32F103. W przypadku podobnych mikrokontrolerów, czyli z F1 prawdopodobnie da się go przejść z niewielkimi zmianami. Natomiast układy STM32 z innych rodzin są po prostu... inne. Kursu nie da się przerobić bez zmian na F4, F7, H7, F0, L4 i innych - to po prostu zupełnie różne układy. Biblioteka HAL miała ukryć różnice między nimi, ale chyba ST nie do końca sobie z tym wyzwaniem poradziła, więc dla każdej grupy dostarcza inną bibliotekę.

Różnice między nimi są może relatywnie małe, ale są - i dla początkującego mogą być znacznym problemem. Chyba najlepiej zacząć od układu opisywanego w kursie, później można przeczytać dokumentację własnego mikrokontrolera i przenosić przykłady. Ale takie przeklejanie kodu jest raczej bez sensu.

Link do komentarza
Share on other sites

@es2: odróżniij

int funkcja();

od

int funkcja(void);

Jeśli nie wiesz to poczytaj sobie, jaka jest różnica między obiema deklaracjami.

BTW nieomylny nie jestem - ale nie upieram się jak osioł przy swoim błędnym zdaniu.

Link do komentarza
Share on other sites

No cóż, mistrzu... może warto wrócić do podstaw i poczytać sobie o deklaracjach funkcji zanim się zacznie autorytatywnie zabierać głos? Czy dalej będziesz lansował swoje teorie na temat jakiegoś tam języka (w sumie trochę podobnego do C)?

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.