Ozzi Napisano Maj 19, 2018 Udostępnij Napisano Maj 19, 2018 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. Cytuj Link do komentarza Share on other sites More sharing options...
NOwincjusz Lipiec 19, 2018 Udostępnij Lipiec 19, 2018 dlaczego nie masz deklaracji funkcij? void EXTI15_10_IRQHandler(void) Cytuj Link do komentarza Share on other sites More sharing options...
Gość es2 Lipiec 19, 2018 Udostępnij Lipiec 19, 2018 dlaczego nie masz deklaracji funkcij? void EXTI15_10_IRQHandler(void) Bo nie ma takiej potrzeby. Cytuj Link do komentarza Share on other sites More sharing options...
NOwincjusz Lipiec 19, 2018 Udostępnij Lipiec 19, 2018 '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. Cytuj Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. 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 Lipiec 19, 2018 Udostępnij Lipiec 19, 2018 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. Cytuj Link do komentarza Share on other sites More sharing options...
NOwincjusz Lipiec 19, 2018 Udostępnij Lipiec 19, 2018 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 Cytuj Link do komentarza Share on other sites More sharing options...
ethanak Lipiec 20, 2018 Udostępnij Lipiec 20, 2018 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. Cytuj Link do komentarza Share on other sites More sharing options...
Gość es2 Lipiec 20, 2018 Udostępnij Lipiec 20, 2018 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ę? Cytuj Link do komentarza Share on other sites More sharing options...
Elvis Lipiec 20, 2018 Udostępnij Lipiec 20, 2018 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. Cytuj Link do komentarza Share on other sites More sharing options...
ethanak Lipiec 20, 2018 Udostępnij Lipiec 20, 2018 @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. Cytuj Link do komentarza Share on other sites More sharing options...
Gość es2 Lipiec 20, 2018 Udostępnij Lipiec 20, 2018 Różnica taka jak pomiędzy zmienna; a int zmienna; Cytuj Link do komentarza Share on other sites More sharing options...
ethanak Lipiec 20, 2018 Udostępnij Lipiec 20, 2018 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)? Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
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!