Kursy • Poradniki • Inspirujące DIY • Forum
Platforma sprzętowa - NUCLEO-F103RB
Nie podłączaj płytki do komputera przed przeczytaniem artykułu!
Jako podstawa kursu wybrana została płytka NUCLEO-F103RB. Nie powinno być zaskoczeniem, że jest ona wyposażona w mikrokontroler STM32F103RB. Jest to bardzo prosta, ale dzięki temu również relatywnie tania płytka ewaluacyjna. Do jej zalet trzeba zaliczyć m.in.:
- wbudowany programator zgodny z ST-LINK,
- konwerter UART - USB,
- wyprowadzenie praktycznie wszystkich pinów mikrokontrolera,
- dodatkowe wyprowadzenia zgodne z Arduino.
Jako wadę, albo chociaż pewną niespodziankę można potraktować brak kwarcu na płytce. Typowe zestawy ewaluacyjne (np. Discovery) wyposażone są w 8MHz kwarc, który za pomocą pętli PLL pozwala na taktowanie procesora z częstotliwością 72MHz. Na płytce Nucleo przewidziane są odpowiednie pady, jednak domyślnie elementy nie są lutowane.
Oznacza to konieczność pracy z wbudowanego generatora RC oraz ograniczenie maksymalnej prędkości zegara do 64MHz. Jednak w porównaniu do 16MHz w niektórych AVRach jest to i tak bardzo dużo.
Bardzo ciekawy jest podział płytki na dwie części – górna zawiera programator oraz konwerter UART-USB i jak widać łatwo może zostać odłamana. Dzięki temu nawet po zakończeniu kursu będziemy mogli wykorzystać tą część płytki w przyszłych konstrukcjach. Programator oraz konwerter to bardzo przydatne narzędzia.
Niezbędna dokumentacja
Zacznijmy od dokumentacji. Więcej informacji o płytce Nucleo-F103RB znajdziemy na stronie producenta. Kurs omawia programowanie mikrokontrolera STM32F103RB, nie możemy więc także przeoczyć strony z dokumentacją tego układu.
W przeciwieństwie do AVR, tutaj dokumentacja, to więcej niż jeden plik!
To co jest nam niezbędne:
Spokojnie, nie trzeba wszystkiego od razu czytać. Będziemy do tej dokumentacji wracać, więc warto pamiętać gdzie jej szukać.
Datasheet zawiera informację o charakterystyce naszego układu, będziemy korzystać z opisu wyprowadzeń (linii I/O). Reference manual jest strasznie długi, ale omawia wszystkie moduły procesora STM32F103. Będziemy wykorzystywać gotową bibliotekę dostarczaną przez ST, więc nie musimy czytać znaczenia każdego z rejestrów procesora. Jednak ogólny opis modułów, które posiada nasz układ najlepiej opisany jest właśnie tutaj.
Ostatni dokument to errata. Początkujący pewnie nie uwierzą, ale produkowane procesory mają błędy... Najczęściej jak coś źle działa, to dlatego, że źle napisaliśmy program, albo coś źle zlutowaliśmy, ale okazuje się, że same mikrokontrolery też nie są idealne.
W bardziej profesjonalnych zastosowaniach takie błędy bywają bardzo istotne, warto więc od początku wyrabiać sobie umiejętność pamiętania o takim dokumencie.
Gotowe zestawy do kursów Forbota
Komplet elementów Gwarancja pomocy Wysyłka w 24h
Zestaw ponad 120 elementów do przeprowadzenia wszystkich ćwiczeń z kursu można nabyć u naszych dystrybutorów! Dostępne są wersje z płytką Nucleo lub bez niej!
Zamów w Botland.com.pl »Sterowniki
Najnowszą wersję sterowników można pobrać tutaj. Instalacji sterowników nie trzeba chyba opisywać, wspomnę tylko żeby je zainstalować przed podłączeniem płytki NUCLEO. Jeśli ich nie zainstalujemy, po podłączeniu płytki system wykryje ją jako nośnik danych, jednak interfejsy komunikacyjne pozostaną niedostępne:
Po prawidłowej instalacji sterowników i podłączeniu płytki powinniśmy zobaczyć aż 3 nowe urządzenia:
- wirtualny port szeregowy (np. COM3)
- dysk USB
- programator STLink
Warto również uaktualnić oprogramowanie naszego programatora. Nowsze wersje mogą działać szybciej oraz stabilniej. Program do aktualizacji firmware-u znajdziemy tutaj.
Środowisko programistyczne
Kurs bazuje na darmowym środowisku System Workbench for STM32 dostępnym w ramach projektu OpenSTM32. Kompilator wraz z edytorem i debuggerem jest dostępny do pobrania ze strony: http://www.openstm32.org/HomePage
Wymagana jest rejestracja, ale samo środowisko jest w pełni darmowe.
Uwaga!
Instalacja kompilatora lub zapisywanie projektów w katalogu, do którego prowadzi ścieżka z polskimi znakami (np.: w nazwie użytkownika) będzie powodowała błędy kompilacji. Najlepiej programy zapisywać w lokalizacji typu C:\\STM32\Kurs
Środowisko bazuje na Eclipse, a przez to wymaga Javy. Jeśli nie mamy jej zainstalowanej, może pojawić się odpowiedni komunikat:
Strona z maszyną Javy powinna automatycznie zostać otwarta w przeglądarce, na wszelki wypadek podam link: http://www.oracle.com/technetwork/java/javase/downloads/index.html
Dalsza instalacja powinna przebiegać bez problemów.
Dlaczego środowiskiem nie jest CooCox lub ręcznie konfigurowany Eclipse? W przypadku tego pierwszego problemem okazała się niedawna aktualizacja, która zmienia bardzo dużo w tym środowisku. Stało się ono przez to mało wygodne. Co więcej, w obawie przed kolejnymi tak dużymi zmianami zdecydowano o innym środowisku. Natomiast wykorzystanie samego Eclipsa jest dość trudne. Nie ma potrzeby męczyć się z ręcznym tworzeniem środowiska, gdy możemy korzystać z gotowego i darmowego System Workbench for STM32.
Pierwszy projekt na STM32
Po uruchomieniu środowiska zobaczymy ekran początkowy typowy dla Eclipse. Utwórzmy nowy projekt, wybieramy opcję File→New→C Project, powinniśmy zobaczyć okno tworzenia projektu. Podajemy nazwę projektu i naciskamy przycisk Next.
Następne okno pozwala na wybór konfiguracji, domyślne wersje Debug oraz Release. Są dla nas odpowiednie, więc naciskamy Next. Teraz czeka nas bardzo ważny krok, czyli wybór mikrokontrolera oraz płytki.
W polu Series wybieramy STM32F1, a następne jako Board wybieramy NUCLEO-F103RB. Konfiguracja powinna wyglądać następująco:
Po naciśnięciu przycisku Next przejdziemy do ekranu wyboru biblioteki. Środowisko pozwala na pisanie programów bez wykorzystania bibliotek, w oparciu o biblioteki StdPeriph oraz Cube.
Kurs bazuje na bibliotece StdPeriph, więc tę opcję wybieramy.
Podczas pierwszego uruchomienia środowiska musimy pobrać kod biblioteki. W tym celu klikamy przycisk Download target firmware, a następnie zgadzamy się na warunki licencji.
Aktualizacja: 12.09.2016 r.
Uwaga! W związku ze zmianami na stronie producenta ST automatyczne pobieranie może nie działać poprawnie! W przypadku napotkania takiego błędu należy postępować zgodnie z instrukcjami w komentarzach.
Podczas tworzenia kolejnych projektów nie będzie potrzeby ponownego pobierania plików. Możemy wybrać sposób dołączenia biblioteki do naszego projektu. Dostępne są dwie opcje:
- skopiowanie biblioteki do projektu (As sources)
- utworzenie biblioteki statycznej, współdzielonej przez kilka projektów (As static external libraries).
Wybieramy pierwszą opcję i naciskamy Finish.
Projekt powinien zostać automatycznie wygenerowany.
Warto poświęcić chwilę na zapoznanie się ze strukturą utworzonego projektu. Ponieważ wszystkie przykłady podczas kursu będą tworzone w ten sam sposób, będzie to fragment wielokrotnie powtarzany w przyszłości.
W projekcie znajdziemy kilka folderów z kodem:
- StdPeriph_Driver – kod biblioteki StdPeriph. Ponieważ wybraliśmy opcję As Sources, cała biblioteka została skopiowana do naszego projektu.
- Utilities – przykładowy kod dla płytki Nucleo. Nie będziemy go wykorzystywać podczas kursu
- inc – folder na pliki nagłówkowe (.h)
- src – folder na pliki z kodem programu (.c)
- startup – zawiera plik z kodem w asemblerze, który jest uruchomiany zaraz po resecie mikrokontrolera
- CMSIS – biblioteka dostarczana przez ARM, pozwala na niskopoziomowy dostęp do zasobów mikrokontrolera
Na początek usuwamy folder Utilities wraz z całą zawartością - nie będziemy tego kodu używać podczas kursu. Z pliku main.c musimy również usunąć odwołanie do właśnie usuniętego pliku nagłówkowego:
#include "stm32f1xx_nucleo.h"
Warto również wyłączyć opcję automatycznej kompilacji projektu. Kompilacja zajmuje sporo czasu, a spowolnienie komputera które powoduje może skutecznie zniechęcić do używania Eclipse:
Mamy wreszcie nasz pierwszy projekt gotowy do uruchomienia. Najpierw kompilujemy kod (wystarczy kliknąć przycisk Build). Kompilacja powinna zakończyć się sukcesem.
Uruchomienie programu
Czas uruchomić nasz pierwszy program. Przy pierwszym uruchomieniu musimy przygotować odpowiednią konfigurację. Podłączamy płytkę Nucleo i wybieramy opcję menu:
Run→Run Configurations
(lub wybieramy tą samą opcję za pomocą paska narzędzi):
Zobaczymy okno z dostępnymi konfiguracjami uruchomieniowymi:
Klikamy podwójnie na pierwszej opcji Ac6 STM32 Debugging. Nowa konfiguracja zostanie utworzona automatycznie:
Teraz wystarczy przycisnąć "Run".
Gdybyśmy nie skompilowali wcześniej programu pole C/C++ Application pozostałoby puste, a próba uruchomienia kończyłaby się niepowodzeniem. Należy w takiej sytuacji skompilować projekt, a następnie przycisnąć Search Project i wskazać plik wykonywalny z programem.
Nasz program jest pusty i nic nie robi, więc musimy po prostu uwierzyć, że działa... Aby kolejny raz uruchomić program wystarczy wybrać opcję Run. Nie trzeba ponownie konfigurować programu.
Debugowanie
Pierwszy program nie robi nic ciekawego, więc jego uruchomienie nie daje rezultatów. Zmieńmy więc trochę kod programu i spróbujmy uruchomić go debuggerem.
int main(void)
{
int x = 0;
for(;;) {
x++;
}
}
Tym razem zamiast Run wybierzmy opcję Debug. Uruchomienie debuggera chwilę trwa, w międzyczasie zostaniemy zapytani o przełączenie do widoku Debug (zgadzamy się na tą opcję). Po chwili powinniśmy zobaczyć mniej więcej taki widok:
Jak widzimy, nasz program został zatrzymany na pierwszej instrukcji wewnątrz funkcji main. Możemy zobaczyć zawartość zmiennych w oknie Variables (widoczne w prawym górnym rogu). Program można wykonywać krokowo za pomocą opcji Run→Step Over (F6). Aby wznowić wykonywanie programu możemy wybrać opcję Resume (F8).
Na początek warto zobaczyć, czy program działa naciskając F6 i obserwując wykonywanie kolejnych linii programu.
Zadanie domowe 3.1
Umieść w komentarzu dwa zrzuty ekranu demonstrujące podgląd (z debuggera) na wartość inkrementowanej zmiennej.
Podsumowanie
W tej części zobaczyliśmy jak utworzyć oraz uruchomić nowy projekt. Warto dobrze opanować te operacje, ponieważ od teraz będziemy je wykorzystywać w każdej części kursu. W kolejnym artykule zajmiemy się już pisaniem programów.
Jako pierwszymi peryferiami zajmiemy się uniwersalnymi portami wejścia/wyjścia GPIO. Omówimy również niezbędne operacje, które należy wykonać w celu uruchomienia poszczególnych portów.
Nawigacja kursu
Jeśli nie chcesz przeoczyć kolejnego odcinka, to korzystając z poniższego formularza i zapisz się na powiadomienia o nowych publikacjach!
Autor kursu: Piotr (Elvis) Bugalski
Redakcja: Damian (Treker) Szymański
Powiązane wpisy
instalacja, kursSTM32, programator, środowisko, sterowniki, stm32, uart
Trwa ładowanie komentarzy...