W poprzednich częściach omówiliśmy jak utworzyć projekt oparty o StdPeriph, a następnie usunąć z niego niechcianą bibliotekę. Teraz utworzymy projekt bez biblioteki i dodamy do niego niezbędne pliki, aby uzyskać działający program.
Zaczynamy jak zwykle od utworzenia projektu w OpenSTM32, tym razem jednak wybierzemy opcję "No firmware" w oknie konfiguracji projektu.
W tak przygotowanym projekcie znajdziemy raptem kilka plików:
Poza tym na dysku znajdziemy oczywiście sam projekt dla Eclipse. Niestety próba kompilacji zakończy się niepowodzeniem. Nie powinniśmy być zaskoczeni, w końcu nasz program nie zawiera funkcji main.
Wykorzystamy nasz plik src/main.c z poprzednio przetestowanego przykładu. Po prostu kopiujemy potrzebny nam plik do nowego projektu - później dodamy kolejne brakujące.
Teraz próba kompilacji zakończy się komunikatem o braku pliku nagłówkowego stm32f10x.h
Plik ten zawiera definicje charakterystyczne dla naszego mikrokontrolera. Moglibyśmy napisać go sami, ale znacznie łatwiej wykorzystać gotowe rozwiązanie.
W poprzednim projekcie plik stm32f10x.h znajdziemy w folderze CMSIS/device. Możemy utworzyć taki folder w nowym projekcie i dodać go do ścieżki kompilatora, albo po prostu skopiować go do katalogu inc. Ja wykorzystam drugą opcję.
Dalej postępujemy podobnie, czyli próbujemy kompilować projekt i dodajemy brakujące pliki:
Jak widać musimy zdefiniować do jakiej rodziny układów należy nasz procesor. Odpowiednią informację znajdziemy w dokumentacji STM32F103 - nasz układ to klasa średnia czyli medium density.
Musimy więc dodać definicję stałej STM32F10X_MD. W tym celu z menu Project wybieramy Properties, a następnie odnajdujemy opcję "MCU GCC Compiler"->Preprocessor. W oknie ze zdefinowanymi symbolami (Defined symbols) widzimy obecnie zdefiniowane stałe - dodajemy nową wartość STM32F10X_MD.
Teraz mamy ostatni błąd do poprawienia:
Ponieważ nie mamy i nie chcemy mieć pliku system_stm32f10x.h, usuwamy linijkę powodującą błąd.
Kompilujemy program i możemy cieszyć się sukcesem:
Oczywiście sprawdzamy czy program działa - wszystko działa jak poprzednio, a my możemy zobaczyć, że do migania diodą wystarczyło raptem 7 plików zamiast całej dużej biblioteki.
W rzeczywistości mamy w projekcie 8 plików, ale startup/sysmem.c jest potrzebne tylko jeśli chcielibyśmy wykorzystywać dynamiczną alokację pamięci funkcją malloc. Skoro tego nie używamy, rownież plik sysmem.c możemy usunąć.
Nasz projekt nadal nie jest w pełni minimalistyczny, ale na potrzeby poznawania mikrokontrolera STM32103 powinien nam wystarczyć. Do tego co jeszcze można z projektu wyrzucić jeszcze wrócimy.
Teraz czas poznać nasz procesor oraz zrozumieć magiczne liczby które wprowadziliśmy w programie przykładowym.
Zaczynamy jak zwykle od utworzenia projektu w OpenSTM32, tym razem jednak wybierzemy opcję "No firmware" w oknie konfiguracji projektu.
W tak przygotowanym projekcie znajdziemy raptem kilka plików:
- startup/startup_stm32.s - plik startowy w asemblerze
- startup/sysmem.c - funkcja pomocnicza dla wywołania malloc
- LinkerScript.ld - skrypt linkera
Poza tym na dysku znajdziemy oczywiście sam projekt dla Eclipse. Niestety próba kompilacji zakończy się niepowodzeniem. Nie powinniśmy być zaskoczeni, w końcu nasz program nie zawiera funkcji main.
Wykorzystamy nasz plik src/main.c z poprzednio przetestowanego przykładu. Po prostu kopiujemy potrzebny nam plik do nowego projektu - później dodamy kolejne brakujące.
Teraz próba kompilacji zakończy się komunikatem o braku pliku nagłówkowego stm32f10x.h
../src/main.c:1:23: fatal error: stm32f10x.h: No such file or directory
#include "stm32f10x.h"
Plik ten zawiera definicje charakterystyczne dla naszego mikrokontrolera. Moglibyśmy napisać go sami, ale znacznie łatwiej wykorzystać gotowe rozwiązanie.
W poprzednim projekcie plik stm32f10x.h znajdziemy w folderze CMSIS/device. Możemy utworzyć taki folder w nowym projekcie i dodać go do ścieżki kompilatora, albo po prostu skopiować go do katalogu inc. Ja wykorzystam drugą opcję.
Dalej postępujemy podobnie, czyli próbujemy kompilować projekt i dodajemy brakujące pliki:
- CMSIS/core/core_cm3.h
- CMSIS/core/core_cmInstr.h
- CMSIS/core/core_cmFunc.h
Teraz zobaczymy nieco inny komunikat o błędzie:
/Users/pbugalski/Documents/workspace_stm32/stm32_04/inc/stm32f10x.h:102:3: error: #error "Please select first the target STM32F10x device used in your application (in stm32f10x.h file)"
#error "Please select first the target STM32F10x device used in your application (in stm32f10x.h file)"
Jak widać musimy zdefiniować do jakiej rodziny układów należy nasz procesor. Odpowiednią informację znajdziemy w dokumentacji STM32F103 - nasz układ to klasa średnia czyli medium density.
Musimy więc dodać definicję stałej STM32F10X_MD. W tym celu z menu Project wybieramy Properties, a następnie odnajdujemy opcję "MCU GCC Compiler"->Preprocessor. W oknie ze zdefinowanymi symbolami (Defined symbols) widzimy obecnie zdefiniowane stałe - dodajemy nową wartość STM32F10X_MD.
Teraz mamy ostatni błąd do poprawienia:
/Users/pbugalski/Documents/workspace_stm32/stm32_04/inc/stm32f10x.h:489:30: fatal error: system_stm32f10x.h: No such file or directory
#include "system_stm32f10x.h"
Ponieważ nie mamy i nie chcemy mieć pliku system_stm32f10x.h, usuwamy linijkę powodującą błąd.
Kompilujemy program i możemy cieszyć się sukcesem:
Oczywiście sprawdzamy czy program działa - wszystko działa jak poprzednio, a my możemy zobaczyć, że do migania diodą wystarczyło raptem 7 plików zamiast całej dużej biblioteki.
W rzeczywistości mamy w projekcie 8 plików, ale startup/sysmem.c jest potrzebne tylko jeśli chcielibyśmy wykorzystywać dynamiczną alokację pamięci funkcją malloc. Skoro tego nie używamy, rownież plik sysmem.c możemy usunąć.
Nasz projekt nadal nie jest w pełni minimalistyczny, ale na potrzeby poznawania mikrokontrolera STM32103 powinien nam wystarczyć. Do tego co jeszcze można z projektu wyrzucić jeszcze wrócimy.
Teraz czas poznać nasz procesor oraz zrozumieć magiczne liczby które wprowadziliśmy w programie przykładowym.
Udało mi się tego dokonać, przeskok jest znaczący. Projekt z biblioteki STD zmalał z 14 MB do 1,5 MB już ze skompilowanym kodem elf i bin. Mam tylko problem bo w main.c muszę podawać nieco dłuższą ścieżkę w include,
OdpowiedzUsuń#include "../inc/stm32f10x.h" bo inaczej nie widzi tego pliku.
Dzięki za powyższy przykład:) Właśnie tego szukałem:) Szkoda że nie rozwijasz dalej tego bloga...
OdpowiedzUsuńPozdrawiam