Skocz do zawartości

Problem z Kursem - Przerwania od przycisków w STM32


Pomocna odpowiedź

Napisano

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.

  • 2 miesiące później...
Gość es2
dlaczego nie masz deklaracji funkcij?
void EXTI15_10_IRQHandler(void)

Bo nie ma takiej potrzeby.

'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.
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.

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

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.

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ę?

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.

@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.

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)?

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...