Kursy • Poradniki • Inspirujące DIY • Forum
Platforma sprzętowa - NUCLEO-F103RB
Nie podłączaj płytki do komputera przed przeczytaniem artykułu!
Jako podstawę kursu wybraliśmy płytkę 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.
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 znajdziemy na stronie producenta. Kurs omawia programowanie mikrokontrolera STM32F103RB, nie możemy więc przeoczyć strony z dokumentacją tego układu. W przeciwieństwie do układów z rodziny AVR, tutaj dokumentacja, to więcej niż jeden plik! To co jest nam niezbędne (spokojnie, nie trzeba wszystkiego czytać):
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 pamiętać o takim dokumencie.
Dokumentacja dla biblioteki HAL
Poprzednio opisywaliśmy bibliotekę standardową, której dokumentacja była delikatnie mówiąc nie najlepsza. W przypadku biblioteki HAL firma ST odrobiła pracę domową i dokumentacja jest znacznie lepsza.
Warto ją pobrać, mieć pod ręką oraz zaglądać do niej możliwie często. Znajdziemy w niej dokładny opis funkcji i struktur opisywanych w kursie oraz mnóstwo informacji, na które zabrakło miejsca w tym kursie: description of STM32F1 HAL and Low-layer drivers. Dodatkowo pomocne będą również informacje o bibliotece Cube dla układów z rodziny F1.
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 płytki Nucelo
Najnowszą wersję sterowników można pobrać ze strony producenta. Aby nie zrobić bałaganu plik najlepiej rozpakować do folderu, a następnie zainstalować pobrane sterowniki. Warto pamiętać, aby sterowniki 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ć 3 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 znajdziemy na stronie STSW-LINK007.
Środowisko programistyczne
Kurs bazuje na darmowym środowisku System Workbench for STM32. Kompilator z edytorem i debuggerem pobieramy ze strony OpenSTM32. Aby pobrać odpowiednie instalator konieczne jest założenie konta na stronie projektu. Później bez problemu trafimy na poniższą stronę, z której będzie można pobrać właściwe pliki:
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, więc wymaga Javy. Jeśli nie mamy jej zainstalowanej to może pojawić się poniższy komunikat. Strona z maszyną Javy powinna automatycznie zostać otwarta w przeglądarce. Gdyby tak się nie stało, to będzie można pobrać ją ze strony Oracle.
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. Następnie może wyświetlić się ostrzeżenie od Zapory Windows Defender. Oczywiście zgadzamy się, aby program miał dostęp do sieci.
Następnie tworzymy nowy projekt, wybieramy opcję File>New>C Project, powinniśmy zobaczyć okno tworzenia projektu. Podajemy nazwę 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 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 Cube HAL, 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. 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. 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:
- HAL_Driver – kod biblioteki Cube HAL. Wybraliśmy opcję As Sources, więc cała biblioteka została skopiowana do naszego projektu.
- Utilities – przykładowy kod dla płytki Nucleo. Nie będziemy go wykorzystywać.
- 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 (w katalogu src) musimy również usunąć odwołanie do właśnie usuniętego pliku nagłówkowego:
#include "stm32f1xx_nucleo.h"
Warto wyłączyć opcję automatycznej kompilacji projektu. Kompilacja zajmuje sporo czasu, a takie spowolnienie komputera może skutecznie zniechęcić do używania Eclipse:
Mamy wreszcie nasz pierwszy projekt gotowy do uruchomienia. Najpierw kompilujemy kod (wystarczy kliknąć przycisk Build - ikonka młotka). 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ę 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. Naszym oczom może ukazać się kolejny komunikat od Zapory Windows Defender - tutaj również zezwalamy na dostęp do sieci.
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 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, dzięki czemu możliwe będzie podejrzenie tego co dzieje się wewnątrz mikrokontrolera.
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 (na co się zgadzamy).
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.
Na zakończenie, gdy będziemy chcieli wrócić do widoku edytora to wystarczy, że klikniemy odpowiednią ikonkę w prawym górnym rogu edytora.
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 GPIO. Omówimy również niezbędne operacje, które należy wykonać w celu uruchomienia poszczególnych portów.
Nawigacja kursu
Autor kursu: Piotr Bugalski
Testy: Piotr Adamczyk
Redakcja: Damian Szymański
Powiązane wpisy
instalacja, kursSTM32F1HAL, programator, środowisko, sterowniki, stm32, uart
Trwa ładowanie komentarzy...