Alternatywna metoda programowania pamięci Flash mikrokontrolerów STM32, Dokumenty(1)
[ Pobierz całość w formacie PDF ]
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
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
(
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
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
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
[ Pobierz całość w formacie PDF ]