Dla produkowanych przez siebie mikrokontrolerów rodziny STM32 firma STMicroelectronics dostarcza programator/debugger ST-Link [1] oraz obsługujący go program narzędziowy o nazwie ST-Link Utility [2]. Podstawowym przeznaczeniem tego programu jest programowanie z poziomu komputera PC wewnętrznej pamięci Flash mikrokontrolerów STM32 oraz ustawianie ich bitów konfiguracyjnych zgrupowanych w tzw. Option Bytes. Na tym jednak nie kończą się możliwości programu ST-Link Utility, ponieważ ma on dodatkową, bardzo przydatną w praktyce konstruktora funkcję, którą jest możliwość zapisu i odczytu w systemie zewnętrznych pamięci dołączonych do mikrokontrolera STM32. Funkcja ta kryje się w menu programu pod nazwą External Loader.
Obsługa zewnętrznej pamięci jest realizowana przez program ST-Link Utility w niezwykle interesujący sposób. Otóż program ten ładuje do pamięci SRAM mikrokontrolera kod maszynowy funkcji realizującej zadaną operację, np. odczytu danych z zewnętrznej pamięci. Następnie kod ten jest wykonywany przez mikrokontroler, a uzyskane w trakcie tego procesu dane są pobierane z mikrokontrolera przez program ST-Link Utility i prezentowane użytkownikowi na ekranie komputera PC. Mechanizm ten jest na tyle uniwersalny, że może być użyty nie tylko do odczytu i zapisu pamięci, lecz także do obsługi innych dołączonych do mikrokontrolera układów, do których dostęp odbywa się przez zapis i odczyt rejestrów, czyli np. do zegara RTC. Jak nietrudno się domyślić, ładowany do pamięci SRAM mikrokontrolera kod, nazywany dalej sterownikiem pamięci zewnętrznej, jest w zasadzie specjalizowanym programem dla mikrokontrolera STM32, zależnym od typu mikrokontrolera, rodzaju i typu zewnętrznej pamięci oraz sposobu jej podłączenia do mikrokontrolera. W folderze ExternalLoader programu ST-Link Utility znajduje się kod sterowników realizujących obsługę pamięci zewnętrznych w produkowanych przez firmę STMicroelectronics zestawach rozwojowych mikrokontrolerów STM32. W przypadku, gdy konstruowany układ wykorzystuje moduł pamięci, który nie był stosowany w jednym z zestawów rozwojowych STM32, lub też pamięć ta jest inaczej podłączona niż w zestawie ewaluacyjnym, sterownik obsługi tej pamięci dla programu ST-Link Utility musi zostać napisany przez użytkownika. Zagadnienie tworzenia sterowników jest omówione w rozdziale 3.9 instrukcji obsługi programu ST-Link Utility. Niestety, opis ten jest dość skromny i ogranicza się zaledwie do kilkunastu zdań. Z tego też względu podjęto próbę zaprezentowania na przykładowym układzie z mikrokontrolerem STM32, jak wygląda pisanie takiego sterownika.
Układ demonstracyjny
Schemat ideowy układu, dla którego zostanie przedstawiony proces tworzenia sterownika obsługi pamięci zewnętrznych dla programu ST-Link Utility, prezentuje rysunek 1. Układ ten składa się z modułu STM32F0DISCOVERY [3], do którego dołączono pamięć EEPROM typu X24C08 oraz zegar RTC typu PCF8583. Moduł STM32F0DISCOVERY jest tanim zestawem ewaluacyjnym dla mikrokontrolera STM32F051, wielokrotnie już opisywanym na łamach „Elektroniki Praktycznej”. Warto przypomnieć, że moduł ten jest wyposażony w mikrokontroler typu STM32F051R8T6 z rdzeniem Cortex-M0, mający 64 kB wewnętrznej pamięci Flash i 8 kB wewnętrznej pamięci SRAM. W module DISCOVERY znajduje się także wbudowany układ programatora/debuggera ST-Link V2. Układ X24C08 [4] jest z kolei pamięcią EEPROM o pojemności 8 kbit i organizacji 1024×8 bit, wyposażoną w interfejs i2c. Układ PCF8583 [5] jest natomiast kombinacją zegara RTC i pamięci SRAM, zorganizowanych jako pamięć o pojemności 256 B. Pierwsze 16 komórek tej pamięci to rejestry zegara RTC, podczas gdy kolejne 240 B to komórki pamięci SRAM. Podobnie jak pamięć EEPROM, układ PCF8583 jest wyposażony w interfejs i2c. W prezentowanym przykładzie oba układy są doł?czone do?wsp?lnej magistrali ączone do wspólnej magistrali i2c, obsługiwanej przez sprzętowy układ interfejsu I2C2 mikrokontrolera STM32F051 w module DISCOVERY. Linie SCL i SDA tego interfejsu są wyprowadzone odpowiednio na porty PF6 i PF7 mikrokontrolera i dostępne na wyprowadzeniach 19 i 18 złącza P2 modułu DISCOVERY. Pamięć EEPROM jest skonfigurowana do pracy na magistrali i2c pod adresem bazowym 0xA8, natomiast układ PCF8583 pracuje pod adresem bazowym 0xA0.
Kod sterownika pamięci zewnętrznych
Ponieważ w układzie demonstracyjnym znajdują się dwa różne typy pamięci zewnętrznych, do ich obsługi przez program ST-Link Utility konieczne jest napisanie dwóch oddzielnych sterowników. Na szczęście algorytmy odczytu i zapisu danych z/do pamięci X24C08 oraz zegara PCF8583 są na tyle zbliżone, że możliwe jest wygenerowanie kodu maszynowego sterownika dla każdego z powyższych układów na podstawie tego samego kodu źródłowego, w którym bezpośrednio przed kompilacją modyfikowane są jedynie parametry konfiguracyjne układu pamięci, takie jak wielkość pamięci, jej adres bazowy, itp.
Pierwszym krokiem w pisaniu sterownika zewnętrznej pamięci jest stworzenie w używanym środowisku programistycznym IDE pustego projektu dla mikrokontrolera STM32F051. Projekt ten powinien być linkowany do pamięci SRAM, poczynając od adresu 0x20000004. W przeciwieństwie do typowych programów pisanych dla mikrokontrolerów w języku C, wykonany projekt nie wymaga dołączania plików z kodem startowym. Przy tworzeniu pustego projektu sterownika najprościej wzorować się na jednym z przykładowych projektów sterowników pamięci zewnętrznych SRAM i Flash, które są dostarczane razem z programem ST-Link Utility i znajdują się w folderze ExternalLoader. Projekty te są przystosowane do kompilatorów dostępnych w kilku popularnych środowiskach IDE, więc nie powinno być problemów z importem przykładowego projektu do używanego środowiska programistycznego. Dołączony do artykułu kod sterowników pamięci X24C08 i zegara PCF8583 był kompilowany przy użyciu pakietu GCC. Strukturę tego projektu przedstawia rysunek 3. Foldery Inc i Src zawierają odpowiednio pliki nagłówkowe i kod źródłowy uniwersalnego sterownika układów X24C08 i PCF8583. W folderze Libraries znajdują się z kolei pliki bibliotek CMSIS dla rdzeni Cortex-M oraz dla mikrokontrolerów rodziny STM32F0xx. W folderach _obj i _bin jest umieszczany kod wynikowy.
Dysponując funkcjami inicjalizacji układu peryferyjnego I2Cx mikrokontrolera oraz zapisu i odczytu danych do/z układów dołączonych do magistrali i2c, można przystąpić do pisania właściwego kodu sterownika pamięci zewnętrznych dla programu ST-Link Utility. Sterownik ten składa się z trzech plików: pliku nagłówkowego Dev_Inf.h oraz dwóch plików z kodem sterownika: Dev_inf.c i Loader_Src.c.
Plik nagłówkowy Dev_Inf.h jest umieszczony w folderze Inc prezentowanego projektu i zawiera definicje możliwych rodzajów pamięci oraz definicje struktur opisujących cechy pamięci, którą obsługuje sterownik. Zawartość pliku nagłówkowego przedstawia listing 1. Jak widać, autorzy programu ST-Link Utility przewidzieli możliwość obsługi 10 różnych rodzajów pamięci zewnętrznych. Rodzaj zadeklarowanej pamięci ma jednak znaczenie przede wszystkim informacyjne i tylko w niewielkim stopniu wpływa na algorytm obsługi pamięci przez program ST-Link Utility. Główna różnica polega na kasowaniu, bądź też nie, pamięci zewnętrznej przed zapisem nowych danych. W przypadku pisania sterownika dla układu, którego nie ma na liście, wystarczy wybranie z tej listy rodzaju pamięci jak najbardziej zbliżonej sposobem działania.
Plik Dev_Inf.c jest umieszczony w folderze Src prezentowanego projektu i zawiera strukturę StorageInfo z opisem pamięci obsługiwanej przez sterownik. Struktura ta jest linkowana do wydzielonej sekcji programu i informacje w niej zawarte są wykorzystywane przez program ST-Link Utility do wyboru właściwego sterownika oraz algorytmu kasowania i zapisu pamięci zewnętrznej. Struktura StorageInfo obejmuje 7 pól.
Drugie pole DeviceType struktury StorageInfo zawiera definicję rodzaju zewnętrznej pamięci. Jak wspomniano, zadeklarowany rodzaj pamięci determinuje sposób obsługi przez program ST-Link Utility pamięci zewnętrznej przy zapisie danych. W przypadku układu X24C08 pole to przyjmuje wartość I2C_EEPROM z predefiniowanej listy rodzajów pamięci w pliku nagłówkowym Dev_Inf.h. W przypadku zegara RTC typu PCF8583, ponieważ tego rodzaju układu nie ma na wyżej wspominanej liście, polu temu przypisano najbardziej zbliżony rodzaj pamięci z listy, tj. SRAM.
Ostatnie dwa pola struktury StorageInfo zawierają zawartość komórki pamięci po skasowaniu (pole EraseValue) oraz listę sektorów pamięci i ich rozmiarów (pole sectors). Ponieważ w prezentowanym przykładzie są używane układy, które nie wymagają wcześniejszego kasowania przed zapisem nowych danych, pola te nie mają praktycznego znaczenia. Zarówno w przypadku układu X24C08, jak i PCF8583 przyjęto, że rozmiar sektora jest równy pojemności układu. Wartości (0x00000000, 0x00000000) są znacznikami końca listy sektorów. Zawartość wypełnionej struktury StorageInfo dla pamięci 24C08 oraz zegara PCF8583 przedstawiają listing 2 i listing 3.
Prezentowany sterownik może zostać dodatkowo rozbudowany o funkcję Verify(), dzięki czemu możliwa będzie weryfikacja zawartości pamięci podczas procesu zapisu danych. W omawianym przykładzie zrezygnowano jednak z tej możliwości. W takiej sytuacji zawartość pamięci jest weryfikowana dopiero po zakończeniu zapisu, w drodze odczytu zawartości całego układu.
Instalowanie sterownika
O poprawnym zainstalowaniu w programie ST-Link Utility obu sterowników układów dołączonych do magistrali i2c mikrokontrolera świadczy pojawienie się dwóch nowych pozycji w menu External Loader. Oba nowe punkty menu odpowiadają odpowiednio pamięci EEPROM X24C08 i zegarowi RTC PCF8583 i pozwalają na odczyt oraz zapis tych układów danymi zawartymi w pliku (rysunek 5).
W przypadku zapisu pierwszych 16 komórek układu PCF8583 program ST-Link Utility może sygnalizować błąd zapisu danych. Jest to spowodowane tym, że komórki te są w istocie rejestrami zegara RTC i część z nich, gdy zegar jest uruchomiony, ciągle zmienia swą wartość. Tak dzieje się np. z komórkami o adresach od 0x60001001 do 0x60001006, które są odpowiednio licznikami milisekund, sekund, minut, godzin, dni i miesięcy. W takiej sytuacji pomiędzy zapisem danej komórki pamięci przez program ST-Link Utility a jej odczytem w celu weryfikacji poprawności zapisu wartość licznika odpowiadającego milisekundom, sekundom itd. może się zmienić. Stąd sygnalizowany przez program ST-Link Utility błąd zapisu danych. Powyższe zachowanie układu PCF8583 można łatwo zaobserwować w programie ST-Link Utility, dokonując w regularnych odstępach czasu odczytu zawartości zegara RTC. Komórki odpowiadające licznikom czasu będą zmieniały swoją zawartość zgodnie z upływającym czasem. Sygnalizowany problem błędu zapisu danych nie dotyczy oczywiście komórek pamięci o adresach powyżej 0x60001010, ponieważ są to komórki standardowej pamięci SRAM w układzie PCF8583.
Napisanie sterownika pamięci zewnętrznych dla programu ST-Link Utility nie jest skomplikowane i nie wymaga wielkich nakładów czasu i pracy, ponieważ zazwyczaj i tak większość funkcji niskiego poziomu obsługujących pamięć zewnętrzną jest tworzona w ramach projektu konstruowanego urządzenia, więc warto poświęcić kilka dodatkowych chwil i zaimplementować taki sterownik. Może on oddać nieocenione usługi podczas pisania i testowania oprogramowania budowanego układu.
Możliwość odczytu i zapisu w systemie pamięci zewnętrznej dołączonej do mikrokontrolera STM32 rozwiązuje też problem umieszczania w tej pamięci danych startowych, które z takich czy innych powodów nie są przechowywane w wewnętrznej pamięci Flash mikrokontrolera. Mogą to być np. dane identyfikacyjne urządzenia, takie jak jego numer seryjny czy data produkcji, lub też indywidualne parametry kalibracyjne obwodów pomiarowych, ale nie tylko. Program ST-Link Utility może posłużyć np. do umieszczania w pamięci zewnętrznej zestawów czcionek lub grafik wykorzystywanych przez oprogramowanie urządzenia.
Wreszcie program ST-Link Utility może zostać użyty do testowania układu zewnętrznego, w omawianym przykładzie zegara RTC. Możliwość zapisu i odczytu poszczególnych rejestrów układu z poziomu komputera PC w łatwy sposób pozwala na zapoznanie się z funkcjonowaniem danego układu, bez konieczności umieszczania funkcji testowych w programie mikrokontrolera. Jak widać, możliwości stwarzane przez ST-Link Utility są dość szerokie, więc warto wykorzystywać je w pełni.
Aleksander Borysiuk
alex_priv@wp.pl
Bibliografia
− ST-LINK/V2 in-circuit debugger/programmer for STM8 and STM32, User manual UM1075, STMicroelectronics.
− STM32 ST-LINK Utility software description, User manual UM0892, STMicroelectronics.
− STM32F0DISCOVERY Discovery kit for STM32F0 microcontrollers, User manual UM1525, STMicroelectronics.
− 8 kbit serial E2PROM X24C08 1024×8 Bit, Product data sheet, Xicor Inc.
− PCF8583 Clock and calendar with 240×8-bit RAM, Product data sheet, NXP.