KursyPoradnikiInspirujące DIYForum

Kurs STM32 F4 – #12 – Programowanie przez bootloader

Kurs STM32 F4 – #12 – Programowanie przez bootloader

Każdorazowe podłączanie programatora przy zmianie programu może być męczące lub czasem zupełnie niemożliwe.

Zastosowanie bootloadera pozwala ominąć tę niedogodność poprzez wgrywanie programu przez interfejsy takie jak UART, I2C, SPI, czy USB.

Kiedy przydaje się bootloader?

Tworząc robota z mikrokontrolerem STM32 niekoniecznie chcemy wyprowadzać na zewnątrz 3 dodatkowe kable, służące tylko do programowania układu. Dodatkowo za każdym razem musielibyśmy wykorzystywać zewnętrzny programator (ST-Link, JTAG), pośredniczący między komputerem, a mikrokontrolerem.

Wyobraźmy sobie konkretną sytuację. Wyprodukowaliśmy urządzenie, które pracuje na dużych wysokościach, np. na słupach transmisyjnych. W razie potrzeby aktualizacji oprogramowania na takim urządzeniu, ktoś musi wejść na słup, podpiąć się do urządzenia i w takich warunkach wgrywać nowy program. Dużo wygodniej byłoby po prostu podejść w okolice słupa z komputerem wyposażonym w Bluteooth (lub inną formę komunikacji bezprzewodowej), połączyć się z urządzeniem i zdalnie wgrać nowy program do mikrokontrolera.

Bootloader, to mały program znajdujący się w mikrokontrolerze, pozwalający na programowanie układu w systemie, czyli bez użycia dedykowanego, zewnętrznego programatora. Głównym jego zadaniem jest pobieranie nowego programu i wgrywanie go do pamięci FLASH mikrokontrolera. Wykorzystuje do tego jeden z interfejsów szeregowych takich jak USART, USB, I2C, czy SPI.


Każdy mikrokontroler STM32 domyślnie wyposażony jest w bootloader. Znajduje się on w pamięci ROM (Read Only Memory) mikrokontrolera i nie da się go stamtąd usunąć. W przypadku mikrokontrolera znajdującego się na naszej płytce Discovery, pozwala on na zaprogramowanie układu poprzez peryferia takie jak:

  • USART1, USART2,
  • I2C1, I2C2, I2C3,
  • SPI1, SPI2, SPI3,
  • USB.
Gotowe zestawy do kursów Forbota

 Komplet elementów  Gwarancja pomocy  Wysyłka w 24h

Zestaw elementów do przeprowadzenia wszystkich ćwiczeń z kursu STM32 F4 można nabyć u naszego dystrybutora! Zestaw zawiera m.in. płytkę Discovery, wyświetlacz OLED, joystick oraz enkoder.

Zamów w Botland.com.pl »

Programowanie mikrokontrolera przez UART

Rozpoczniemy od programowania mikrokontrolera przez UART. Aby zaprezentować możliwości tego rozwiązania będziemy potrzebować programu dostarczonego przez ST, który służy do wgrywania plików binarnych z wykorzystaniem bootloadera. Następnie wprowadzimy układ w tryb bootowania i na końcu wgramy kod przez UART.

Krok 1. Pobieramy i instalujemy program FlashLoader Demonstrator ze strony producenta.

Krok 2. Musimy uruchomić domyślny bootloader. Z noty AN2606 (STM32 micrcontroller system memory boot mode) dowiadujemy się, że można to zrobić sprzętowo przy pomocy pinów BOOT0 i BOOT1. Poszukując informacji dotyczących naszego mikrokontrolera odnajdujemy informację, że piny należy podłączyć według wzorca 1 z tabeli 2.

Informacje dotyczące uruchomienia bootloadera dla mikrokontrolera z rodziny STM32F4

Informacje dotyczące bootloadera dla mikrokontrolera z rodziny STM32F4.

W proponowanej tabeli znajdują się instrukcje odnośnie podłączenia pinów BOOT0 oraz BOOT1.

Tabela z wzorcami podłączenia pinów w celu uruchomienia bootloadera

Tabela z wzorcami podłączenia pinów w celu uruchomienia bootloadera.

Widzimy, że pin BOOT0 należy podłączyć do stanu wysokiego (VDD), a BOOT1 do stanu niskiego (GND). Dokonując szybkiej lustracji pinów zauważymy, że pin BOOT0 znajduje się z prawej strony płytki, zaraz obok pinu VDD. Takie ustawienie oczywiście nie jest przypadkowe. Ma to nam ułatwić dokonanie niezbędnych połączeń.

Założona pierwsza zworka.

Założona pierwsza zworka.

Świetnie! Mamy już podłączony jeden z wymaganych pinów. Co natomiast z pinem BOOT1? Im dłużej przyglądamy się płytce, tym bardziej go tam nie ma. Sprawdzając gdzie znajduje się ten pin w programie CubeMX orientujemy się, że taki pin... nie istnieje!

Na szczęście z pomocą przychodzi dokumentacja mikrokontrolera, z której dowiadujemy się, że BOOT1 jest dodatkową funkcją pinu PB2.

BOOT1 jako dodatkowa funkcjonalność pinu PB2

BOOT1 jako dodatkowa funkcjonalność pinu PB2.

Odszukując pin PB2 na płytce zauważamy, że on również umieszczony jest obok pinu zasilania (tym razem GND), do którego należy go podłączyć, aby uruchomić bootloader.

Założone obie zworka.

Założone obie zworka.

Krok 3. Musimy podłączyć odpowiedni interfejs, przez który zamierzamy programować mikrokontroler. W naszym wypadku jest to UART, w tym celu będziemy potrzebować przejściówki USB-UART, znajdującej się na wyposażeniu zestawu wykorzystywanego w tym kursie.

Zaglądając ponownie do noty AN2606 traktującej o bootloaderze znajdziemy informacje dotyczące konfiguracji konkretnych peryferii:

Tabela przedstawiająca konfiguracje USART1 oraz USART2 dla bootloadera

Tabela przedstawiająca konfiguracje USART1 oraz USART2 dla bootloadera.

My skorzystamy z USART2, ponieważ na płytce discovery na liniach PA10 i PA9 występują dodatkowe elementy, które uniemożliwiają połączenie się z bootloaderem za pomocą USART1.

Podłączamy przejściówkę USB-UART w następujący sposób:

  • GND - GND
  • TXD - PD6
  • RXD - PD5

Krok 4. Z założonymi zworkami resetujemy mikrokontroler. Uruchomi to bootloadera.

Krok 5. Podłączamy przejściówkę USB-UART do komputera. Sprawdzamy na którym porcie COM się pojawiła (prawym przyciskiem myszy na Mój Komputer > Zarządzaj > Menedżer urządzeń > Porty COM i LPT).

Krok 6. Uruchamiamy Flash Loader Demonstrator.
Naszym oczom ukaże się panel z parametrami transmisji UART.

Ekran startowy aplikacji Flash Loader Demonstrator

Ekran startowy aplikacji Flash Loader Demonstrator.

Upewniamy się, że numer portu COM odpowiada temu utworzonemu przez przejściówkę, a resztę ustawień pozostawiamy domyślnie. Co najwyżej, Timeout można zmienić na 1, unikniemy dzięki temu niepotrzebnego czekania, jeśli pojawią się błędy transmisji.

Krok 7. Klikamy przycisk Next. Jeżeli wszystko zrobiliśmy poprawnie, naszym oczom powinien się ukazać komunikat o nawiązanym połączeniu.

Komunikat o nawiązaniu połączenia z bootloaderem

Komunikat o nawiązaniu połączenia z bootloaderem.

Komunikat o błędzie podczas nawiązywania połączenia z bootloaderem

Komunikat o błędzie podczas nawiązywania połączenia z bootloaderem.

Komunikat o błędzie podczas nawiązywania połączenia z bootloaderem

Drugi częsty błąd podczas nawiązywania połączenia.

Najczęstszymi przyczynami błędów są:

  • błędne połączenie zworek na płytce (piny BOOT1 i BOOT2),
  • błędne podłączenie konwertera USB-UART z płytką discovery,
  • brak zresetowania mikrokontrolera przed próbą podłączenia.

Krok 8. Po przejściu dalej pojawia się ekran z informacjami na temat pamięci mikrokontrolera, który nie zawiera dla nas nic istotnego. Przechodzimy do kolejnego ekranu, w którym wybierzemy co chcemy zrobić.

Ekran wyboru akcji aplikacji obsługującej bootloader

Ekran wyboru akcji aplikacji obsługującej bootloader

Na powyższym ekranie widzimy, że za pomocą bootloadera możemy wyczyścić pamięć (całą lub jej wybrane obszary), wgrać nowy program do mikrokontrolera lub pobrać ten, który się w nim aktualnie znajduje. Interesuje nas zaprogramowanie układu, więc wybieramy opcję Download to device, a następnie wybieramy odpowiedni plik.

Wybieranie pliku do wgrania

Wybieranie pliku do wgrania.

Po wybraniu pliku mamy kilka opcji związanych z wgrywaniem programu na mikrokontroler. W sekcji zaznaczonej na zielono możemy wybrać, czy pamięć mikrokontrolera ma być wymazywana tylko częściowo, w całości, czy w ogóle. W sekcji zaznaczonej na niebiesko możemy wybrać, czy bezpośrednio po wgraniu programu ma nastąpić przejście do aplikacji właściwej.

Opcje wgrywania pliku do mikrokontrolera

Opcje wgrywania pliku do mikrokontrolera.

Wybieramy pożądane opcje, klikamy Next i czekamy na wgranie programu. Jeżeli wszystko się powiodło, powinniśmy otrzymać następujący komunikat.

Komunikat o poprawnym wgraniu programu na mikrokontroler

Komunikat o poprawnym wgraniu programu na mikrokontroler.

Świetnie! Udało nam się zaprogramować mikrokontroler bez użycia programatora. Jeżeli zaznaczyliśmy opcję Jump to the user program, nasz mikrokontroler powinien właśnie realizować program, który został na niego wgrany.

Programowanie mikrokontrolera przez USB

Jak już było wcześniej wspomniane, nasz mikrokontroler można również zaprogramować za pomocą USB, zatem do dzieła!

Krok 1. Zwieramy BOOT1 do stanu wysokiego (VDD), a BOOT0 (PB2) do stanu niskiego (GND).

Krok 2. Podłączamy płytkę do komputera kablem microUSB.

Krok 3. Pobieramy i instalujemy program DFuSe Demo ze strony producenta.

Krok 4. Uruchamiamy program DfuFileMgr. Jest to program, za pomocą którego konwertujemy plik binarny na specjalny plik *.dfu.

Krok 5. Ponieważ chcemy wygenerować plik DFU, wybieramy pierwszą opcję dostępną w panelu. Wybieramy OK.

Ekran startowy programu DFU File Manager

Ekran startowy programu DFU File Manager.

Krok 6. W kolejnym panelu wybieramy opcję Multi BIN, ponieważ chcemy konwertować plik *.bin.

Panel wyboru typu pliku binarnego

Panel wyboru typu pliku binarnego.

Krok 7. Klikamy  na przycisk wyboru ścieżki.

KursF4_12_17

Panel wyboru pliku.

Krok 8. Wybieramy plik binarny.

Plik binarny do przekonwertowania

Plik binarny do przekonwertowania.

Krok 9. Klikamy Zapisz, następnie Ok i Generate. Wybieramy lokację docelową i nazwę dla naszego nowego pliku *.dfu. Zamykamy program DFU File Manager.

Krok 10. Uruchamiamy program DFuSe Demo.

Krok 11. Resetujemy mikrokontroler. Okienko programu powinno się zapełnić informacjami dotyczącymi naszego mikrokontrolera.

Ekran główny programu DfuSe Demo

Ekran główny programu DfuSe Demo.

Krok 12. Wybieramy przygotowany plik i wgrywamy go na mikrokontroler przyciskiem Upload.

Wczytany i przygotowany do wgrania na mikrokontroler plik binarny

Wczytany i przygotowany do wgrania na mikrokontroler plik binarny.

Krok 13. Jeżeli operacja się powiodła, naszym oczom powinien ukazać się następujący ekran.

Komunikat poprawnego zakończenia procesu wgrywania programu

Komunikat poprawnego zakończenia procesu wgrywania programu.

Chcąc wyprowadzić mikrokontroler z bootloadera wystarczy kliknąć przycisk Leave DFU Mode lub usunąć założone wcześniej zworki i zresetować mikrokontroler.

Podsumowanie

W dzisiejszym odcinku nauczyliśmy się korzystać z domyślnego bootloadera, znajdującego się na wyposażeniu każdego mikrokontrolera STM32. Przećwiczyliśmy wgrywanie programu za pomocą interfejsu USART oraz USB. Jeżeli macie jakieś pytania lub problemy, to piszcie w komentarzach!

Nawigacja kursu

Autor kursu: Bartek (Popeye) Kurosz
Redakcja: Damian (Treker) Szymański

bootloader, kurs, kursSTM32F4, programowanie, stm32, uart, USB

Trwa ładowanie komentarzy...