Strona używa cookies (ciasteczek). Dowiedz się więcej o celu ich używania i zmianach ustawień. Korzystając ze strony wyrażasz zgodę na używanie cookies, zgodnie z aktualnymi ustawieniami przeglądarki.    X

ARM: STM32F4 Discovery pierwsze wrażenia

Od pewnego czasu można zaobserwować wzmożone zainteresowanie układami ARM. Obecnie wszedłem w posiadanie STM32F4 Discovery. Opartej o rdzeń Cortex-M4F.

O układzie

STM32F4 Discovery to płytka startowa oparta o rdzeń Cortex-M4F. Rdzeń ten należy do rodziny układów wykorzystujących instrukcje Thumb2. Polecenia te umożliwiają pracę na danych 16 i 32-bitowych, ujmując najkrócej tego typu polecenia umożliwiają gęstsze upakowanie poleceń i szybsze działanie niż w przypadku instrukcji ARM7 i ARM9 ale niestety programy napisane przy wykorzystaniu ARM7 i ARM9 wymagają przystosowania do thumb2, dlatego nici z linux(aczkolwiek nie do końca) i windows embedded.
Występująca w nazwie literka F świadczy o obecności jednostki FPU. Jednostka ta przyspiesza operacje na liczbach zmiennoprzecinkowych. Jak bardzo? W przykładzie kodu generującego fraktal uruchomienie jednostki FPU(domyślnie jest ona wyłączona) spowodowało wykonywanie się kodu od 17 do 19 razy szybciej. Niektóre modele tych rdzeni maja jeszcze zintegrowane jednostki wspomagające szyfrowanie.
Sam układ może pracować maksymalnie z częstotliwością 168 Mhz(wykorzystując wewnętrzną pętle PLL).

Płytka to w zasadzie poprowadzone ścieżki z układu do goldpinów aczkolwiek dorzucono bonusy :). Na płytce znajduje się zintegrowany  ST-LINK/V2 pozwalający na programowanie i debugowanie(Interfejs SWD). Ponadto na płytce znajdziemy złącze USB-OTG(niestety nie można tego traktować jako zwykłego portu USB),akcelerometr(można np. zrobić z płytki myszkę),mikrofon oparty o MP45DT02,przetwornik audio CS43L22, 8 diod led(ale tylko 4 można sterować), dwa przyciski(reset i użytkownika).

r   e   k   l   a   m   a

Programowanie

Jeśli idzie o programowanie mamy sporo środowisk do wyboru:
-IAR(w wersji darmowej ograniczenie do 32 Kb kodu wynikowego)
-Keil uvision(w wersji darmowej ograniczenie do 32 Kb kodu wynikowego)
-True Studio(oparte o GCC-ARM ale także z ograniczeniem do 32 Kb)
-Ride(samo IDE, trzeba dociągnąć toolchain ARM)
-GCC-ARM + IDE(np. Eclipse)
Osobiście używam TrueStudio opartego o Eclipse

Niemniej jednak planuję przesiadkę na ide bez ograniczeń jeśli idzie o kod wynikowy. Jeśli idzie o programowanie na linuks(windows też) i wykorzystanie GCC-ARM. W internecie znalazłem parę różnych opisów połączenia GCC-ARM i Eclipse. Największym problemem jest Debugowanie. Aczkolwiek da się uruchomić. Niedługo sprawa debbugowania i konfiguracji zostanie uproszczona dzięki wydaniu OpenOCD 0.6 które będzie obsługiwało ST-Link V2. Może z jakiś czas opiszę cała procedurę.
Przejdźmy do programowania i prostego kodu. Podczas tworzenia nowego projektu można od razu odnaleźć STM32F4 Discovery na liście obsługiwanych płytek co załatwia praktycznie za nas konfigurację całej płytki.

#include "stm32f4xx.h"

#include "stm32f4_discovery.h"

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); //1

    GPIO_InitTypeDef  GPIO_InitStructure;//2

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;

    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOD, &GPIO_InitStructure);

//GPIOD->BSRRL=0xffff;

GPIOD->ODR=0x0000;//3

  while (1)

  {

	for(;i<5000000;i++){

		x++;

		}

	i=0;

	GPIOD->ODR=0xf000;

	for(;i<5000000;i++){

		--x;

		}

	GPIOD->ODR=0x0000;

i=0;

  }

}

1)Musimy odblokować zegar dla portów. Konkretnie dla portu D(GPIOD) ponieważ tam znajdują się 4 ledy(Pin12,13,14,15). Zegar(tzn. porty są wyłączone) jest domyślnie wyłączony aby oszczędzać energię
2)Konfigurację(i nietylko) różnych rejestrów można przeprowadzać na dwa sposoby. Wykorzystując bibliotekę Standard Perhapsial Library lub poprzez bezpośrednie manipulowanie rejestrami. Zaletą SPL jest ukrycie operacji niskopoziomowych i czytelniejszy kod, niestety sposób implementacji samej biblioteki powoduje spory narzut na pamięć i czas wykonywania operacji(do wykonania operacji może być konieczne wykonanie nawet 2-3 razy więcej instrukcji assemblera niż przy bezpośrednich manipulacjach), moim zdaniem jeśli nie mamy dużych wymagań co do wykorzystania pamięci warto używać struktur do inicjalizacji peryferiów,zegarów itp. A pozostałe operacje wykonywać na rejestrach. W tym punkcie korzystamy z SPL. Najpierw musimy utworzyć strukturę w której znajdują się wszelakie potrzebne instrukcje. Następnie odwołując się do odpowiednich pól ustawiamy interesujące nas piny, prędkość ich działania, tryb pracy(wej./wyj.), podciągnięcie do masy/zasilania/brak. Na końcu inicjujemy port.
3)W tym przypadku odnosimy się bezpośrednio do rejestru, rejestr ten pozwala na ustawienie stanu portu(0 lub 1). Konkretnie ustawiamy wszystkie porty na 0. Następnie pętla for służąca jako prymitywne opóźnienie. Później ustawiamy odpowiednie cztery porty czyli wpisujemy szesnastkowo 0xf000.

I gotowe diody mrugają. Ktoś może zapytać, „dobrze a gdzie inicjalizacja zegara?”. Otóż można to robić na dwa sposoby. Ręcznie(wykorzystując struktury lub bezpośrednio rejestry) bądź skorzystać z wygenerowanego pliku z ustawieniami zegarów i szyn(po wybraniu płytki podczas tworzenia projektu takowy plik jest dodawany automatycznie, częstotliwość wtedy to 168 MHz). Tu korzystam właśnie z takiego pliku. Mała uwaga domyślnie(przy każdym uruchomieniu) układ startuje na wewnętrznym zegarze dopiero po uruchomieniu można wykorzystać opcjonalnie zewnętrzny oscylator i wewnętrzną pętle PLL.

Ciekawostka, tak prosty kod przy ustawieniu w opcjach kompilatora braku optymalizacji działa poprawnie, przy ustawieniu -O1 diody mrugają znacznie szybciej, użycie -O2 i -O3 powoduje brak mrugania diod, skorzystanie z opcji optymalizacji wielkości kodu wynikowego -Os powoduje także brak działania ale objętość kodu spada o przeszło 50%. Ogólnie trudno oceniać pracę kompilatora na podstawie tak prymitywnego kodu(prawie pusta pętla for) niemniej warto najpierw napisać program przy braku optymalizacji a potem zmieniać ustawienia.

Nie ma róży bez kolców. A jest nią dokumentacja STM32. Jako osoba przyzwyczajona do dokumentacji Atmela muszę powiedzieć że jestem nieco zawiedziony. Ogólnie dokumentacja jest gorzej napisana niż w przypadku atmela, niektóre informacje ciężko znaleźć lub są według mnie połebkach.

Podsumowanie

W płytce drzemie olbrzymia moc(w stosunku do układów 8/16-bitowych) i potencjał. Chociaż jest to rdzeń z linii układów o niskiej wydajności gdzie najważniejsza jest energooszczędność. Niedługo dalsze wieści z frontu :) 

sprzęt oprogramowanie programowanie

Komentarze