Autor: Marek Skalski
Redakcja: Dondu
Do programowania 32-bitowych mikrokontrolerów opartych na rdzeniu ARM Cortex-Mx, można używać kilku środowisk. Jednym z nich jest CooCox, czyli bezpłatne oraz łatwe w konfiguracji i użytkowaniu IDE oparte na Eclipse.
Tworzenie nowego projektu w CooCox wiąże się z mało komfortową sytuacją, ponieważ:
- plik main.c jest zupełnie pusty,
- po dodaniu plików startowych, należy wykonać kilka modyfikacji ustawień w plikach, aby umożliwić prawidłową pracę uC.
Każdorazowe wykonywanie tych samych czynności jest stratą czasu. Z tego powodu pojawił się pomysł opracowania szablonu, który już na wstępie prawidłowo konfiguruje podstawowe ustawienia uC i zawiera szablon głównej pętli programu z obsługą cyklicznych przerwań od SysTick.
Do pobrania: stm32f4-discovery.zip (kopia)
W powyższym pliku znajdują się:
main.c – plik z szablonem pętli głównej
cmsis_boot – folder zawierający:
- stm32f4xx.h – plik opisujący strukturę wewnętrzną układów STM32F4xx,
- stm32f4xx_conf.h – plik zawierający ustawienia konfiguracyjne projektu,
- folder startup i plik startup_stm32f4xx.c – zawierający kluczowe ustawienia i realizujący start systemu od resetu do wejścia w funkcję main();
- stm32f4xx_it.h – plik zawierający definicje funkcji obsługi wyjątków oraz przerwań,
- stm32f4xx_it.c – plik zawierający funkcje obsługi wyjątków, przerwań oraz funkcje pomocnicze,
- board_stm32f4discovery.h – plik zawierający definicje sprzętowej struktury systemu rozwojowego,
- board.c_stm32f4discovery – plik zawierający funkcje obsługi sprzętowej systemu (konfiguracja portów I/O, inicjalizacja peryferiów, sterowniki odwołujące się do rejestrów, itp.)
- ponadto istnieją jeszcze 2 fantomy (puste pliki) o nazwach system_stm32f4xx.h, system_stm32f4xx.c. Ich obecność może być konieczna, aby uniknąć błędu podczas dodawania plików z Repozytorium. IDE zapamiętuje ilość i nazwy plików w poszczególnych folderach Repozytorium, przy pierwszej próbie tworzenia nowego projektu dla wybranego uC. Puste pliki można usunąć z drzewa i folderu projektu po ich załadowaniu z Repozytorium.
Warunkiem korzystania z szablonu przeznaczonego dla uC z rodziny STM32F4xx jest posiadanie poprawnie zainstalowanego IDE CooCox w wersji 1.7.x. W dniu pisania opisu aktualna była wersja 1.7.6.
Wymagane foldery:
- 54_M4 CMSIS Core
- 500_CMSIS BOOT
Aktualnie wersja 1.7.6 nie posiada pełnego repozytorium dla uC STM32F417IG oraz STM32F417VG.
Rozwiązaniem jest przygotowanie nowego projektu dla np.STM32F407IG, a następnie zmiana układu.
Plik main.c należy umieścić w folderze: ...\CooCox\CoIDE\Library\example (zastąpić istniejący main.c)
Folder cmsis_boot należy umieścić w folderze: ...\CooCox\CoIDE\repo\Components\500_CMSIS BOOT\src (usunąć istniejący i wkleić dołączony do szablonu)
Tworząc nowy projekt, należy:
- wybrać lokalizaję oraz wpisać nazwę projektu,
- wybrać wariant CHIP,
- wybrać uC z rodziny ST, a następnie STM32F4xx, następnie np. STM32F407VG,
- zatwierdzić wybór przez kliknięcie Finish,
- w Repozytorium (Step 3) kliknąć CMSIS BOOT w obszarze BOOT, co spowoduje dodanie do projektu folderu cmsis_boot,
- automatycznie zostanie zaznaczona linia M4 CMSIS CORE w obszarze COMMON i do projektu zostanie dodany folder cmsis.
Kompilacja szablonu za pomocą gcc-arm-none-eabi-4_8-131204 nie może generować żadnych błędów ani ostrzeżeń
Zużycie pamięci w zależności od poziomu optymalizacji powinno wynosić:
text | data | bss | hex | filename | |
---|---|---|---|---|---|
Program Size @O0: | 2228 | 4 | 2068 | 4300 | Template.elf |
Program Size @O1: | 1748 | 4 | 2068 | 3820 | Template.elf |
Program Size @O2: | 1708 | 4 | 2068 | 3780 | Template.elf |
Program Size @O3: | 2672 | 4 | 2068 | 4744 | Template.elf |
Program Size @Os: | 1620 | 4 | 2068 | 3692 | Template.elf |
Informacje dodatkowe
Szablon nie korzysta z SPL.
Warunkiem poprawnej pracy jest jedynie dołączenie bibliotek cmsis (obecne w CooCox) oraz pliku definicji stm32f4xx.h (zawarty w szablonie).
Wielkość stosu ustala się w 71. linii pliku startup_stm32f4xx.c:
#define STACK_SIZE
Częstotliwość kwarcu podłączonego do HSE ustala się w 86. linii pliku stm32f4xx_conf.c:
#define HSE_VALUE
HSE_VALUE zachowano ze względu na zgodność z innymi funkcjami i/lub programami, w których mogą wystąpić odwołania do tej wartości.
Częstotliwość taktowania rdzenia ustala się w 90. linii pliku stm32f4xx_conf.c:
#define FREQUENCY
Nazwa przyjęta arbitralnie.
Po skonfigurowaniu zegarów, zmienna SystemCoreClock jest inicjowana wartością odpowiadającą częstotliwości taktowania rdzenia mikrokontrolera, typowo 168 000 000.
Konfiguracja Wait States dla pamięci programu jest wywoływana w 456. linii pliku startup_stm32f4xx.c.
Konfiguracja systemu zegarów dla uC jest wywoływana w 457. linii pliku startup_stm32f4xx.c.
Struktura odwołań między plikami szablonu.
Rys.1. Struktura odwołań między plikami szablonu. |
board.h | plik nagłówkowy zawierający programowy opis platformy sprzętowej (PCB) |
stm32f4xx.h | zmodyfikowany plik nagłówkowy zawierający programowy opis uC z rodziny STM32F4xx |
stm32f4xx_conf.h | zmodyfikowany plik nagłówkowy zawierający ustawienia projektu i sprzętu |
stm32f4xx_it.h | zmodyfikowany plik nagłówkowy zawierający szablon obsługi przerwań i wyjątków |
startup_stm32f4xx.c | zmodyfikowany plik zawierający ustawienia oraz funkcje uruchamiane po resecie, a przed wywołaniem funkcji main() |
board.c | plik zawierający funkcje obsługi platformy sprzętowej |
main.c | plik zawierający funkcję główną oraz funkcje dodatkowe programu |
stm32f4xx_it.c | plik zawierający funkcje obsługi przerwań i wyjątków |
Będzie więcej takich artykułów o STM32f4?
OdpowiedzUsuńDzięki za artykuł.
OdpowiedzUsuńJak wynalazłeś, które foldery w repo są podpięte właśnie do tego procka/płytki w Coocoxie?
Mogę napisać trochę więcej na temat STM32F4xx, ale musimy określić jakiś kierunek. Przepisywanie RM czy SPL'a nie generuje wartości dodanej, a pisanie kolejnego poradnika jak skonfigurować zegary albo włączyć przerwanie od TIMx to chyba nie dla mnie ;)
OdpowiedzUsuńCzekam na propozycje? Może zrobimy ankietę?
Foldery przeszukałem na okoliczność występowania plików opisu uC (stm32f4xx.h) oraz cmsis. Później było już z górki: wyciąłem wszystko co dotyczyło SPL'a i nieużywanych funkcji, przyjąłem strukturę plików jak w projektach MCP dla dsPIC33 i tak już zostało. Na własny użytek mam już nieco lepszą wersję szablonu, ale jest na płytkę Waveshare Open 407-IC, a do tego jest pozbawiona komentarzy. Z tego powodu zdecydowałem się opublikować tylko starszą wersję, która z założenia jest przygotowana dla płytek Discovery, które są bardziej popularne, więc też dla Was większy pożytek z takiego pakietu. Z drugiej strony, plik opisu warstwy sprzętowej pozwala łatwo dopasować szablon do dowolnej platformy.
Pozdrawiam,
Marek
Myślę, że od takich prostych rzeczy też warto zacząć bo manual jest mało przejrzysty.
OdpowiedzUsuńJeśli jesteś w stanie to napisz proszę o nowszej serii np. STM32F429 opisując szczegółowo control clock dla tej rodziny, bo bez rozumienia tego tematu trudno konfigurować zegary dla poszczególnych peryferii ....i konfigurować pliki startowe. Jak ktoś dopiero zaczyna to jest jeden z większych koszmarów. Generalnie najlepiej by było gdyby w ogóle napisać jak taki mikroprocesor wstaje po resecie i co po kolei ładuje i jak to konfigurować , bo doczytać to z manuali od ST i zrozumieć jest trudno jeśli ktoś jeszcze w ARMach nie grzebał ...
OdpowiedzUsuńWitaj Anonimowy,
OdpowiedzUsuńKonfiguracja zegarów w STM32F4xx nie jest szczególnie prosta, ale w oparciu o schemat dystrybucji zegarów z RM0090 (rev.7), można to dość szybko opanować. Jak już proponowałem wcześniej, spróbujmy określić bazę sprzętową i kierunek, w którym miałby taki kurs prowadzić. Mogę przygotować szablon z pełnym opisem dla STM32F429, który jest na płytce DISCO, ale co dalej? Nawet nie wiem czy ktoś korzysta z zamieszczonego tutaj szablonu i jakie są uwagi. Jeżeli nie wiesz jak ustawić zegary, to pisz na Forum. Jest wiele osób, które wiedzą co i jak. Ja też pomogę jak zobaczę temat.
Aktualnie zajmuję się usb audio na kilka kanałów, ale to chyba nikogo nie interesuje.
Pozdrawiam, Marek
Ten komentarz został usunięty przez administratora bloga.
OdpowiedzUsuńPrzekazałem pytanie autorowi artykułu.
Usuń... komentarz usunąłem, bo był w nim adres email.
UsuńTen komentarz został usunięty przez administratora bloga.
OdpowiedzUsuńKomentarz usunąłem, bo był w nim adres email. Z autorem tego artykułu można się skontaktować na Elektrodzie pod nickiem: Marek_Skalski
Usuń