Podstawowe zasady tworzenia projektu dla STM32F4 w środowisku uvision 5, z wykorzystaniem zestawu STM32F4-Discovery i bibliotek do obsługi peryferiów dla STM32F4 (Cortex M4), Opis z dnia 06.04.2014 1. Czynności związane z instalacją środowiska MDK, ST Link i biblioteki Zainstalować najnowszą wersję środowiska uvision MDK, firmy Keil dla układów typu ARM. Standardowo pakiet instaluje się na dysku, C:\Keil. UWAGA!! proszę nie używać polskich liter i znaku spacji przy nazwach katalogów (folderów) i plików, które będą używane przez projekt i środowisko uvision. Pobrać i uruchomić instalację sterownika USB dla programatora/debugera STLink (stlink_v2_usbdriver.exe) (http://www.st.com/web/en/catalog/tools/pf258167). Pobrać i zainstalować program STM32 ST-LINK Utility, który służy do programowania mikrokontrolera za pomocą programatora/debugera STLink (stm32_st-link_utility.exe) (http://www.st.com/web/en/catalog/tools/pf258168). Standardowo program się instaluje w katalogu "C:\Program Files\STMicroelectronics\STM32 ST-LINK Utility\". Podkatalog Docs zawiera opis obsługi programu i programatora ST Link. Po poprawnej instalacji i uruchomieniu programu powinno się pojawić okienko jak na rysunku 1. Rys. 1. Okienko programu STM32 ST-Link Podłączyć płytkę STM32F4-Discovery do portu USB komputera za pomocą kabla typu USB A na USB mini B. Komputer wykryje nowe urządzenie i zacznie instalować sterowniki dla ST-Link-a. Jeżeli nie znajdzie sterowników należy wskazać ich miejsce. Jest to katalog, który powstał po uruchomieniu stlink_v2_usbdriver.exe. Po poprawnej instalacji sterowników w menedżerze urządzeń powinno się pojawić nowe urządzenie typu STMicroelectronics STLink dongle, jak na rysunku 2.
Na płytce STM32F4-Discovery powinna świecić dioda od zasilania (PWR), dioda od debugera (COM) i powinny mrugać cztery diody (zielona, czerwona, niebieska, pomarańczowa). Działa wtedy oryginalny program zainstalowany na płytce. Rys.2. Widok menedżera urządzeń po zainstalowaniu STLink Po uruchomieniu programu ST Link i wybraniu z menu Target -> Connect, program łączy się z płytką i wykrywa typ mikrokontrolera i odczytuje zawartość pamięci (rysunek 3). Rys.3. Okienko programu STM32 ST-Link po wykryciu mikrokontrolera na płytce Może się okazać, że oprogramowanie debugera na płytce Discovery wymaga uaktualnienia. Wtedy wybieramy z menu ST-LINK->Firmware update i pojawi się okienko ST-Link Upgrade. Naciskamy Device Connect i program odczyta wersję zainstalowanego oprogramowania (tzw. firmware) oraz wersję, która jest dostępna w programie STM32 ST-Link Utility.
Jeżeli pojawią się problemy z połączeniem i odczytanie wersji (program zgłosi, że należy zresetować urządzenie), należy odłączyć kabel od płytki USB i ponownie podłączyć. Jeżeli wersja firmware Version jest niższa od dostępnej, naciskamy Yes. Komputer PC poprzez port USB wgra nowszą wersję i powinno się pojawić okienko Upgrade is succesful. Wtedy obie wersje firmware są jednakowe (rysunek 4). Rys.4. Okienko do aktualizacji oprogramowania debugera ST Link Wgrywanie nowego firmware jest typową procedurą po zakupie płytki STM32F4-Discovery i jej pierwszym uruchomieniu. Aktualne firmware dla ST-Link-a jest zawsze dostępne na stronie www.st.com. Po aktualizacji oprogramowania może się pojawić problem z połączeniem (komunikat No STLink detected) wtedy należy odłączyć kabel od płytki USB i ponownie podłączyć i wybrać z menu Target -> Connect. Ważne, aby w ST-Link był ustawiony w tryb SWD, można to sprawdzić w Target -> Settings (rysunek 5). Jeżeli jest połączenie pomiędzy płytką a programem to można, np. odczytać zawartość rejestrów, z menu Target -> MCU Core (rysunek 5). Rys.5. Okienko trybu pracy ST Link-a i okienko Core panel Poprawne działanie programu STM32 ST-Link Utility i debugera na płytce wraz podłączonym mikrokontrolerem STM32 F4 umożliwia pracę (programowanie, debugowanie) w środowisku uvision. Jeżeli używamy najnowszej wersji środowiska MDK-ARM, firmy Keil to też należy sprawdzić czy jest zainstalowana najnowsza wersja drivera i oprogramowania debugera ST Link. Driver do ST-Link-a działa poprawienie pod WIN XP, Vista i WIN7. Dla WIN8 należy pobrać osobny driver ze strony http://www.st.com/web/en/catalog/tools/pf251168.
2. Przygotowanie katalogów i plików do projektu Aby skorzystać z środowiska uruchomieniowego uvision, firmy Keil do programowania mikrokontrolerów STM32 w języku C (lub asemblerze) należy stworzyć tzw. projekt, do którego będą dołączone różnego typu pliki. Przed rozpoczęciem pracy z uvision lepiej wcześniej przygotować katalogi i niektóre pliki dla projektu. Przedstawiona poniżej procedura przygotowania projektu jest jedną z możliwych propozycji ustawienia katalogów i plików dla projektu. Można też skorzystać z gotowych ustawień zawartych w katalogach biblioteki lub ustawić według swoich wymagań. Procedura przygotowania ma na celu uporządkowanie katalogów i podkatalogów projektu aby można było łatwo odnajdywać pliki i pisać bardziej zaawansowane projekty oraz łatwo przenosić projekty pomiędzy komputerami. Założeniem zaproponowanej konfiguracji jest to, aby wszystkie potrzebne pliki do projektu znajdowały się w katalogu projektu. Dzięki temu można pracować nad projektem, który jest zapisany np. na pamięci przenośnej. Na wybranym dysku utworzyć nowy katalog dla projektów np. d:\stm32f4. Pobrać bibliotekę STM32F4xx_DSP_StdPeriph_Lib_V1.3 dla STM32F4 z http://www.st.com/web/en/catalog/tools/pf257901 i rozpakować bibliotekę do katalogu d:\stm32f4. Pobrać przykładowe projekty STM32F4-Discovery_FW_V1.1.0 dla płytki STM32F4-Discovery (STM32F4DISCOVERY board firmware package) z http://www.st.com/web/en/catalog/tools/pf257904 i rozpakować do katalogu d:\stm32f4. W katalogu projektów utworzyć nowy katalog np. projekt2. Następnie utworzyć podkatalogi inc, libraries, lst, obj, src, utilities. W katalogu obj będą umieszczane wszystkie pliki po kompilacji, np. plik hex. W inc umieszczamy wszystkie niezbędne plik nagłówkowe typu *.h. Pliki źródłowe w C lub w asemblerze będą w podkatalogu src. Pliki biblioteczne będą w podkatalogu libraries. W lst kompilator umieści pliki z tzw. listingiem. W podkatalogu utilities można wstawić pliki z funkcjami np. do obsługi wyświetlacza LCD. Do tworzenia nowego projektu wykorzystamy gotowe pliki, które są umieszczone w podkatalogach biblioteki STM32F4xx_DSP_StdPeriph_Lib i oprogramowania STM32F4-Discovery_FW i są przewidziane dla środowiska uvision. Z katalogu biblioteki STM32F4xx_DSP_StdPeriph_Lib_V1.3.0\Project\ STM32F4xx_StdPeriph_Templates kopiujemy pliki: main.h, stm32f4xx_it.h i stm32f4xx_conf.h do naszego podkatalogu projekt2\inc, pliki main.c, stm32f4xx_it.c i system_stm32f4xx.c kopiujemy do podkatalogu projektu projekt2\scr. Z katalogu biblioteki STM32F4xx_DSP_StdPeriph_Lib_V1.3.0\Libraries\- CMSIS\Device\ST\STM32F4xx\Include) kopiujemy pliki: stm32f4xx.h i system_stm32f4xx.h do naszego katalogu projekt2\inc. Z katalogu biblioteki STM32F4xx_DSP_StdPeriph_Lib_V1.3.0\Libraries\CMSIS\Include kopiujemy cały podkatalog \CMSIS\Include do naszego podkatalogu projekt1\libraries\cmsis\include. Z katalogu biblioteki STM32F4xx_DSP_StdPeriph_Lib_V1.0.1\Libraries\ STM32F4xx_StdPeriph_Driver kopiujemy cały podkatalog STM32F4xx_StdPeriph_Driver do naszego podkatalogu projekt2\libraries\stm32f4xx_stdperiph_driver. Katalog zawiera podkatalogi inc i src, w których są pliki typu h i c zawierające podstawowe funkcje (procedury) do konfiguracji i obsługi urządzeń peryferyjnych w mikrokontrolerze STM32. Aby zmniejszyć zajętość pamięci na dysku w projekcie można pozostawić tylko te pliki z których się korzysta.
Z katalogu biblioteki STM32F4xx_DSP_StdPeriph_Lib_V1.3.0\Libraries\CMSIS\Device\ST\ STM32F4xx\Source\Templates\arm skopiować tzw. plik startowy startup_stm32f40xx.s do katalogu głównego projekt2. UWAGA!! proszę nie używać polskich liter i znaku spacji przy nazwach katalogów (folderów) i plików, które będą używane przez projekt i środowisko uvision. UWAGA!! przykładowe projekty (gotowe programy) zawarte w katalogu biblioteki STM32F4xx_DSP_StdPeriph_Lib_V1.3.0\Project\STM32F4xx_StdPeriph_Examples są przewidziane głównie dla modułu STM32 EVAL a nie dla STM32F4 Discovery. Moduł EVAL jest lepiej wyposażony w różnego typu peryferia i ma zainstalowany kwarc o częstotliwości 25MHz. Na płytce Discovery jest rezonator kwarcowy 8MHz dla mikrokontrolera, z tego powodu należy uważać przy kopiowaniu plików z przykładów. W skopiowanych plikach main.c, main.h, stm32f4xx_it.c i stm32f4xx_it.h z biblioteki jest już skonfigurowany i uruchomiony licznik typu SysTick, który jest wykorzystany do generowania opóźnień czasowych. Należy pozostawić zmienne i funkcje dla tego licznika, przyda się on w kolejnych programach. Przy pisaniu programu użytkownika pliki main.c, main.h, stm32f4xx_it.c i stm32f4xx_it.h będą wymagały napisania własnych funkcji i kodu. Z tego powodu należy je zmodyfikować przy pisaniu programu. Projekt jest tak skonfigurowany że główna funkcja programu main() musi się znajdować w pliku o nazwie main.c. Zmiany w plikach aby ustawienia pasowały do STM32F4-Discovery Skopiowane pliki konfiguracyjne z biblioteki są przewidziane dla rezonatora kwarcowego 25MHz. W module Discovery jest zainstalowany rezonator kwarcowy 8MHz. Aby poprawnie można było konfigurować sygnały zegarowe dla poszczególnych fragmentów mikrokontrolera należy wprowadzić drobne zmiany w niektórych plikach. W pliku stm32f4xx_conf.h (podkatalog inc) używając edytora w okolicy 32 wiersza wpisać tekst: #if defined (HSE_VALUE) /* Redefine the HSE value; it's equal to 8 MHz on the STM32F4-DISCOVERY Kit */ #undef HSE_VALUE #define HSE_VALUE ((uint32_t)8000000) #endif /* HSE_VALUE */ Ma to na celu zmianę wartości symbolu HSE_VALUE na wartość rezonatora kwarcowego (8MHz) zainstalowanego w module STM32F4-Discovery. Otworzyć plik system_stm32f4xx.c (podkatalog src). W 57 wierszu zamienić tekst: * HSE Frequency(Hz) 25000000 na * HSE Frequency(Hz) 8000000 W 58 wierszu zamienić tekst: * PLL_M 25 na * PLL_M 8 W 254 wierszu zmienić tekst: #define PLL_M 25 na #define PLL_M 8
Najważniejsza jest ostatnia podmiana wartości symbolu PLL_M na 8. Z powoduje to zmianę wartości podzielnika w systemie zegarowym mikrokontrolera i wtedy częstotliwość taktowania jednostki centralnej wyniesie 168MHz. Do dowolnego konfigurowania sygnałów zegarowych w STM32F4, najlepiej użyć aplikacji Clock configuration tool for STM32F40x/41x microcontrollers (AN3988), która wygeneruje prawidłowy plik system_stm32f4xx.c.
3. Tworzenie projektu w środowisku uvision 5 Po utworzeniu katalogu projektu i skopiowaniu wybranych plików z biblioteki do projektu uruchomiamy program uvision. Widok ekranu po uruchomieniu programu uvision5 i zamknięciu wszystkich projektów Jeżeli jest otwarty jakiś projekt, zamknąć go, w menu Project-Close Project. Z menu Project wybrać New uvision Project pojawi się okienko, wejść do katalogu projektu projekt2 i wpisać nazwę nowego projektu np. gpio_test. Po wpisaniu nazwy i naciśnięciu przycisku Zapisz pojawi się okienko do wyboru firmy i konkretnego typu mikrokontrolera. Wybieramy firmę STMicroelectronics i układ typu STM32F407VG. Po wyborze mikrokontrolera program uvision wie jakie układ posiada parametry. Jest to niezbędne dla debugera w środowisku uvision. Następnie pojawia się okienko do wyboru Run Time Environment, naciskamy Cancel.
Okienko do wyboru Run Time Environment z firmy Keil Okienko projektu po wstępnym utworzeniu projektu W okienku Project wybieramy Target1 i klikamy prawym przyciskiem myszki, wybieramy Options for Target1 lub naciskamy ikonkę tzw. czarodzieja na pasku. Pojawi się okienko do ustawiania parametrów i opcji projektu. Wybieramy zakładkę Target i zmieniamy ustawienia Xtal na 8.0MHz, (taki rezonator kwarcowy jest zainstalowany na płytce STM32F4-Discovery). Wybieramy opcję Use MicroLIB i Used FPU.
Ustawienie częstotliwości rezonatora kwarcowego Następnie wybieramy zakładkę Output i przyciskiem Select Folder for Objects wskazujemy podkatalog obj w naszym projekcie. Przechodzimy do zakładki Listing i przyciskiem Select Folder for Listings wybieramy podkatalog lst w naszym projekcie.
Wybieramy zakładkę C/C++ i w okienku Define należy wpisać USE_STDPERIPH_DRIVER, STM32F4XX Zmuszamy kompilator do wyboru użycia biblioteki do obsługi peryferiów mikrokontrolera. W tej samej zakładce należy wskazać ścieżki dostępu do biblioteki, plików źródłowych i plików nagłówkowych wymaganych do projektu. Dokonuje się tego przy pomocy przycisku okienka Include Paths. Należy wskazać ścieżki dostępu do podkatalogów w projekcie. Jako pierwsze wskazujemy dostęp do katalogu głównego projektu poprzez symbol kropki. (kropka oznacza bieżący katalog), następnie do podkatalogów biblioteki i podkatalogu inc w projekcie. Wygląd okienka jak na rysunku poniżej.
Jeżeli będziemy dodawać jakieś pliki do projektu to za pomocą tego okienka wskazujemy kompilatorowi ścieżkę dostępu do plików. Przechodzimy do zakładki Linker i wybieramy opcję Use Memory Layout from Target Dialog. W zakładce Debug i wybieramy Use z listy debuger typu ST-Link Debugger. Po naciśnięciu przycisku Settings pojawia się nowe okienko z trzema zakładkami. Jeżeli połączenie po USB z płytką jest poprawne, to w zakładce Debug program wykrywa urządzenie Unit (ST LINK/V2) i typ mikrokontrolera SW Device (ARM CoreSight SW-DP). Należy ustawić tryb pracy debugera Port na SW.
Po przejściu do zakładki Flash Download w okienku Programming Algoritm dodajemy typ układu (jeżeli go nie ma), który będzie programowany. Naciskamy przycisk Add i z listy wybieramy STM32F4xx Flash. Zaznaczamy też opcję Reset and Run. Ustawienia debugera ST-Link potwierdzamy przyciskiem OK.
Przechodzimy do zakładki Utilities i wybieramy opcję Use Target Driver for Flash Programming.
Po przygotowaniu parametrów i opcji, kolejnym etapem będzie dołączenie skopiowanych plików i biblioteki do projektu. Dołączanie grup i plików do projektu najlepiej wykonać za pomocą okienka Manage Project Items, które otwiera się ikonką na pasku lub w okienku Project wybieramy Target1 i klikamy prawym przyciskiem myszki, wybieramy Manage Project Items. Okienko do konfiguracji grup i plików w projekcie Po otwarciu managera w okienku Groups, wybieramy ikonkę New (Insert) i dodajemy grupę o nazwie StdPeriphDrv, CMSIS i MDK-ARM.
Grupę o nazwie Source Group 1 zmieniamy na nazwę UserCode klikając dwa razy lewym przyciskiem myszki. W okienku Groups wybieramy grupę UserCode i wybieramy Add Files to UserCode i wskazujemy na plik main.c w katalogu projekt2/src i naciskamy przycisk Add. Podobnie postępujemy z plikiem stm32f4xx_it.c. Do grupy CMSIS należy dodać plik system_stm32f4xx.c z podkatalogu src, Do grupy StdPeriphDrv należy dodać pliki misc.c, stm32f4xx_gpio.c, stm32f4xx_rcc.c z katalogu libraries/stm32f4xx_stdperiph_driver/src. Do grupy MDK-ARM dodajemy plik startup_stm32f4xx.s Pliki pomiędzy grupami można przesuwać metodą drag and drop.
Po zakończeniu operacji kopiowania plików wygląd okienka Project w środowisku uvision przedstawia rysunek poniżej. Jeżeli na symbolu pliku jest znaczek kluczyka, to oznacza że plik jest tylko do odczytu. Nie jest możliwa jego edycja (modyfikacja i zapis) w środowisku uvision. Okienko projektu po dołączeniu podstawowych plików i ikonka do modyfikacji paska Project. Rozmieszczenie plików w poszczególnych katalogach projektu2 przedstawiono poniżej. Struktura katalogu projekt2 Struktura podkatalogu projekt2/inc Struktura podkatalogu projekt2/libraries
Struktura podkatalogu projekt2/scr
4. Pierwszy program dla STM32F4 Po dodaniu grup i plików do poszczególnych grup, projekt jest prawie gotowy. Główny plik programu, main.c zawiera funkcję main() od, której zaczyna się program użytkownika. Otwieramy ten plik klikając na nazwę pliku w okienku Project. Z powodu, że pliki main.c i main.h zostały skopiowane z biblioteki zawierają już jakiś kawałek programu w języku C. Musimy tylko dodać swój własny kod aby napisać pierwszy program na mikrokontroler STM32F4 zamontowany na płytce. Można też całkowicie skasować zawartość pliku main.c i main.h i wpisać wszystko od początku. Przy pisaniu programu przydane będą: schemat ideowy płytki Discovery, plik pomocy dla biblioteki, materiały szkoleniowe dla układu STM32F4 Zadaniem programu będzie mruganie diodami LED, które są zamontowane na płytce i są podłączone do końcówek portu D. Dioda LD4 do PD12, LD5 do PD13, LD6 do PD14 i LD7 do PD15. Aby zaświecić diodę należy ustawić stan 1 na wybranym wyjściu portu. Funkcja Delay(), która zapewnia opóźnienie czasowe, korzysta z licznika SysTick (przerwania od tego licznika), który znajduje się w każdym mikrokontrolerze typu Cortex, bez względu na producenta układu. Należy dopisać fragmenty kodu w pliku: main.c, a następnie wybieramy Project -> Rebuilt All Target Files lub naciskamy ikonkę Rebuilt. Po poprawnej kompilacji w okienku Build Output nie powinno być błędów ani ostrzeżeń. Następnie wybieramy z menu Flash -> Download lub naciskamy ikonkę LOAD i program zostanie wgrany do mikrokontrolera na płytce. Diody LED powinny mrugać. Jeżeli jest wszystko w porządku teraz można modyfikować program dopisując własny kod. Konfigurację licznika SysTick i program do obsługi przerwania od tego licznika można zostawić, przyda się on w kolejnych programach. Kopiowanie projektu Cały projekt wraz z wszystkimi plikami znajduję się w katalogu projekt1, dzięki temu można przenieść projekt do innego katalogu lub na inny napęd. Po otwarciu projektu z innej lokalizacji nie powinno być błędów w trakcie kompilacji. Przed kopiowaniem projektu warto usunąć niepotrzebne tymczasowe pliki, które powstają w trakcie kompilacji. Najlepiej do tego nadaję się gotowa procedura, Clean Target w menu Project. Dzięki takiej operacji znacznie zmniejsza się zajętość projektu na dysku.
5. Dodatkowe materiały i narzędzia Można pobrać aplikację w Excel-u do konfiguracji mikrokontrolera Clock configuration tool for STM32F40x/41x microcontrollers (AN3988) ze strony http://www.st.com/web/en/catalog/tools/pf257927. Uruchomienie aplikacji wymaga programu Excel i służy do konfiguracji sygnałów zegarowych w mikrokontrolerze. Aplikacja generuje gotowy plik system_stm32f4xx.c, który należy skopiować do projektu. Jeżeli zamierzamy ustawić inną częstotliwość rezonatora kwarcowego lub zmienić niektóre podzielniki częstotliwości np. dla systemu liczników można do tego celu wykorzystać tą aplikację.
6. Stworzenie projektu dla STM32F4 w środowisku uvision 5 z wykorzystaniem przykładu Blinky dla modułu STM32F4 - Discovery Do stworzenia własnego projektu można też wykorzystać gotowy projekt, który jest dostępny po zainstalowaniu środowiska uvision 5.1, firmy Keil. Po uruchomieniu programu uvision, wybieramy ikonkę Pack Installer. Jeżeli nie są jeszcze zainstalowane pliki dotyczące mikrokontrolerów STM32F4, to należy doinstalować te pliki (wymagany jest dostęp do Internetu). Po instalacji powinny być widoczne przykłady projektów dla tego mikrokontrolera. Następnie wybieramy zakładkę Examples i kopiujemy projekt Blinky (STM32F4-Discovery)
Przy kopiowaniu wybieramy katalog do którego ma być skopiowany projekt. Można też wybrać opcję Launch uvision (uruchom program uvision po skopiowaniu) lub opcję Use Pack Folder Structure.
Następnie przechodzimy do edytora uvision i z menu Project wybieramy Open Project i wskazujemy na plik Blinky.uvprojx. Po otwarciu projektu wybieramy Project i Build Project (lub klawisz F7). Projekt powinien się skompilować bez błędów i można go wgrać do mikrokontrolera na płytce. Na podstawie tego projektu można pisać własne programy korzystając ze struktury projektu i ustawień plików konfiguracyjnych. Ustawienia projektu są dla rezonatora kwarcowego XTAL= 8.00MHz i częstotliwości taktowania SYSCLK = 168.00 MHz oraz częstotliwości HCLK = SYSCLK = 168.00 MHz.