Alternatywna metoda programowania pamięci Flash mikrokontrolerów STM32.pdf

(2108 KB) Pobierz
054-057_dfu.indd
SPRZĘT
DfuSe: USB Device
Firmware Upgrade
Alternatywna metoda
programowania pamięci Flash
mikrokontrolerów STM32
Urządzenie umożliwiające sko-
rzystanie z mechanizmu DFU pełni
dwie zamienne funkcje: „właściwego”
urządzenia USB oraz programatora
pamięci Flash ROM. Ponieważ nie-
praktyczne byłoby, gdyby obydwie te
funkcje dostępne były jednocześnie
w czasie wykonywania operacji DFU
podstawowe funkcje urządzenia nie
są dostępne. Nic nie stoi jednak na
przeszkodzie, aby w urządzeniu za-
implementować tylko funkcje DFU,
które byłyby wykorzystane do progra-
mowania pamięci, nawet wtedy, jeśli
urządzenie nie jest przeznaczone do
pełnienia swoich podstawowych funk-
cji w powiązaniu z magistralą USB
i wykorzystywana jest ona wyłącznie
do ładowania programu do pamięci.
W niniejszym artykule przedstawiony
zostanie sposób, jak wykorzystać me-
chanizm DFU do ładowania programu
do pamięci mikrokontrolerów STM32
wyposażonych w interfejs USB.
Mikrokontrolery STM32 wyposażone w interfejs USB mogą
być programowane za pomocą mechanizmu Device Firmware
Upgrade. Mechanizm ten został opracowany na potrzeby
aktualizacji przez użytkownika oprogramowania urządzeń
pracujących na magistrali USB. Przedstawiamy go w artykule.
Przygotowanie kodu
bootloadera DFU
Aby możliwe było wgranie progra-
mu do pamięci Flash poprzez łącze
USB, konieczne jest zaprogramowanie
mikrokontrolera programem realizują-
cym funkcję bootloadera DFU. Oczywi-
ście do tego celu należy wykorzystać
typową metodę programowania pa-
mięci, np. poprzez złącze JTAG, albo
za pomocą systemowego bootloadera
ładującego program przez łącze szere-
gowe. Kod źródłowy sterownika DFU
znajduje się w podkatalogu Examples\
ARM\STM3210B–EVAL\STM32F10xUS-
BLib\USBLib\demos\Device_Firmwa-
re_Upgrade katalogu instalacyjnego
środowiska RIDE (typowo C:\Program
Files\Raisonance\Ride ), które publiku-
jemy na CD–EP6/2008B (jest także
dostępne na stronie www.raisonance.
com ). W podkatalogu Project/RIDE znaj-
duje się plik projektu, który należy
otworzyć w środowisku RIDE. Przyj-
rzyjmy się zawartości pliku main.c ,
a konkretnie fragmentowi funkcji
main , którego treść przedstawiono na
list. 1 .
Fragment ten jest dla nas naj-
-istotniejszą częścią programu sterow-
nika DFU. Do zmiennej JumpAddress
jest przypisywany adres, pod którym
będzie się znajdować ładowany za
pomocą mechanizmu DFU program
użytkownika, a dokładniej tablica
wektorów przerwań. Adres ten musi
wskazywać na drugie słowo obszaru
kodu programu (czyli wektor zerowa-
nia), gdyż w przypadku programów
dla rdzenia ARM Cortex–M3 pierw-
sze słowo pamięci programu zawsze
zawiera wartość początkową wskaźni-
ka stosu. Program użytkownika, któ-
ry będzie ładowany za pomocą DFU
musi być odpowiednio przygotowany.
Sposób przygotowania programu użyt-
kownika zostanie omówiony w dal-
szej części artykułu. Po zainicjowaniu
Jako platformę sprzętową autor wykorzystał
zestaw STM3210B–EVAL, ale prezentowana
aplikacja będzie funkcjonować także w innych
środowiskach sprzętowych mikrokontrolerów
STM32.
54
Elektronika Praktyczna 6/2008
652390602.009.png 652390602.010.png 652390602.011.png
SPRZĘT
List. 1.
JumpAddress = *(vu32*)0x8003804;
DFU_Button_Config();
/* Test if PB.09 level is low (Key push–button on Eval Board pressed) */
if (DFU_Button_Read() != 0x00)
{ /* Test if user code is programmed starting from address 0x8003800 */
if (((*(vu32*)0x8003800) & 0x2FFF0000 ) == 0x20000000)
{ /* Jump to user application */
Jump_To_Application = (pFunction) JumpAddress;
Jump_To_Application();
}
/* Otherwise enters DFU mode to allow user to program his application */
}
zmiennej JumpAddress następuje konfi-
guracja wyprowadzenia PB9, do które-
go jest dołączony przycisk uruchamia-
jący sterownik DFU. Bootloader DFU
zostanie uruchomiony, jeśli przycisk
podłączony do wyprowadzenia PB9
został naciśnięty. W przypadku, gdy
przycisk nie został naciśnięty spraw-
dzana jest wartość pierwszego słowa
pamięci programu użytkownika. Jeżeli
wartość ta wskazuje poza obszar pa-
mięci RAM, można uznać, że pro-
gram użytkownika nie został do tej
pory załadowany i również zostanie
uruchomiony bootloader DFU. Jeśli
natomiast wartość słowa odczytanego
spod adresu pierwszego słowa progra-
mu użytkownika wskazuje na dowol-
ną komórkę pamięci RAM, następuje
pobranie wartości drugiego słowa pa-
mięci programu (0x8003804) będącego
wektorem zerowania wskazującym na
pierwszą instrukcję programu.
W celu otrzymania pliku z kodem
wynikowym bootloadera DFU nale-
ży przeprowadzić kompilację pro-
jektu. Proces kompilacji powinien
zakończyć się sukcesem i w katalogu
z projektem powinien zostać utwo-
rzony plik *.hex . Plikiem tym nale-
ży zaprogramować mikrokontroler za
pomocą interfejsu JTAG lub RS232
z wykorzystaniem bootloadera znajdu-
jącego się w pamięci systemowej mi-
krokontrolera.
Instalacja oprogramowania
W celu załadowania programu za
pomocą mechanizmu DFU należy
zainstalować program DfuSe Demon-
strator ( http://www.st.com/stonline/pro-
ducts/support/micro/files/um0412.zip ,
dostępny także na CD–EP6/2008B).
Instalacja programu przebiega w ty-
powy dla aplikacji systemu Windows
sposób. W katalogu instalacyjnym pro-
gramu znajduje się podkatalog Driver
z plikami sterowników dla systemu
Windows pozwalającymi na komuni-
kację z mikrokontrolerem pracującym
w trybie DFU. Katalog ten należy
wskazać instalatorowi sprzętu po wy-
kryciu przez system mikrokontrolera
podłączonego za pomocą łącza USB
do komputera PC.
Rys. 1.
Instalacja sprzętu
Kolejnym etapem po zainstalowa-
niu aplikacji sterującej jest zainstalo-
wanie w systemie Windows sterow-
ników DFU. W tym celu podłączamy
kablem USB A–B na przykład płytkę
STM3210B–EVAL do wolnego portu
USB w komputerze oraz włączamy
zasilanie płytki.
System Windows powinien wykryć
nowy sprzęt, po czym zostanie uru-
chomiony Kreator znajdowania nowe-
go sprzętu ( rys. 1 ), w którego oknie
powitalnym zaznaczamy opcję Nie,
nie tym razem i klikamy przycisk Da-
lej . W następnym oknie zaznaczamy
opcję Zainstaluj z listy lub określonej
lokalizacji (zaawansowane) ( rys. 2 ).
W kolejnym oknie wskazujemy ścieżkę
dostępu do wspomnianego wcześniej
katalogu ze sterownikami: C:\Program
Files\STMicroelectronics\DfuSe\Driver
( rys. 3 ). Po ukazaniu się ostrzeżenia
Rys. 2.
Elektronika Praktyczna 6/2008
55
652390602.012.png 652390602.001.png
SPRZĘT
Rys. 3.
zmianę adresu początku sekcji Flash.
W tym celu należy wejść do katalo-
gu C:\Program Files\Raisonance\Ride\
Lib\ARM i skopiować plik STM32F103_
128K_20K_DEF.ld pod inną nazwę, np.
STM32F103_128K_20K_DEF_DFU.ld .
Nowy plik należy otworzyć edy-
torem tekstowym i dokonać zmiany
adresu sekcji Flash z domyślnej:
FLASH (rx) : ORIGIN = 0x8000000,
LENGTH = 128K
na odpowiednią dla współpracy
z DFU:
FLASH (rx) : ORIGIN = 0x8003800,
LENGTH = 114K
Następnie podobnie postępujemy
z plikiem STM32F103_128K_20K_
FLASH.ld zmieniając jego nazwę na
STM32F103_128K_20K_FLASH_DFU.ld
oraz otwieramy go w edytorze tek-
stowym i zmieniamy wpis:
INCLUDE „STM32F103_128K_20K_
DEF.ld”
na właściwy:
INCLUDE „STM32F103_128K_20K_
DEF_DFU.ld”
Teraz pozostaje tylko poinformo-
wać kompilator o zmianie skryptu
linkera. W tym celu w oknie usta-
wień projektu w sekcji LD Linker
w kategorii Scripts zmieniamy opcję
Use default script file na No oraz
w polu Script file wskazujemy plik
STM32F103_128K_20K_FLASH_DFU.
ld ( rys. 5 ).
Poza zmianą skryptu linkera ko-
nieczne jest jeszcze poinformowanie
kontrolera przerwań NVIC o aktual-
nej lokalizacji wektorów przerwań,
która obecnie znajduje się pod
adresem 0x80003800. W tym celu
należy skorzystać z funkcji NVIC_
SetVectorTable :
NVIC_SetVectorTable(NVIC_VectTab_
FLASH, 0x3800);
Funkcja ta musi zostać wy-
wołana z programu głównego
przed uaktywnieniem jakie-
gokolwiek przerwania.
Przykładowy kod progra-
mu, służącego do spraw-
dzenia poprawności wszyst-
kich opisanych uprzednio
czynności przedstawiono
na list. 2 .
Program ten realizuje
bardzo prostą funkcję, mi-
ganie diodą LED podłączo-
ną do wyprowadzenia PC6,
wystarczającą jednak do
sprawdzenia poprawności
przebiegu procesu ładowa-
nia programu.
Rys. 5.
informującego, że instalowane ste-
rowniki nie przeszły testów zgodno-
ści z systemem Windows XP należy
kliknąć przycisk Mimo to kontynuuj .
Sterowniki powinny zostać pomyślnie
zainstalowane.
Po uruchomieniu programu DfuSe
Demonstrator w polu Available DFU
and compatibile HID devices na li-
ście rozwijanej powinna być widocz-
na pozycja STM device in DFU mode
( rys. 4 ). W oknie zostaną wyświetlone
informacje o urządzeniu, takie jak nu-
mery VendorID , ProductID oraz numer
wersji oprogramowania. Numery te
są istotne i zostaną wykorzystane do
przygotowania pliku *.dfu , dlatego na-
leży je zapisać, bądź zapamiętać.
Oprócz tego zostaną wyświetlone
dostępne obszary pamięci do zaprogra-
mowania – w tym przypadku pamięć
wewnętrzna mikrokontrolera ( Internal
Memory ) oraz zewnętrzna pamięć SPI
( SPI Flash: M25P64 ) znajdująca się na
płytce zestawu STM3210B–EVAL.
Przygotowanie pliku DFU
W celu zaprogramowania pamięci
mikrokontrolera z wykorzystaniem me-
chanizmu DFU należy przygotować
plik *.dfu , który oprócz kodu pro-
gramu zawiera dodatkowe informacje,
jak np. numery VID i PID urządzenia
USB, dla którego jest przeznaczony
ładowany program oraz numer wersji
programu. Dzięki temu nie jest moż-
liwe zaprogramowanie mikrokontro-
lera programem przeznaczonym dla
innego urządzenia, bądź też w star-
szej wersji od aktualnie znajdującej
się w urządzeniu.
Do przygotowania pliku *.dfu słu-
ży program DFU File Manager , który
został zainstalowany razem z progra-
mem DfuSe Demonstrator . Po jego
uruchomieniu pojawi się okno służą-
ce do wyboru czynności, jaką chce-
my przeprowadzić na pliku *.dfu
( rys. 6 ). Nas oczywiście interesuje
opcja I want to GENERATE a DFU file
from S19, HEX or BIN files , która
jest domyślnie zaznaczona. Po klik-
nięciu przycisku OK ukaże się okno
służące do wprowadzenia danych
niezbędnych do przygotowania pliku
DFU ( rys. 7 ). Są to numery Vendor
ID, Product ID oraz numer wersji
oprogramowania, ścieżki dostępu do
Przygotowanie pliku z kodem
programu
Program, który będzie wgrywany
poprzez mechanizm DFU musi zostać
dostosowany do tego celu poprzez
Rys. 4.
List. 2.
#include „stm32f10x_lib.h”
GPIO_InitTypeDef GPIO_InitStructure;
int main(void)
{
vu32 i;
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x3800);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOC, &GPIO_InitStructure);
do{
GPIO_SetBits(GPIOC, GPIO_Pin_6);
for(i = 0; i < 0x50000; i++);
GPIO_ResetBits(GPIOC, GPIO_Pin_6);
for(i = 0; i < 0x50000; i++);
}while(1);
return 0;
}
56
Elektronika Praktyczna 6/2008
652390602.002.png 652390602.003.png 652390602.004.png 652390602.005.png
SPRZĘT
Rys. 6.
pomyślnego załadowania pliku
*.dfu na pasku statusu wyświe-
tlony zostanie tekst File correc-
tly loaded . Wyświetlone zostaną
również informacje na temat za-
ładowanego pliku: numery VID,
PID urządzenia dla którego jest
przeznaczony oraz wersji zawar-
tego w nim oprogramowania. Po
kliknięciu przycisku Upgrade do
mikrokontrolera zostanie przesłany kod
programu zawartego w pliku *.dfu . Po
wyzeorwaniu mikrokontrolera przesła-
ny program powinien się uruchomić,
natomiast urządzenie DFU powinno
zniknąć z listy Available DFU and
compatible HID Devices . Aby ponow-
nie wprowadzić mikrokontroler w tryb
DFU należy go wyzerować przy ni-
skim stanie na wyprowadzeniu PA9
(wciśnięty przycisk KEY na płytce
zestawu STM3210B–EVAL).
pliku z kodem itp. Pole Vendor ID
jest domyślnie uzupełnione wartością
0x0483 będącą identyfikatorem firmy
STMicroelectronics. W polu Product
ID należy wpisać wartość odczyta-
ną z okna głównego programu DfuSe
Demonstrator. Z kolei numer wersji
powinien przyjąć wartość następ-
ną w stosunku do numeru aktualnie
znajdującego się oprogramowania.
Rys. 7.
względu na konieczność ręcznego two-
rzenia każdorazowo pliku *.dfu , jed-
nak jest ciekawą alternatywą do kla-
sycznych metod programowania wy-
korzystujących JTAG czy wbudowany
bootloader przez RS-232 pozwala na
zaprogramowanie mikrokontrolera bez
większych nakładów, np. na progra-
mator JTAG pracujący na łączu USB.
Zarówno specyfikacja pliku *.dfu, jak
i źródłowa postać programów opisa-
nych w artykule są dostępne w pod-
katalogu Sources katalogu instalacyj-
nego programu DfuSe Demonstrator,
w związku z czym można się pokusić
o zautomatyzowanie procesu tworzenia
pliku *.dfu z pliku *.hex .
Radosław Kwiecień, EP
radoslaw.kwiecien@ep.com.pl
Programowanie pamięci
Po wygenerowaniu pliku DFU
nie pozostaje już nam nic innego,
jak tylko przesłać go do mikrokon-
trolera w celu zaprogramowania pa-
mięci programu. W tym celu należy
ponownie uruchomić program DfuSe
Demonstrator i w polu Upgrade or Ve-
rify Action kliknąć przycisk Choose
wskazując przygotowany w poprzed-
nim kroku plik *.dfu . W przypadku
Podsumowanie
Wykorzystanie mechanizmu DFU
do programowania pamięci mikrokon-
trolerów STM32 na etapie tworze-
nia programu jest nieco mozolne ze
R
E
K
L
A
M
A
Elektronika Praktyczna 6/2008
57
652390602.006.png 652390602.007.png 652390602.008.png
Zgłoś jeśli naruszono regulamin