KursyPoradnikiInspirujące DIYForum

Kurs STM32 F1 HAL – #3 – płytka Nucleo, środowisko

Kurs STM32 F1 HAL – #3 – płytka Nucleo, środowisko

W poprzedniej części kursu wyjaśniliśmy czym jest HAL. Najwyższy moment, abyśmy przeszli do działania w praktyce.

Zaczniemy od instalacji i konfiguracji środowiska oraz od krótkiego omówienia płytki Nucleo. Na koniec wgramy prosty program, który pozwoli na przetestowanie połączenia.

Platforma sprzętowa - NUCLEO-F103RB

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.

Miejsce na kwarc...

Miejsce na kwarc...

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.

Część płytki będąca m.in. programatorem.

Część płytki będąca m.in. programatorem.

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.

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.

01_brak_sterowników

Brak sterowników do płytki Nucleo.

Po prawidłowej instalacji sterowników i podłączeniu płytki powinniśmy zobaczyć 3 urządzenia:

  1. wirtualny port szeregowy (np. COM3),
  2. dysk USB,
  3. programator STLink.
02_sterowniki

Prawidłowo wykryte urządzenia.

Warto również uaktualnić oprogramowanie naszego programatora. Nowsze wersje mogą działać szybciej oraz stabilniej. Program do aktualizacji znajdziemy na stronie STSW-LINK007.

03_firmware

Aktualizacja oprogramowania.

Ś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:

Strona pobierania środowiska.

Strona pobierania środowiska.

Ś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.

04_brak_javy

Brak zainstalowanej Javy.

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.

Ostrzeżenie Zapory Windows Defender.

Ostrzeżenie Zapory Windows Defender.

Następnie tworzymy nowy projekt, wybieramy opcję File>New>C Project, powinniśmy zobaczyć okno tworzenia projektu. Podajemy nazwę i naciskamy przycisk Next.

Tworzenie nowego projektu.

Tworzenie nowego projektu.

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:

Odpowiednia konfiguracja projektu.

Odpowiednia konfiguracja projektu.

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.

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.

Pobieranie biblioteki Cube HAL.

Pobieranie biblioteki Cube HAL.

Możemy wybrać sposób dołączenia biblioteki do naszego projektu. Dostępne są dwie opcje:

  1. skopiowanie biblioteki do projektu (As sources)
  2. utworzenie biblioteki statycznej, współdzielonej przez kilka projektów (As static external libraries).

Wybieramy pierwszą opcję i naciskamy Finish.

Sposób dołączenia biblioteki.

Sposób dołączenia biblioteki.

Projekt powinien zostać automatycznie wygenerowany.

Wygenerowany projekt.

Wygenerowany projekt.

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:

Warto wyłączyć opcję automatycznej kompilacji projektu. Kompilacja zajmuje sporo czasu, a takie spowolnienie komputera może skutecznie zniechęcić do używania Eclipse:

Wyłączenie automatycznej kompilacji.

Wyłączenie automatycznej kompilacji.

Mamy wreszcie nasz pierwszy projekt gotowy do uruchomienia. Najpierw kompilujemy kod (wystarczy kliknąć przycisk Build - ikonka młotka). Kompilacja powinna zakończyć się sukcesem.

Pierwsza kompilacja.

Pierwsza kompilacja.

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):

Wybór odpowiedniej opcji.

Wybór odpowiedniej opcji.

Zobaczymy okno z dostępnymi konfiguracjami uruchomieniowymi:

Konfiguracje uruchomieniowe.

Konfiguracje uruchomieniowe.

Klikamy podwójnie na pierwszej opcji Ac6 STM32 Debugging. Nowa konfiguracja zostanie utworzona automatycznie:

Utworzenie nowej konfiguracji.

Utworzenie nowej konfiguracji.

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.

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.

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).

Przełączenie w tryb debuggowania.

Przełączenie w tryb debuggowania.

Po chwili powinniśmy zobaczyć mniej więcej taki widok:

Okno debuggera.

Okno debuggera.

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 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

instalacja, kursSTM32F1HAL, programator, środowisko, sterowniki, stm32, uart

Trwa ładowanie komentarzy...