Programowanie pamięci Flash w STM32F107 przez USB

Mikrokontrolery STM32 z grupy Connectivity Line, w skład której wchodzą układy STM32F105 oraz STM32F107, można programować w dwa zasadnicze sposoby: za pomocą interfejsu JTAG oraz za pomocą bootloadera ulokowanego w pamięci mikrokontrolera.

Mikrokontrolery STM32 z grupy Connectivity Line, w skład której wchodzą układy STM32F105 oraz STM32F107, można programować w dwa zasadnicze sposoby:

  • za pomocą interfejsu JTAG oraz
  • za pomocą bootloadera ulokowanego w pamięci mikrokontrolera.

Korzystanie z interfejsu JTAG wiąże się z koniecznością posiadania odpowiedniego sprzętowego interfejsu (jak na przykład ZL30PRG). Zastosowanie bootloadera wbudowanego w mikrokontrolery Connectivity Line – choć okupione mniejszą wygodą podczas programowania pamięci – umożliwia programowanie pamięci Flash przez jeden z kilku interfejsów komunikacyjnych.
W artykule przedstawiamy sposób zaprogramowania pamięci z wykorzystaniem klasy DFU (Device Firmware Upgrade) interfejsu USB.

Alternatywne sposoby wykorzystania bootloadera przedstawiamy w artykułach:

Bootloader jest umieszczony w pamięci systemowej mikrokontrolerów STM32F105 oraz STM32F107. Udostępnia on trzy główne kanały komunikacji, za pośrednictwem których można wgrać program do pamięci Flash, są to: UART, CAN oraz USB – klasa DFU. Bootloader zastosowany w mikrokontrolerach STM32F105 i STM32F107 jest standardowo wyposażony w obsługę DFU.
Część mikrokontrolerów z grupy Connectivity Line obarczona jest wadą, która w skrajnych przypadkach uniemożliwia wykorzystanie bootloadera. Wada ta występuje w przypadku mikrokontrolerów oznaczonych kodem daty produkcji mniejszym niż 937 i ma wpływ na działanie wszystkich kanałów komunikacji z bootloaderem. Konieczne jest połączenie z plusem zasilania linii GPIO: PA10, PB5 oraz PD6 (rys. 1). Trzeba także pamiętać o podanie na linię BOOT0 logicznej „1”, a na linię BOOT 1 – „0”. Po wykonaniu tych czynności i podłączeniu napięcia zasilania mikrokontroler powinien wystartować z pamięci systemowej.

Rys. 1. Fragment schematu elektrycznego urządzenia z mikrokontrolerem STM32F107 programowanym w trybie DFU

Rys. 1. Fragment schematu elektrycznego urządzenia z mikrokontrolerem STM32F107 programowanym w trybie DFU

Programowanie z wykorzystaniem mechanizmu DFU okupione jest dość sporym nakładem pracy. Pierwszą czynnością jest ściągnięcie i zainstalowanie aplikacji DfuSe. W katalogu z aplikacją znajduje się sterownik klasy DFU, który musi zostać zainstalowany, aby możliwa była komunikacja aplikacji z mikrokontrolerem. W tym celu należy połączyć płytkę z mikrokontrolerem kablem typu USB A-B z komputerem PC. System Windows powinien wykryć nowe urządzenie klasy DFU i rozpocząć instalację sterowników. Po wskazaniu kreatorowi aby automatycznie wyszukał odpowiedni sterownik, powinien on odnaleźć odpowiedni sterownik i go zainstalować. W trakcie instalacji może pojawić się monit o wskazanie lokalizacji pliku STTub30.sys (należy wskazać plik w podkatalogu odpowiednim dla posiadanej wersji systemu operacyjnego), a także informacja o tym, że sterownik nie został cyfrowo podpisany. Instalacja sterownika powinna zakończyć się komunikatem informującym o jej pomyślnym zakończeniu.

Rys. 2. Okno programu DfuSe Demonstration

Rys. 2. Okno programu DfuSe Demonstration

Po zainstalowaniu sterownika należy uruchomić program DfuSe Demonstration (rys. 2). Program powinien wykryć mikrokontroler umieszczony na płytce jako STM Device in DFU mode. W polu DFU Mode są wyświetlane dane identyfikujące urządzenie USB: numery VID, PID oraz Version.
Mikrokontroler STM32F107VBT6 ma dwa możliwe do zaprogramowania obszary pamięci:

  • Internal Flash reprezentujący pamięć Flash oraz
  • Option Bytes reprezentujący bajty konfiguracyjne.

W celu zaprogramowania pamięci konieczne jest przygotowanie pliku *.dfu, który oprócz danych przeznaczonych do zaprogramowania zawiera również dane identyfikujące wersję aplikacji urządzenia dla którego plik jest przeznaczony. Ponieważ mechanizm DFU jest przeznaczony do uaktualniania oprogramowania, stanowi on zwykle dodatek do oprogramowania umieszczonego w urządzeniu, które wykorzystuje interfejs USB do innych celów. Wykorzystując mechanizm DFU do programowania pamięci mikrokontrolerów STM32 w rzeczywistości nie uaktualniamy oprogramowania, tylko wgrywamy jego „pierwszą” wersję, tak więc dane identyfikujące urządzenie oraz wersję zainstalowanego oprogramowania nie mają znaczenia.

Rys. 3. Okno programu DFU File Manager

Rys. 3. Okno programu DFU File Manager

Do przygotowywania plików *.dfu służy program DFU File Manager (rys. 3). Pierwszą czynnością jaką należy wykonać po uruchomieniu programu jest wybór operacji, jaką zamierzamy wykonać. Do wyboru mamy: utworzenie pliku *.dfu z plików binarnych lub odtworzenie plików binarnych z pliku *.dfu. Nas interesuje opcja „I want to GENERATE a DFU file…”. Po jej wybraniu wyświetlone zostanie okno służące do wprowadzenia parametrów tworzonego pliku DFU (rys. 4). Numery Vendor ID, Product ID oraz Version są nieistotne, pozostawmy je więc niezmienione. Jedynym istotnym parametrem jest parametr Target ID, który w przypadku wewnętrznej pamięci Flash mikrokontrolera ma wartość 0.
 

Rys. 4. Okno służące do wprowadzenia parametrów tworzonego pliku DFU

Rys. 4. Okno służące do wprowadzenia parametrów tworzonego pliku DFU

Zaletą mechanizmu DFU jest możliwość umieszczenia w jednym pliku DFU danych dla kilku różnych pamięci, w tym również pamięci zewnętrznych podłączanych np. poprzez magistrale szeregowe. Klikając przycisk „S19 or hex” należy wskazać plik zawierający kod przeznaczony do zaprogramowania pamięci mikrokontrolera. Po wskazaniu pliku z kodem należy kliknąć przycisk Generate oraz wskazać lokalizację i nazwę wyjściowego pliku *.dfu. Pomyślnie zakończone generowanie pliku zostanie zasygnalizowane odpowiednim komunikatem (rys. 5).

 Rys. 5. Informacja o poprawnie zakończonej generacji pliku DFU

Rys. 5. Informacja o poprawnie zakończonej generacji pliku DFU

Rys. 6. Okno programu DfuSe Demonstration po poprawnym załadowaniu pliku *.dfu

Rys. 6. Okno programu DfuSe Demonstration po poprawnym załadowaniu pliku *.dfu

Po wygenerowaniu pliku *.dfu należy ponownie uruchomić program DfuSe Demonstration, następnie załadować wygenerowany uprzednio plik *.dfu (rys. 6). Po poprawnym załadowaniu pliku *.dfu zostaną wyświetlone informacje na temat jego zawartości. W celu zaprogramowania pamięci Flash należy kliknąć przycisk Upgrade. Wyświetlony zostanie komunikat pokazany na rys. 7, informujący o braku możliwości sprawdzenia czy plik *.dfu jest wgrywany do właściwego urządzenia. Należy potwierdzić chęć kontynuacji procesu wgrywania poprzez kliknięcie przycisku Yes. Pomyślne wgranie programu do pamięci Flash zostanie zasygnalizowane odpowiednim komunikatem (rys. 8).

Rys. 7. Komunikat informujący o braku możliwości sprawdzenia czy plik *.dfu jest wgrywany do właściwego urządzenia

Rys. 7. Komunikat informujący o braku możliwości sprawdzenia czy plik *.dfu jest wgrywany do właściwego urządzenia

 

Rys. 8. Komunikat informujący o poprawnym zapisaniu pamięci Flash mikorkontrolera

Rys. 8. Komunikat informujący o poprawnym zapisaniu pamięci Flash mikorkontrolera

Przygotowywanie pliku *.dfu z pliku *.hex jest dość kłopotliwe i czyni metodę programowania pamięci z wykorzystaniem mechanizmu DFU mało przydatną na etapie tworzenia programu. Jak już wcześniej wspominano, mechanizm DFU został opracowany z myślą o prostym uaktualnianiu oprogramowania w działających urządzeniach i na etapie produkcyjnym jego przydatność jest mocno dyskusyjna. Programowanie z wykorzystaniem DFU traktować jako rozwiązanie „awaryjne” w przypadku braku możliwości zaprogramowania pamięci inną, bardziej wygodną metodą programowania pamięci.

Radosław Kwiecień

O autorze