Skocz do zawartości

Struktura projektu - STM32F103RB Nucleo


Serpine

Pomocna odpowiedź

Witam wszystkich,

piszę do w związku ze strukturą projektu (pliki nagłówkowe, biblioteki itd.).

Z pomocą kursu STM32 stworzyłem program który przez USART wysyła temperaturę rdzenia, wartość ADC, napięcie obliczone z potencjometru, stan diody oraz czyści w przerwaniu okienko terminala po naciśnięciu przycisku.

Teraz chcę dowiedzieć się się jakim taktowaniem traktowane są poszczególne moduły (ADC itd.) oraz stworzenie takiej struktury aby w main.c było jak najmniej kodu. O ile z tym pierwszym problemu dużego nie ma (pokłony dla dokumentacji z którą jest straszny problem przy np. atmegach), to ze strukturą plików i pomysłem jak to zrobić, już jest.

Stworzyłem w projekcie folder Library i pierwszy plik gpio.c, domyślnie ma ich być kilka, np adc.c, irq.c itd. i w tym momencie potrzebuję pomocy, jak to ma w środku wszystko wyglądać abym jedną linijką w main.c uruchamiał cały moduł GPIO który swoje ustawienia (pin, tryb, linia) czerpie z pliku w którym mam to zadeklarowane. Póki co napisałem coś takiego:

void GPIOInit(GPIO_TypeDef *portLine, GPIOMode_TypeDef pinNum, GPIOMode_TypeDef pinMode){

//GPIO_InitTypeDef gpio;
GPIO_StructInit(&gpio);

if(pinNum == GPIO_Pin_0 || GPIO_Pin_1 || GPIO_Pin_2 || GPIO_Pin_3 || GPIO_Pin_4 || GPIO_Pin_5|| GPIO_Pin_6 || GPIO_Pin_7 || GPIO_Pin_8 || GPIO_Pin_9 || GPIO_Pin_10 || GPIO_Pin_11 || GPIO_Pin_12 || GPIO_Pin_13 || GPIO_Pin_14 || GPIO_Pin_15){
   gpio.GPIO_Pin = pinNum;
}

if(pinMode == GPIO_Mode_AIN || GPIO_Mode_IN_FLOATING || GPIO_Mode_IPD || GPIO_Mode_Out_OD || GPIO_Mode_Out_PP || GPIO_Mode_AF_OD || GPIO_Mode_AF_PP){
   gpio.GPIO_Mode = pinMode;
}

if(portLine == GPIOA || GPIOB || GPIOC || GPIOD){
   GPIO_Init(portLine, &gpio);
}
}

Niestety eclipse wyrzuca multiple definition of'GPIOInit' a jak zmieniam nazwę funkcji na coś innego niż GPIOInit to wyskakuje identyczny błąd, więc jest ona tylko w tym miejscu. Jestem dopiero adeptem w tej dziedzinie i nie mam na tak dużego doświadczenia żeby sobie z tym poradzić, dlatego proszę o pomoc 🙂 Będę zadowolony chociaż z prostych wskazówek co robić, co zmienić...

Link do komentarza
Share on other sites

W języku C nie należy włączać plików z kodem źródłowym (*.c) za pomocą dyrektywy #include. Po to są pliki nagłówkowe (*.h), żeby w nich były deklaracje (czyli nazwy funkcji, ale bez kodu).

Powinno być:

#include "gpio.h"
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

if(pinNum == GPIO_Pin_0 || GPIO_Pin_1 || GPIO_Pin_2 || GPIO_Pin_3 || GPIO_Pin_4 || GPIO_Pin_5|| GPIO_Pin_6 || GPIO_Pin_7 || GPIO_Pin_8 || GPIO_Pin_9 || GPIO_Pin_10 || GPIO_Pin_11 || GPIO_Pin_12 || GPIO_Pin_13 || GPIO_Pin_14 || GPIO_Pin_15){
   gpio.GPIO_Pin = pinNum;
}

Poczytaj sobie lepiej jak działają operatory logiczne lub bitowe (i jakie mają priorytety), bo jak już uda Ci się skompilować ten program to zaczniesz narzekać, że źle działa.

Link do komentarza
Share on other sites

Jako plik nagłówkowy działa, wgrywa się na płytkę ale nie działa przycisk USER na pinie 13, wejście analog input od potencjometru czy USART działają... (są one też ustawione przez GPIO)

EDIT. Faktycznie, z operatorami poknociłem coś, troszkę wstyd.

EDIT2. Jutro przepiszę to do switch case, jest jeszcze jakiś sposób aby wrzucić to do jakiejś biblioteki a nie do pliku nagłówkowego?

EDIT3. Dobra, podstawowe błędy. Poradziłem sobie.

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!

Gość
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.