STM32 Migracja do Standard Peripheral Library wer 3 1 0


KURS
STM32
Migracja do Standard
Peripheral Library wer. 3.1.0
We wcześniejszych numerach EP wielokrotnie przedstawiane były szej części artykułu. Poniżej przedstawione
informacje mogą być przydatne podczas mi-
aplikacje pisane dla mikrokontrolerów STM32 z wykorzystaniem
gracji do nowej wersji biblioteki.
biblioteki API dostarczanej przez ST Microelectronics. Jednak w myśl
Biblioteka FWLib jest podzielona na
słów: kto nie idzie naprzód, ten się cofa  firma ST przygotowała
wiele plików, każdy jest odpowiedzialny
nową wersję biblioteki. W artykule przedstawiono skrótowo
na obsługę jakiegoś elementu systemu mi-
informacje dotyczące zarówno starszej wersji biblioteki (V2.0.3), oraz
kroprocesorowego (układu peryferyjnego).
 szczegółowej  nowej wersji 3.1.0. Omówiono ponadto sposób
Na przykład plik stm32f10x_usart.c zawiera
migracji projektu ze starej wersji biblioteki do nowej. wszystkie niezbędne funkcje do skonfigu-
rowania portu USART oraz do nawiÄ…zania
Operowanie bezpośrednio na rejestrach dobrej znajomości architektury mikrokon- komunikacji. Plików bibliotecznych nie
jakiekolwiek 32 bitowego procesora lub mi- trolera. Firma ST Microelectronics zauwa- edytujemy, jedynie w nagłówkowym pliku
krokontrolera nie należy do zadań łatwych. żyła ten problem i udostępnia kompletne stm32f10x_conf.h, używając komentarzy
Mimo, iż samo napisanie (nawet stosunko- biblioteki API, które pozwalają na pełną można włączać lub wyłączać obsługę po-
wo zaawansowanych) aplikacji przy użyciu kontrolę nad mikrokontrolerami STM32. szczególnych urządzeń. Ważnym elemen-
nazw rejestrów jest możliwe, to wprowa- W pewnych przypadkach może oczywiście tem biblioteki FWLib jest plik stm32f10x_
dzanie zmian do istniejącego kodu po upły- zajść potrzeba bezpośredniego odwołania it.c, w którym umieszczane są wszystkie
wie na przykład kilku miesięcy, dodatkowo się do rejestru, we wszystkich pozostałych funkcje obsługi przerwań.
przez osobę, która nie jest autorem progra- funkcje API znacznie skracają czas potrzeb-
mu, jest w zasadzie niemożliwe do wyko- ny na napisanie i uruchomienie aplikacji. CMSIS
nania w sensownym czasie. Z powyższych Biblioteka STM32F10x Standard Periphe-
względów, jeśli to możliwe, czyli np. czas STM32F10x firmware library rals Library V3.1.0 wykorzystuje standard
wykonania kodu nie jest krytyczny, pro- V2.0.3 CMSIS, a więc warto się nieco z nim zapo-
gramiści wykorzystują funkcje o mniej, lub Biblioteka firmy STMicroelectronics dla znać. Standard CMSIS (Cortex Microcontrol-
bardziej kojarzących się nazwach, do opera- mikrokontrolerów STM32 w wersji V2.0.3 ler Software Interface Standard) jest to uni-
cji często na zespołach wielu rejestrów. (FWLib) została zastąpiona przez nowszą wersalny interfejs programowy, stworzony
Jeżeli mamy do czynienia z bardzo wersję i nie jest już dalej rozwijana. Mimo to, przez firmę ARM, który umożliwia komuni-
skomplikowanym projektem, wykorzystu- nadal można ze strony producenta pobrać tę kację z peryferiami i rdzeniem Cortex za po-
jącym wiele peryferiów mikrokontrolera, wersję biblioteki, jednak tworząc nowy pro- mocą ustandaryzowanych funkcji i definicji.
to napisanie stosownych funkcji jest praco- jekt należy już raczej skorzystać z nowszej CMSIS dostarcza mechanizmów do obsługi
i czasochłonne, ponadto wymaga bardzo wersji 3.1.0, która została omówiona w dal- układów peryferyjnych, systemów opera-
cyjnych czasu rzeczywistego oraz aplikacji
wykorzystujÄ…cych interfejsy komunikacyjne:
Ethernet, UART oraz SPI.
StrukturÄ™ interfejsu CMSIS i jego miejsce
w aplikacji przedstawiono na rys. 1. CMSIS
ma docelowo obejmować cała rodzinę rdze-
ni z grupy Cortex-M, natomiast na chwilÄ™
obecnÄ… jest dostosowany do rdzeni Cortex
-M0, oraz Cortex-M3. Ustandaryzowane in-
terfejsu dostępu do układów peryferyjnych
oraz samego rdzenia ma na celu ułatwienie
przenoszenia aplikacji pomiędzy mikrokon-
trolerami różnych producentów, jak również
uproszczenie procesu tworzenia aplikacji.
Standard CMSIS został podzielony na
dwie podstawowe warstwy: Core Peripheral
Access Layer oraz Middleware Access Layer.
Pierwsza warstwa zawiera definicje nazw
oraz umożliwia dostęp do rejestrów rdzenia
oraz urządzeń peryferyjnych, natomiast dru-
ga udostępnia mechanizmy do współpracy
Rys. 1. Budowa interfejsu CMSIS i jego miejsce w aplikacji z interfejsami komunikacyjnymi.
100 ELEKTRONIKA PRAKTYCZNA 10/2009
Migracja do Standard Peripheral Library
zbudowanego w oparciu o szablon projektu dla
Å›rodowiska µVision przedstawiono na rys. 2.
Jeśli szablon projektu zostanie skopiowa-
ny do innego katalogu, to należy poinformo-
wać kompilator, gdzie ma szukać stosownych
plików oraz należy dodać wykorzystywane
zródła do projektu. Dokonujemy tego (w śro-
dowisku µVision) poprzez prawe klikniÄ™cie
na nazwie projektu i wybór z menu kontek-
stowego opcji  Manage Components  patrz
rys. 2. Następnie odszukujemy na dysku wła-
ściwe pliki i je dodajemy.
Rys. 2. Struktura plików środowiska Jak wyżej wspomniano, aby projekt
µVision dla projektu wykorzystujÄ…cego poprawnie siÄ™ kompilowaÅ‚, należy zaktu-
przetwornik A/C alizować miejsca (ścieżeki), gdzie kompi-
lator będzie szukał plików nagłówkowych
Dodatkowo, wymienione wyżej warstwy *.h. W tym celu wybieramy menu  Project/
zostały rozszerzone przez producentów mi- Options for Target&  , po czym otworzy się
krokontrolerów, którzy współpracowali przy okno, w którym na zakładce  C/C++ edy-
tworzeniu CMSIS, o dwie  warstwy : Device tujemy ścieżkę poszukiwania plików na-
Peripheral Access Layer oraz Access Func- główkowych. W ten sposób przygotowany
tions for Peripherals. projekt, jeśli kod aplikacji jest pozbawiony
błędów, powinien się bez błędów zbudować
STM32F10x standard peripheral i załadować do pamięci mikrokontrolera.
library V3.1.0 Szybkie rozpoczęcie pracy z mikrokon-
Biblioteka STM32F10x Standard Periph- trolerami STM32 znacznie ułatwiają dołączo-
erals Library v3.1.0. (StdPeriph_Lib) została ne do biblioteki StdPeriph_Lib przykładowe
napisana zgodnie z formatem Doxygen, co aplikacje, które pozwalają w krótkim czasie Rys. 4. Struktura modułu STM32F10x_
znacznie upraszcza proces tworzenia doku- zapoznać się z możliwościami tych układów. StdPeriph_Driver
mentacji oraz jej używanie. Cala dokumenta-
cja omawianej biblioteki została umieszczo- Struktura biblioteki StdPeriph_ trzy  dla trzech najpopularniejszych kompi-
na w pliku pomocy, a nie, jak było to dotych- Lib latorów: Keil, IAR oraz GCC.
czas praktykowane przez STMicroelectro- Pliki w bibliotece API zostały podzie- Plik system_stm32f10x.c zawiera defini-
nics, w pliku pdf. Nowy sposób dostarczania lone na dwa bloki (moduły). Są to katalogi cje i funkcje, które mogą być wykorzystane
dokumentacji ułatwił przeglądanie jej zawar- STM32F10x_StdPeriph_Driver oraz CMSIS. do konfiguracji sygnału zegarowego mikro-
tości, oraz wyszukiwanie informacji. Drzewo plików i katalogów modułu CMSIS kontrolera. Korzystając z funkcji zawartych
Wraz z archiwum biblioteki StdPeriph_Lib biblioteki Standard Peripherals Library po- w pliku należy w pierwszej kolejności wy-
otrzymujemy szablony projektów do trzech kazano na rys. 3, natomiast drzewo modułu brać, używając komentarzy, z jaką częstotli-
najpopularniejszych kompilatorów (środo- STM32F10x_StdPeriph_Driver na rys. 4. wością MCU ma pracować. Fragment, który
wisk), a są to: IAR, Keil oraz darmowy kompi- Dla każdej z rodzin mikrokontrolerów należy w tym celu edytować został przed-
lator GCC. Programista jest zatem zwolniony STM32 zostały przygotowane oddzielne pli- stawiony na list. 1. W kodzie aplikacji wy-
z obowiązku samodzielnego tworzenia projek- ki startowe. W tab. 1 przedstawiono, który starczy teraz wywołać funkcję SystemInit(),
tu od podstaw. Struktura plików projektu, dla plik startowy należy wykorzystać z jaką ro- a jej wykonanie spowoduje skonfigurowanie
przykładu wykorzystującego przetwornik A/C, dziną STM32. Takich zestawów plików star- wszystkich sygnałów zegarowych (zegar sys-
towych otrzymujemy wraz z bibliotekÄ… API temowy, HCLK, PCLK2, PCLK1).
Do modułu STM32F10x_StdPeriph_Dri-
ver należą pliki, które, wzorem starszej wer-
List. 1. Fragment pliku system_
stm32f10x.c  definicje częstotliwości sji biblioteki V2.0.3, zgodnie ze swoją nazwą
zegara systemowego, wykorzystywane
zawierajÄ… funkcje API zwiÄ…zane z poszcze-
przez funkcjÄ™ SystemInit()
gólnymi urządzeniami peryferyjnymi  patrz
/* #define SYSCLK_FREQ_HSE HSE_
Value */
rys. 4. Tych plików bibliotecznych nie nale-
/* #define SYSCLK_FREQ_24MHz
ży edytować.
24000000 */
/* #define SYSCLK_FREQ_36MHz
Do każdego projektu są dołączone jesz-
36000000 */
/* #define SYSCLK_FREQ_48MHz cze dwa istotne pliki: stm32f10x_conf.h oraz
48000000 */
stm32f10x_it.c. W pierwszym pliku nagłów-
/* #define SYSCLK_FREQ_56MHz
56000000 */
kowym za pomocą komentarzy włączamy
#define SYSCLK_FREQ_72MHz 72000000
lub wyłączamy dołączanie do projektu pli-
ków nagłówkowych z modułu STM32F10x_
Tab. 1. Pliki startowe dla poszczegól-
StdPeriph_Driver  patrz list. 2.
nych rodzin mikrokontrolerów STM32
Z punktu widzenia programisty jednym
Plik Rodzina STM32
z najważniejszych plików jest stm32f10x_
startup_stm32f10x_cl.s Connectivity line
it.c, w którym umieszcza się wszystkie funk-
startup_stm32f10x_hd.s High Density
cje obsługi przerwań. Jego nieco zedytowa-
startup_stm32f10x_ld.s Low Density
ny fragment wraz z pustymi funkcjami jest
startup_stm32f10x_md.s Medium Density
Rys. 3. Struktura modułu CMSIS przestawiony na list. 3. Jak widać, jest to
ELEKTRONIKA PRAKTYCZNA 10/2009 101
KURS
określonego zdarzenia. Takie podejście spra-
List. 2. Obszar pliku stm32f10x_conf.h, List. 5. Konfiguracja timera SysTick
w którym za pomocą komentarzy wiło, że projekt jest przejrzysty, a obsługa z wykorzystaniem biblioteki STM32F10x
włącza się lub wyłącza dołączanie firmware library
wszystkich wyjątków znajduje się w jednym
// SysTick bedzie taktowany z f =
plików nagłówkowych
pliku i nie ma potrzeby, jak to zwykle bywa,
// 72MHz/8 = 9MHz
/* #include  stm32f10x_adc.h */
SysTick_CLKSourceConfig(SysTick_
/* #include  stm32f10x_bkp.h */ samodzielnego definiowania funkcji wy-
CLKSource_HCLK_Div8);
/* #include  stm32f10x_can.h */
woływanych w chwili, gdy system wykryje
/* #include  stm32f10x_crc.h */
// Przerwanie ma byc co 1ms, f =
/* #include  stm32f10x_dac.h */
nadejście przerwania. Znacznie upraszcza
// 9MHz czyli liczy od 9000
/* #include  stm32f10x_dbgmcu.h */
SysTick_SetReload(9000);
#include  stm32f10x_dma.h i przyśpiesza to prace nad projektem, jednak
/* #include  stm32f10x_exti.h */
nie należy zapominać, że aby tworzyć dobre
/* #include  stm32f10x_flash.h */
// Odblokowanie przerwania od timera
/* #include  stm32f10x_fsmc.h */
i niezawodne aplikacje to trzeba bardzo do-
// SysTick
#include  stm32f10x_gpio.h
SysTick_ITConfig(ENABLE);
brze rozumieć to, co się robi.
/* #include  stm32f10x_i2c.h */
/* #include  stm32f10x_iwdg.h */
// Wlaczenie timera
/* #include  stm32f10x_pwr.h */
SysTick_CounterCmd(SysTick_Counter_
#include  stm32f10x_rcc.h Migracja ze starszej wersji
Enable);
/* #include  stm32f10x_rtc.h */
biblioteki STM32F10x firmware
/* #include  stm32f10x_sdio.h */
#include  stm32f10x_spi.h
library
/* #include  stm32f10x_tim.h */
Najistotniejsze zmiany w stosunku do
/* #include  stm32f10x_usart.h */ List. 6. Konfiguracja timera SysTick
/* #include  stm32f10x_wwdg.h */
poprzedniej wersji biblioteki API to kompa- z wykorzystaniem biblioteki STM32F10x
/* #include  misc.h */
Standard Peripherals Library
tybilność nowej wersji z omówionym wyżej
// SysTick bedzie taktowany
standardem CMSIS. Z punktu widzenia pro- // z f = 72MHz/8 = 9MHz
List. 3. Fragment pliku stm32f10x_it.c
SysTick_CLKSourceConfig(SysTick_
gramisty, który wcześniej pracował z biblio-
void UsageFault_Handler(void)
CLKSource_HCLK_Div8);
{
teką STM32F10x firmware library ważne jest,
while (1)
// Przerwanie ma byc co 1ms,f =
{} że nowa wersja (z perspektywy wykorzysta-
// 9MHz / 1000, czyli liczy od 9000
}
if (SysTick_Config(SysTick_Frequency
nia funkcji API) w sumie nie wiele różni się
/ 1000))
void SVC_Handler(void)
od swojej poprzedniczki. {
{
// W razie bledu petla
Biblioteka STM32F10x Standard Periphe-
}
// nieskonczona
while (1);
rals Library została tak napisana, aby uaktu-
void DebugMon_Handler(void)
}
{
alnienie projektów wykorzystujących starszą
}
wersjÄ™ biblioteki (STM32F10x firmware library)
void PendSV_Handler(void)
nie nastręczało problemów. Ze strony interne- przeorganizowanie struktury plików biblio-
{
} towej firmy STMicroelectronics można pobrać teki.
archiwum o nazwie an2953 zawierające apli- Przykładowy fragment kodu, napisa-
void SysTick_Handler(void)
{
kację MigrationScript, która po uruchomieniu ny z wykorzystaniem starszej biblioteki
}
automatycznie zmienia kod w plikach tak, STM32F10x firmware library przedstawiono
aby był możliwie jak najbardziej kompatybil- na list. 5, natomiast dla kontrastu na list. 6
zestaw pustych funkcji, które jeżeli wystąpi ny z nową biblioteką. Niestety te fragmenty przedstawiono program napisany przy uży-
odpowiednie przerwanie, są wywoływane. kodu, które wykorzystują funkcje całkowicie ciu nowej biblioteki Standard Peripherals
W stosunku do wersji tego pliku dostarczanej zmienione, lub usunięte w nowej bibliote- Library. Zadanie obydwu programów jest
przez firmę STMicroelectronics zostały usu- ce STM32F10x Standard Peripherals Library identyczne i polega na skonfigurowaniu do
nięte komentarze, które jak pokazała prakty- należy edytować ręcznie. Dotyczy to przede pracy systemowy timer SysTick.
ka okazały się w tym miejscu zbędne. Nazwa wszystkim systemowego timera SysTick.
funkcji obsługi danego przerwania jest już Zmiany, jakie zostaną wprowadzone do Konfiguracja urządzeń
sama w sobie dość wymowna. W efekcie kodu plików za pomocą aplikacji Migration- peryferyjnych
uzyskano bardziej zwięzły kod, nie tracąc Script, są opisane w pliku config.ini, a jego Dla każdego urządzenia, czy jest to
tym samym na jego czytelności. fragment został przedstawiony na list. 4. GPIO, kontroler przerwań, czy jakikolwiek
Zadaniem dewelopera jest umieszczenie Z perspektywy programisty wykorzystu- inny element systemu, są stworzone odrębne
w odpowiedniej funkcji obsługi przerwania jącego funkcje API, najistotniejszymi zmia- typy danych. W przypadku portów wejścia/
kodu, jaki ma się wykonać po wystąpieniu nami są: wyjścia nazywają się one: GPIO_TypeDef,
 inne definicje typów zmiennych, np. typ oraz wykorzystywany do inicjalizacji typ
u32 w nowej bibliotece jest reprezento- GPIO_InitTypeDef. Dla programisty najwięk-
List. 4. Fragment pliku config.
wany przez uint32_t, sze znaczenie ma typ inicjujący, ponieważ to
ini, który opisuje zmiany, jakie
zostaną wprowadzone do kodu po  nowe nazwy funkcji obsługi przerwań właśnie zmienną tego typu jawnie tworzymy
uruchomieniu aplikacji MigrationScript
systemowych, np. NMIException() zosta- w pisanym kodzie.
u32<;,;>uint32_t
ła zmieniona na NMI_Handler(), Typ GPIO_TypeDef zapewnia dostęp do
u16<;,;>uint16_t
u8<;,;>uint8_t
 funkcje i makra asemblerowe związane poszczególnych rejestrów mikrokontrolera
uc32<;,;>const uint32_t
uc16<;,;>const uint16_t z obsługą rdzenia, kontrolera przerwań i jest wykorzystywany przede wszystkim
uc8<;,;>const uint8_t
NVIC i timera SysTick zostały zmienio-
volatile const<;,;>__I
volatile<;,;>__IO
ne i zamieszczone w pliku misc.c, core_ List. 7. Wykorzystanie API  konfiguracja
NMIException<;,;>NMI_Handler
portu GPIOB
HardFaultException<;,;>HardFault_ cm3.c oraz core_cm3.h.
// Wyprowadzenia PB8, PB9 jako
Handler
Ponadto zmienione zostały nazwy // wyjscia push - pull
MemManageException<;,;>MemManage_
GPIO_InitStructure.GPIO_Pin = GPIO_
Handler
związane z przerwaniami i tak na przykład
Pin_8 | GPIO_Pin_9;
BusFaultException<;,;>BusFault_
GPIO_InitStructure.GPIO_Mode = GPIO_
przerwanie EXTI0 nazywa siÄ™ EXTI0_IRQn,
Handler
Mode_Out_PP;
UsageFaultException<;,;>UsageFault_
w miejsce EXTI0_IRQChannel. Aktualizacji
GPIO_InitStructure.GPIO_Speed =
Handler
GPIO_Speed_50MHz;
SVCHandler<;,;>SVC_Handler wymagają również pliki związane bezpo-
DebugMonitor<;,;>DebugMon_Handler
średnio z wykorzystywanym środowiskiem GPIO_Init(GPIOB, &GPIO_
PendSVC<;,;>PendSV_Handler
InitStructure);
programistycznym, ustawienia projektu oraz
102 ELEKTRONIKA PRAKTYCZNA 10/2009
Migracja do Standard Peripheral Library
przez funkcje API, natomiast zmienna typu W przedstawianej sytuacji w naszym Podsumowanie
GPIO_InitTypeDef musi istnieć w każdej apli- kręgu zainteresowań leżą trzy pola struktury Wykorzystywanie gotowych bibliotek
kacji wykorzystującej porty wejścia/wyjścia, GPIO_InitStructure. W pierwszej kolejności jest bardzo przyjemne, ale nie zwalnia to
ponieważ jest wykorzystywana do inicjalizo- ustalamy, które z pinów będą konfigurowa- programisty z obowiązku rozumienia, co
wania i konfigurowania portów. Na list. 7 jest ne, następnie wybieramy żądany tryb pracy właściwie (i w jaki sposób) poszczególne
przedstawiony kluczowy fragment kodu od-  w tym przypadku będzie to wyjście typu funkcje robią. Jest to bardzo ważne i zawsze
powiedzialny za konfigurację portu GPIOB. push-pull. Następnie ustalamy maksymalna należy o tym pamiętać. Z tego powodu, je-
Utworzona na początku zmienna GPIO_ prędkość, z jaką będą mogły pracować piny. śli konstruktor chce w pełni panować nad
InitStructure jest, strukturą. Inicjowanie pi- Tak przygotowaną zmienną należy przeka- wszystkimi elementami systemu, to i tak
nów, lub w szczególnym przypadku całego zać przez podanie jej adresu w argumencie musi dokładnie zapoznać się z dokumen-
portu odbywa się w ten sposób, że wypełnia do funkcji inicjującej GPIO_Init(). Drugim ar- tacją techniczną mikrokontrolera, a tym sa-
się poszczególne pola struktury, a następ- gumentem, jaki należy funkcji przekazać jest mym poznać jego architekturę.
nie przekazuje się adres tak przygotowanej nazwa portu, do jakiego mają być zastosowa- Krzysztof Paprocki
zmiennej do funkcji inicjujÄ…cej. ne wybrane ustawienia. paprocki.krzysztof@gmail.com
R E K L A M A
MIERNIKI SZKOLNE
MIERNIKI SZKOLNE
ACA-1
AMPEROMIERZ ANALOGOWY AC
cena: 33,80 zł
zakresy pomiarowe: 0...500 mAAC, 0...1 AAC, 0...5 AAC
ACV-1
WOLTOMIERZ ANALOGOWY AC
cena: 26,70 zł
zakresy pomiarowe: 0...15 VAC, 0...150 VAC
DCG-1
GALWANOMETR ANALOGOWY DC
cena: 26,70 zł
zakresy pomiarowe:  35 mA...0...+35 mADC
DCV-1
WOLTOMIERZ ANALOGOWY DC
cena: 26,70 zł
zakresy pomiarowe: 0...3 VDC, 0...30 VDC, 0...300 VDC
DCV-2
WOLTOMIERZ ANALOGOWY DC
cena: 26,70 zł
zakresy pomiarowe: 0...300 mVDC, 0...3 VDC, 0...30 VDC
DCA-1
AMPEROMIERZ ANALOGOWY DC
cena: 26,70 zł
zakresy pomiarowe: 0...50 mADC, 0...500 mADC, 0...5 ADC
www.sklep.avt.pl " tel 022 257 84 50
ELEKTRONIKA PRAKTYCZNA 10/2009 103


Wyszukiwarka