DZWON

Są tacy, którzy czytają tę wiadomość przed wami.
Zapisz się, aby otrzymywać najnowsze artykuły.
E-mail
Imię
Nazwisko
Jak chcesz przeczytać The Bell
Bez spamu

Ten klon Arduino oferuje specjalny bootloader, który umożliwia przesyłanie oprogramowania układowego przez USB, bez korzystania z zewnętrznych komponentów, takich jak adapter ST-Link lub USB-UART.

Dziś potrzebowałem pracować z gołym kontrolerem spod CooCox i bez stm32duino. Ale tu jest problem. Nawet prosty migacz z żarówką przelaną przez ten bootloader nie działa.

Zrozummy to. Może moje obliczenia wydadzą się komuś banalne. Ale dopiero zaczynam studiować kontrolery STM32 i zabiłem co najmniej pół dnia, aby znaleźć problem. Nagle ten artykuł skróci komuś czas tworzenia.

Nie mam nic przeciwko ST-Link i innym debuggerom. Ale w moim gotowym urządzeniu nie będzie, ale na pewno będzie to USB. Dlaczego nie włączyć od razu możliwości aktualizacji oprogramowania przez USB? Osobiście uważam tę metodę za wygodną. tym bardziej, że mam już smycz podłączoną do zasilania i USB Serial.

Zobaczmy, jak działa bootloader. Zacznijmy od przykładu kontrolerów AVR. Dlaczego go zapamiętałem? Przeszedłem z Arduino i podświadomie spodziewałem się takiego samego zachowania. Ale w STM32 wszystko okazało się inne. Dlatego chcę porozmawiać o różnicy między tymi dwoma mikrokontrolerami.

Więc. W mikrokontrolerach AVR ATMega pod koniec flashowania można zarezerwować pewną ilość pamięci dla bootloadera. Używając bitów bezpiecznika, możesz ustawić, z którego adresu program będzie się uruchamiał. Jeśli nie ma bootloadera, program startuje od adresu 0x0000. Jeśli istnieje bootloader, zaczyna się od innego adresu (powiedzmy w ATMega32 z 0x3C00, jeśli rozmiar bootloadera wynosi 2k).

Gdy bootloader zakończy swoją pracę, przekazuje kontrolę do programu głównego z adresu 0x0000. Te. program zawsze zaczyna się od adresu 0x0000. Kompilator i konsolidator działają z założeniem, że kod będzie na początku przestrzeni adresowej.

Inaczej jest w przypadku mikrokontrolerów STM32. Wszystkie programy zaczynają się od adresu 0x0800000. Bootloader nie jest taki wyjątkowy. To jest ten sam program, który zaczyna się od tego samego adresu początkowego. W trakcie pracy bootloader może odebrać firmware (przez USB lub UART, czytać z pendrive'a, odbierać z satelity, pobierać z podprzestrzeni, cokolwiek ...) i zapisywać na adresy wyższe niż sam bootloader. I oczywiście po zakończeniu pracy przenieś kontrolę do programu głównego.


Dlatego podczas kompilowania oprogramowania sprzętowego musisz wiedzieć, gdzie bootloader zapisze oprogramowanie układowe i odpowiednio dostosuje adresy.

To wszystko z teorią. Zabierzmy się do ćwiczeń. Poniżej znajduje się instrukcja krok po kroku, jak przykręcić bootloader USB do mikrokontrolerów serii STM32F1xx, a może także do kilku innych.

Istnieją jednak pewne ograniczenia dotyczące obwodów elektrycznych. Tutaj niestety nie jestem silny. YTP potrzebuje rezystora podciągającego 1,5 kB dla portu PA12 (znanego również jako USB D +). Pozwala to bootloaderowi łączyć się i odłączać od USB we właściwym czasie.

  • Mikrokontroler jest teraz gotowy do flashowania przez bootloader USB. Ale samo oprogramowanie nadal wymaga poprawek. Musisz zrobić 2 rzeczy:
    • Podaj linkerowi adres początkowy. W CooCox odbywa się to w ustawieniach projektu, zakładka Link, sekcja Memory Areas, IROM1 Start Address. Program ładujący pobiera pierwsze 8 kilobajtów, co oznacza, że \u200b\u200bpoczątkowy adres oprogramowania układowego to 0x0800000 + 0x2000 \u003d 0x08002000. Pole Size powinno być prawdopodobnie również zmniejszone o 8k.
    • Gdzieś na początku programu, przed inicjalizacją peryferii, wykonaj połączenie

      NVIC_SetVectorTable (NVIC_VectTab_FLASH, 0x2000);

      UPDATE 05/17/2018: W nowoczesnej wersji STM32Cube nie ma funkcji NVIC_SetVectorTable (). Zamiast tego możesz naprawić definicję VECT_TAB_OFFSET w pliku system_stm32f1xx.c (lub podobnie dla innego mikrokontrolera)

  • Wypełniacz oprogramowania układowego można pobrać z projektu stm32duino. W katalogu narzędzi poszukaj skryptu o nazwie maple_upload. Użyłem tylko wersji Windows - maple_upload.bat.
  • Uruchom w ten sposób:

    "maple_upload.bat" COM20 2 1EAF: 0003 "Ścieżka \\ Do \\ Firmware.bin"
    Zamiast COM20 musisz zastąpić port, do którego podłączony jest mikrokontroler.

    Wypełnienie jest bardzo delikatne, nie lubi ścieżek względnych. więc ścieżka do oprogramowania sprzętowego musi być określona w całości.

    1EAF: 0003 to VID i PID

    2 to parametr AltID, który wskazuje, że firmware należy wgrać pod adres 0x08002000 (odczyt).

  • Jeszcze kilka niuansów. Przed wgraniem oprogramowania należy uruchomić bootloader. Najłatwiej jest nacisnąć przycisk resetowania. Następnie bootloader uruchomi się i będzie czekał na oprogramowanie układowe przez kilka sekund. Jeśli w tym momencie nikt nie uruchomił maple_upload, bootloader przekaże kontrolę do głównego oprogramowania układowego.

    Może to powodować niedogodności. Jeśli mikrokontroler zepsuje się i zawiesza, oznacza to, że nie nasłuchuje już portu. W konsekwencji nie słyszy sekwencji klawiszy i nie uruchamia się ponownie w bootloaderze. Następnie zresetuj tylko, aby pomóc.

    To wszystko. Mam nadzieję, że mój artykuł rzuci trochę światła na to, jak działa bootloader w STM32 i jak można pobrać oprogramowanie układowe przez port USB. Niestety próg wejścia jest wciąż wysoki, ale nagle mój artykuł pomoże komuś go pokonać.

    Każdy mikrokontroler STM32 może zostać przesłany USART_1 i inne interfejsy, zobacz szczegóły. Aby to zrobić, MK ma wszyty specjalny program ładujący system Pamięć systemowa (specjalny obszar pamięci) na etapie produkcji nie można go usunąć ani zmienić. Ten bootloader jest inicjowany przez „pociągnięcie” pin BOOT_0 do „plusa”, po czym czeka na nadejście oprogramowania układowego.

    Dowolne pliki .bin lub .hex można załadować przez USART.

    Opis jest wykonany na przykładzie tablicy Blue Pill, ale wszystko, co zostało powiedziane, jest prawdą dla każdego stm32.

    Płytki firmowe Discovery i Nucleo mogą być również flashowane przez USART.

    Do pracy potrzebny jest konwerter USB na UART ...

    Jeśli czegoś takiego nie ma, są dwie opcje przekształcenia arduiny w konwerter ...

    transformacja

    1 ... Blisko RESETOWANIE na GND (może nie działać).
    2 ... Załaduj do niego taki prosty szkic:

    Void setup () (pinMode (0, INPUT); pinMode (1, INPUT);) void loop () ()

    Aby sprawdzić, czy arduin działa jako konwerter, zewrzyj RX i TX, otwórz i wyślij kilka znaków. Jeśli wrócili, wszystko działa.

    Przed flashowaniem należy podciągnąć pin BOOT0 do „plusa”, to przeniesie MK do trybu „bootloadera systemu”. Na opisanej płytce dokonuje się tego poprzez przestawienie zworki ...

    Jeśli tablica jest oznakowana

    Na markowych płytach (Discovery, Nucleo) musisz również podciągnąć pin BOOT0 do plusa, ale po prostu nie możesz tego zrobić. Weź schemat swojej planszy i znajdź tam odpowiednie zworki ...

    Musisz wyszukać coś takiego:

    Nie pamiętam, z której płytki jest ten obwód, ale istota jest taka: w tym przypadku pin BOOT_0 podciągnięty do „minusa” przez rezystor R16 i zworkę SB16. Jeśli usuniesz zworkę SB16, pin zostanie podciągnięty do „plusa” przez rezystor R17 i będzie można go migać. Po oprogramowaniu musisz przywrócić wszystko na swoje miejsce.

    Zworka może wyglądać jak rezystor.

    Łączymy konwerter i STM w następujący sposób ...

    obrazek

    Przetwornik RX <-> PA9 STM
    Przetwornik TX <-> PA10 STM
    Przetwornik GND <-> GND STM

    ... i podłącz konwerter i STM do komputera.

    Instrukcje oprogramowania układowego dla

    Jeśli chcesz, możesz pobrać go ze strony ST (na samym dole strony).

    Kliknij Resetuj na tablicy.

    Przejdź do folderu Flash Loader Demonstrator i biegnij Flash Loader Demonstrator.exe

    Wybierz port COM konwertera i kliknij Kolejny...

    OSTRZEŻENIE Usuń ochronę

    Taka wiadomość ...

    ... oznacza, że \u200b\u200btablica jest zablokowana. W porządku, po prostu usuń ochronę za pomocą przycisku Usuń ochronę a następnie kliknij dobrze.

    Ochrona usunięta.


    Jeśli nadal daje jakieś błędy to albo nie nacisnął Reset albo coś z konwerterem.

    Jeśli sygnalizacja świetlna daje zielone światło, możesz nacisnąć przycisk Kolejny...

    Naciskamy Kolejny...

    W takt Pobierz na urządzenie określ ścieżkę do żądanego pliku .bin lub .hex i kliknij Kolejny...

    Wszystko gotowe, przywróć zworkę do pierwotnej pozycji i naciśnij Reset.

    Instrukcje oprogramowania układowego dla

    Pobierz i rozpakuj gdzieś.

    Z folderu odpowiadającego Twojemu systemowi operacyjnemu skopiuj plik stm32flash do folderu domowego.

    To narzędzie jest w rzepie ubuntu, nie znam w innych dystrybucjach, więc je publikuję.

    Zawsze naciśnij Reset na płycie przed flashowaniem.

    W terminalu wydaj polecenie:

    ./stm32flash -w /home/dima/myfile.bin -v -g 0x0 / dev / ttyUSB0
    Będziesz mieć własną nazwę i ścieżkę dostępu do pliku. Za pomocą tego narzędzia można również flashować pliki HEX.

    Jeśli przysięga na prawo, wydaj polecenie ...

    Sudo chmod 777 / dev / ttyUSB0

    ... lub uruchom narzędzie przez sudo.

    Ochrona przed zapisem

    Jeśli pojawi się ten komunikat ...

    ... następnie wydaj kolejno dwa polecenia:

    ./stm32flash -u / dev / ttyUSB0 ./stm32flash -k / dev / ttyUSB0

    Pierwsza usuwa ochronę przed zapisem, druga - ochronę przed odczytem.

    Jeśli miałeś bootloader Arduin, zostanie on nadpisany, aby go przywrócić, po prostu wypełnij go metodą opisaną powyżej

    Załóżmy, że wprowadzasz swoje urządzenie na rynek i boisz się, że ktoś zacznie je kopiować ... Owszem, wystarczy podłączyć programator do naszego urządzenia i odczytać firmware np. Poprzez ST-Link Utility ( CelPołączyć).

    Oczywiście możesz po prostu oderwać nóżki mikrokontrolera ... ale twórcy ST Microelectronics oferują lepszą alternatywę. Wszystkie MCU mają odczytany system ochrony. Jego istota jest niezwykle prosta - jeśli określona wartość zostanie ustawiona w specjalnym rejestrze (bajty opcji), to możliwość debugowania i odczytu oprogramowania układowego jest wyłączona. W tym trybie stracisz również możliwość flashowania MK. Oczywiście zabezpieczenie to można wyłączyć zmieniając wartość w rejestrze bajtów opcji, ale w tym przypadku pamięć programu zostanie nadpisana, co oznacza, że \u200b\u200bnikt nie będzie mógł go skopiować.

    Możesz zmienić wartość w rejestrze za pomocą tego samego narzędzia ST-Link, CelBajty opcji ...Odczytaj ochronęWŁĄCZYĆ.


    Możesz odpowiednio wyłączyć w podobny sposób. Nie jest to zbyt wygodne, jeśli jest wiele urządzeń. Ochronę można włączyć programowo.

    Aby zaimplementować ochronę, wygodnie jest użyć standardowej biblioteki urządzeń peryferyjnych, a konkretnie stm32f10x_flash.c zawiera potrzebną nam funkcję. Sam rejestr, jak również praca z pamięcią flash, jest opisany w dokumencie. Jednak wcześniej pamiętajmy, jak zaimplementowano ochronę wielokrotnego dołączania plików nagłówkowych. Użyliśmy dyrektyw preprocesora, takich jak:

    • #define - dyrektywa mówi preprocesorowi, aby podmienił linię w pliku, jednak jeśli argument (co jest na końcu) nie jest określony, to sam identyfikator (co jest w środku) pozostaje w systemie i może być sprawdzony przez inne dyrektywy (to znaczy możesz napisać warunek, jeśli który kod zostanie wykonany lub odwrotnie);
    • #ifndef - dyrektywę można odczytać jako „jeśli nie zdefiniowaną”, ale inny #ifdef - „jeśli określony” jest dla nas bardziej odpowiedni;
    • #endif to dyrektywa wskazująca koniec warunku.

    Utwórzmy identyfikator, który powie, że ten zestaw jest ostateczny. Gdy ta linia jest zakomentowana, kod umieszczony między #ifdef i #endif nie zostanie wykonany.

    // # zdefiniuj RELEASE

    Przy końcowym montażu wystarczy po prostu odkomentować linię i sflashować urządzenie.

    #ifdef RELEASE // kod tutaj #endif

    A teraz na sam dół. Dowiedzieliśmy się już, jak pracować z wewnętrzną pamięcią flash mikrokontrolera. Przed zapisaniem bitów zabezpieczających należy odblokować dostęp do pamięci, następnie należy wykonać niezbędne operacje i ponownie zablokować dostęp. Okazuje się, że:

    #ifdef RELEASE #warning "Ochrona jest WŁĄCZONA. Debugowanie jest WYŁĄCZONE" if (FLASH_GetReadOutProtectionStatus () \u003d\u003d RESET) (FLASH_Unlock (); FLASH_ReadOutProtection (ENABLE); FLASH_Lock ();) #endif

    Dzisiaj będziemy chronić oprogramowanie układowe na stm32 przed odczytaniem przez fajnych hakerów. Aby nie ciągnąć gumy, oto fragment kodu:

    #ifdef NDEBUG if (FLASH_GetReadOutProtectionStatus () \u003d\u003d RESET) (FLASH_Unlock (); FLASH_ReadOutProtection (ENABLE); FLASH_Lock ();) #endif

    Jak można się domyślić, utwór korzysta z biblioteki stm. Wykorzystanie takiego fragmentu kodu jest bardzo wygodne - sterownik ustawia własne zabezpieczenie przy pierwszym uruchomieniu, a pierwsze uruchomienie jest łatwe do zorganizowania po oprogramowaniu. Oto jest wolność od tyranii lontów!

    Tak, wiem o pomocy „biblioteka a bezpośrednie odniesienie do rejestrów”. Moje stanowisko jest takie - jeśli potrzebujesz dużej szybkości lub jest bardzo mało pamięci, ale potrzebujesz bezpośredniego dostępu do rejestrów. Jeśli szybkość nie jest ważna, a pamięci jest dużo, lepiej jest skorzystać z biblioteki - dzięki temu program jest napisany szybciej i jest bardziej czytelny.

    Usuń ochronę
    Chroniliśmy kontrolera. Problem w tym, że musimy naprawić nasz program, a przy zainstalowanym zabezpieczeniu nic nie da się zrobić ze sterownikiem - ani czytać, ani pisać. Jak usunąć ochronę? Ostrzegam od razu - chłopaki z ST zrobili wszystko dobrze i całe oprogramowanie zostaje zniszczone wraz z ochroną.

    Aby usunąć ochronę, potrzebujemy programu narzędziowego st-link. Możesz to pobrać.

    Uruchom program i wybierz ten element lub po prostu naciśnij ctrl-b:

    W polu „stan ochrony przed odczytem wybierz wyłączone”. I kliknij przycisk Zastosuj:

    Wraz z bitem zabezpieczającym kasowana jest cała pamięć:

    Chroń się, jesteśmy za bezpiecznym osadzaniem.



    W swoim projekcie używam mikrokontrolera STM32F103C8 oraz frameworka stm32duino. Ten klon Arduino oferuje specjalny bootloader, który umożliwia przesyłanie oprogramowania układowego przez USB, bez korzystania z zewnętrznych komponentów, takich jak adapter ST-Link lub USB-UART.

    Dziś potrzebowałem pracować z gołym kontrolerem spod CooCox i bez stm32duino. Ale tu jest problem. Nawet prosty migacz z żarówką przelaną przez ten bootloader nie działa.

    Zrozummy to. Może moje obliczenia wydadzą się komuś banalne. Ale dopiero zaczynam studiować kontrolery STM32 i zabiłem co najmniej pół dnia, aby znaleźć problem. Nagle ten artykuł skróci komuś czas tworzenia.

    Nie mam nic przeciwko ST-Link i innym debuggerom. Ale w moim gotowym urządzeniu nie będzie, ale na pewno będzie to USB. Dlaczego nie włączyć od razu możliwości aktualizacji oprogramowania przez USB? Osobiście uważam tę metodę za wygodną. tym bardziej, że mam już smycz podłączoną do zasilania i USB Serial.

    Zobaczmy, jak działa bootloader. Zacznijmy od przykładu kontrolerów AVR. Dlaczego go zapamiętałem? Przeszedłem z Arduino i podświadomie spodziewałem się takiego samego zachowania. Ale w STM32 wszystko okazało się inne. Dlatego chcę porozmawiać o różnicy między tymi dwoma mikrokontrolerami.

    Więc. W mikrokontrolerach AVR ATMega pod koniec flashowania można zarezerwować pewną ilość pamięci dla bootloadera. Używając bitów bezpiecznika, możesz ustawić, z którego adresu program będzie się uruchamiał. Jeśli nie ma bootloadera, program startuje od adresu 0x0000. Jeśli istnieje bootloader, zaczyna się od innego adresu (powiedzmy w ATMega32 z 0x3C00, jeśli rozmiar bootloadera wynosi 2k).


    Gdy bootloader zakończy swoją pracę, przekazuje kontrolę do programu głównego z adresu 0x0000. Te. program zawsze zaczyna się od adresu 0x0000. Kompilator i konsolidator działają z założeniem, że kod będzie na początku przestrzeni adresowej.

    Inaczej jest w przypadku mikrokontrolerów STM32. Wszystkie programy zaczynają się od adresu 0x0800000. Bootloader nie jest taki wyjątkowy. To jest ten sam program, który zaczyna się od tego samego adresu początkowego. W trakcie pracy bootloader może odebrać firmware (przez USB lub UART, czytać z pendrive'a, odbierać z satelity, pobierać z podprzestrzeni, cokolwiek ...) i zapisywać na adresy wyższe niż sam bootloader. I oczywiście po zakończeniu pracy przenieś kontrolę do programu głównego.


    Dlatego podczas kompilowania oprogramowania sprzętowego musisz wiedzieć, gdzie bootloader zapisze oprogramowanie układowe i odpowiednio dostosuje adresy.

    To wszystko z teorią. Zabierzmy się do ćwiczeń. Poniżej znajduje się instrukcja krok po kroku, jak przykręcić bootloader USB do mikrokontrolerów serii STM32F1xx, a może także do kilku innych.

    Istnieją jednak pewne ograniczenia dotyczące obwodów elektrycznych. Tutaj niestety nie jestem silny. YTP potrzebuje rezystora podciągającego 1,5 kB dla portu PA12 (znanego również jako USB D +). Pozwala to bootloaderowi łączyć się i odłączać od USB we właściwym czasie.

  • Mikrokontroler jest teraz gotowy do flashowania przez bootloader USB. Ale samo oprogramowanie nadal wymaga poprawek. Musisz zrobić 2 rzeczy:
    • Podaj linkerowi adres początkowy. W CooCox odbywa się to w ustawieniach projektu, zakładka Link, sekcja Memory Areas, IROM1 Start Address. Program ładujący pobiera pierwsze 8 kilobajtów, co oznacza, że \u200b\u200bpoczątkowy adres oprogramowania układowego to 0x0800000 + 0x2000 \u003d 0x08002000. Pole Size powinno być prawdopodobnie również zmniejszone o 8k.
    • Gdzieś na początku programu, przed inicjalizacją peryferii, wykonaj połączenie

      NVIC_SetVectorTable (NVIC_VectTab_FLASH, 0x2000);

  • Wypełniacz oprogramowania układowego można pobrać z projektu stm32duino. W katalogu narzędzi poszukaj skryptu o nazwie maple_upload. Użyłem tylko wersji Windows - maple_upload.bat.
  • Uruchom w ten sposób:

    "maple_upload.bat" COM20 2 1EAF: 0003 "Ścieżka \\ Do \\ Firmware.bin"
    Zamiast COM20 musisz zastąpić port, do którego podłączony jest mikrokontroler.

    Wypełnienie jest bardzo delikatne, nie lubi ścieżek względnych. więc ścieżka do oprogramowania sprzętowego musi być określona w całości.

    1EAF: 0003 to VID i PID

    2 to parametr AltID, który wskazuje, że firmware należy wgrać pod adres 0x08002000 (odczyt).

  • Jeszcze kilka niuansów. Przed wgraniem oprogramowania należy uruchomić bootloader. Najłatwiej jest nacisnąć przycisk resetowania. Następnie bootloader uruchomi się i będzie czekał na oprogramowanie układowe przez kilka sekund. Jeśli w tym momencie nikt nie uruchomił maple_upload, bootloader przekaże kontrolę do głównego oprogramowania układowego.

    Może to powodować niedogodności. Jeśli mikrokontroler zepsuje się i zawiesza, oznacza to, że nie nasłuchuje już portu. W konsekwencji nie słyszy sekwencji klawiszy i nie uruchamia się ponownie w bootloaderze. Następnie zresetuj tylko, aby pomóc.

    To wszystko. Mam nadzieję, że mój artykuł rzuci trochę światła na to, jak działa bootloader w STM32 i jak można pobrać oprogramowanie układowe przez port USB. Niestety próg wejścia jest wciąż wysoki, ale nagle mój artykuł pomoże komuś go pokonać.

    DZWON

    Są tacy, którzy czytają tę wiadomość przed wami.
    Zapisz się, aby otrzymywać najnowsze artykuły.
    E-mail
    Imię
    Nazwisko
    Jak chcesz przeczytać The Bell
    Bez spamu