Ta strona używa ciasteczek (plików cookies), dzięki którym może działać lepiej. Dowiedz się więcejRozumiem i akceptuję

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

Programowanie 13.01.2018 Piotr, Damian

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.

Nawigacja serii artykułów:
« poprzednia część

» Pokaż/ukryj cały spis treści «

Kup zestaw elementów i zacznij naukę w praktyce! Przejdź do strony dystrybutora »

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.

Miejsce na kwarc...

Miejsce na kwarc…

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.

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.

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.

Zestaw elementów do przeprowadzenia ćwiczeń

Gwarancja pomocy na forum dla osób, które kupią poniższy zestaw!

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!


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

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.

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.

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.

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.

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.

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.

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.

Projekt powinien zostać automatycznie wygenerowany.

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.

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.

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.

Zobaczymy okno z dostępnymi konfiguracjami uruchomieniowymi:

Konfiguracje uruchomieniowe.

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

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.

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.

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.

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

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

» Pokaż/ukryj cały spis treści «

Kup zestaw elementów i zacznij naukę w praktyce! Przejdź do strony dystrybutora »

Autor kursu: Piotr Bugalski
Testy: Piotr Adamczyk
Redakcja: Damian Szymański

Powiadomienia o nowych, darmowych artykułach!

Komentarze

mikandrzej

16:52, 13.01.2018

#1

A czy nie można korzystać z zegara płytki programatora? O ile pamiętam to można było się tak przestawić, chyba że to chodziło o zegar ETH z płytki Nucleo144...

Elvis

18:23, 13.01.2018

#2

Można, chociaż podczas kursu zostaniemy przy wbudowanym generatorze RC. Używanie zegara z płytki programatora ma dwie wady. Pierwsza to brak możliwości rozłamania obu płytek - a to całkiem ciekawa opcja i zakładamy, że część osób korzystających z kursu tak zrobi lub zrobiła. Wtedy programator można wykorzystać do własnych konstrukcji lub programowania np. tanich modułów z Chin (bluepill).

Drugi problem jest poważniejszy - płytki Nucleo-103RB wymagają drobnych zmian w konfiguracji zanim używanie zegara z programatora będzie możliwe. Zmiany to wylutowanie kilku rezsytorów ew. wlutowanie zerowych lub zwarcie połączeń. To nic trudnego dla osoby wprawionej w lutowaniu SMD, ale zakładamy że kurs jest dla początkujących. Najgorsze jest to, że płytki mają różne ustawienia w zależności od tego kiedy były produkowane (nowsze powinny działać z zegarem z programatora bez zmian).

Więc podczas kursu zostaniemy przy zegarze wbudowanym, ale nic nie stoi na przeszkodzie żeby wykorzystać zegar z programatora. Nie ma też przeciwskazań w dolutowaniu rezonatora kwarcowego - ale to już poza kursem :)

fizzysky

23:13, 13.01.2018

#3

Gdzie są dokumentacje do pozostałych bibliotek?

Treker
Administrator

22:46, 16.01.2018

#4

fizzysky, o jakie biblioteki konkretnie pytasz?

fizzysky

15:01, 18.01.2018

#5

Szukałem std do f1 ale na stronie st.com znalazłem jedynie do pozostałych, teraz bardziej mnie interesuje gdzie mogę znaleźć informacje na temat CMSIS.

Zobacz powyższe komentarze na forum

FORBOT Damian Szymański © 2006 - 2018 Zakaz kopiowania treści oraz grafik bez zgody autora. vPRsLH.