Alternatywna metoda programowania pamięci Flash mikrokontrolerów STM32(1).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
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
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
Plik z chomika:
kaczor1000
Inne pliki z tego folderu:
Peczarski M. - Mikrokontrolery STM 32 w sieci Ethernet w przykładach.pdf
(12152 KB)
The Insaider's Guide To The STM32.pdf
(6627 KB)
STM32Butterfly.pdf
(2632 KB)
Reference manual.pdf
(8589 KB)
Alternatywna metoda programowania pamięci Flash mikrokontrolerów STM32(1).pdf
(2108 KB)
Inne foldery tego chomika:
8051
Arduino
Bascom
CNC
DipTrace
Zgłoś jeśli
naruszono regulamin