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).

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

0 nowych
  #1 02.08.2012 23:26

Jak zamierzasz ją wykorzystać?

revcorey   7 #2 03.08.2012 07:09

Na razie do nauki początkowo tylko programowanie później będę myślał o łączeniu z jakimiś układami elektronicznymi.

Merkury   3 #3 03.08.2012 12:48

Mam tą płytkę. Doszedłem do zabawy akcelerometrem, szybkość migania diod zależy od kąta nachylenia, i na tym się skończyło :). Miałem nadzieje na jakąś wielowątkowość, ale procesor nie wspiera stronicowania. Teraz myślę o Raspberry Pi. Albo najciekawiej było by gdyby jakiś tablet został do takich celów stworzony, i dobrze opisany, można by samemu napisać system.

revcorey   7 #4 03.08.2012 13:09

Ogólnie można próbować na nim np. puścić FreeRtos. Płytka jest tania jakieś 92 zł z wysyłką. Też bym wolał raspberry PI ale to dwa razy drożej ale może jak mi wpadnie parę złotych kiedyś to kupię.

wujcio   6 #5 05.08.2012 22:01

@Merkury
Przejrzyj ten temat http://www.elektroda.pl/rtvforum/topic2127114.html

Miło że ktoś tutaj zajmuję się tematyką systemów wbudowanych. W przyszłości być może także sobie kupię tą płytkę albo poczekam na taką z prockiem z rdzeniem Cortex-M0. Obecnie siedzę na takiej płytce http://www.kamami.pl/index.php?productID=137779 a wspomagam się tym http://www.kamami.pl/index.php?ukey=product&productID=137778 . Programuje w LPCXpresso w asemblerze i udało mi się zrobić samemu podobną płytkę do testów a oto filmik z działania tej płytki z klawiaturą ps/2 http://www.youtube.com/watch?v=TKvsB00OvDY (sorry za jakość ale wtedy lepszego sprzętu nie miałem).

@revcorey
"Też bym wolał raspberry PI ale to dwa razy drożej "
Tylko że raspberry PI ma jeden zasadniczy minus - jak będziesz chciał własne urządzenie zaprojektować to masz lipę bo ten procek nie wiadomo czy jest dostępny od tak do kupienia i to jest BGA i czegoś takiego nie przylutujesz byle czym.

Merkury   3 #6 06.08.2012 14:33

@wujcio
Ja się przymierzałem do routera, bo ich hakowanie jest chyba bardziej popularne niż tabletu, ale tablet ma wyświetlacz. Myślę że w końcu pojawi się jakiś dokładny opis tablet. Ten który podałeś ma predyspozycje do tego i już jest opracowany. Dobrze gdyby zrobiło się popularne jego wykorzystanie, żeby samemu nie walczyć z błędami czy problemami. Ale w sumie na początek :) dokumentacja procesora i wyświetlacza, środowisko i sposób wrzucenia kodu do flasha :) chyba wystarczy. Porozglądam się jeszcze i poszukam wykorzystania tego tabletu.

Autor edytował komentarz.
revcorey   7 #7 06.08.2012 16:45

"Tylko że raspberry PI ma jeden zasadniczy minus - jak będziesz chciał własne urządzenie zaprojektować to masz lipę bo ten procek nie wiadomo czy jest dostępny od tak do kupienia i to jest BGA i czegoś takiego nie przylutujesz byle czym."
Modeli procków ARM jest pełno. Sam STM32 ma chyba ponad 300 modeli, oczywiście nie wszystkie dostępne ale podobne układy da się znaleźć. Co do lutowania. Powiem tak. Jeśli miałbym się zajmować arm przemysłowo(obecnie to moje hobby(zajmuje się plc) ale być może za jakiś czas się zmieni) w każdym razie kupiłbym sobie parę procków ale na makietach i się uczył a projekt w fimir i tam by lutowali.

BTW. Miałem całkiem niedawno w ręce makietę z PowerPc od motoroli dla rynku automotiv. Diabelnie ciekawie płytka skonstruowana. Procek był w slocie do płytki. Czyli wyciąga się procka powerpc i wsadza ARM o takiej samej(podobnej) liczbie wyprowadzeń. Może mi się uda wyrwać tą płytkę kiedyś to wam pokaże.

A już nie długo o procku dsp texasa, wpadł mi na pewien czas w ręce także po testujemy.

Autor edytował komentarz.
Merkury   3 #8 11.08.2012 11:57

A czy już ktoś próbował ujarzmić USB ?

revcorey   7 #9 13.08.2012 07:17

Tam jest niestety tylko USB-OTG(tzn. to już wyprowadzone). Trzeba by to robić przez UART. Ja mam przejściówkę rs232USB dlatego na razie będę leciał RS 232. Ale to później bo teraz zajmuje się TMS320F2812 :)

  #10 16.08.2012 21:19

Witam. Mi się udało ruszyć USB. Generalnie to udało się z 3 przykładów na 2 róźne procesory zlinkować działające demko.
Tryb to Virtual Port COM - dla moich zastosowań idealny, śmiga szybko, nie ma błędów transmisji.
Działa na linux (widzi jako /dev/ttyACM0) i na win 7.
Zainteresowani ?

A i mam wersję na TrueStudio i na CodeSourcey

Merkury   3 #11 21.08.2012 21:42

A jak dokładnie to działa, czy jest to jakiś tryb pracy tego modułu USB ? Czy może trzeba samemu to oprogramować ?

revcorey   7 #12 22.08.2012 17:11

http://en.wikipedia.org/wiki/USB_On-The-Go
to jest takie coś co umożliwia szybkie podłączenie takich rzeczy jak myszka czy pamięć masowa. Generalnie chce to w tms32f2812 wykorzystać jako pamięc masową ponieważ potrzebuję wyczytać=>przetworzyć=>zapisać ogromną ilość próbek do układu, chciałem początkowo użyć rs232 ale spróbuję może tego.

@Michalek1 (niezalogowany)
załóż profil na dp i napisz bloga :)

Autor edytował komentarz.
  #13 23.01.2013 03:29

@Michalek1

Pewnie, ze zainteresowani! Czekamy az sie podzielisz : )

  #14 11.02.2013 11:27

jeśli chodzi o wielowątkowość to można ja uzyskać np w Crossworks-ie z użyciem biblioteki ctl_api.h
działa bo sprawdzałem - oczywiście zrobione jest to wszystko na 10ms timerze ale dla akcelerometru bądź innych wolno-zmiennych sygnałów to w zupełności wystarczy...

  #15 28.03.2014 04:59

Nie no STM32f4 to mały procek do automatyki a nie do stawiania na nim systemów wielozadaniowych ze stronicowaniem pamięci. :P
Ten procek ma peryferia timery przetworniki analogowo cyfrowe, cyfrowo analogowe, PWM do aplikacji motror control itp. Androida do tego się nie wgra bo to nie ta liga :P STM32 to raczej w zastępstwie AVR a nie domowego PC :P Oczywiście da się na tym postawić jakiś mini system operacyjny ale bez przesady :P Konsoli do gier na tym się nie zrobi:P

revcorey   7 #16 28.03.2014 20:52

Jasne że nadał by się do autmatyki. Ja sterowałem procesem sterownikiem PLC co miał penitum 2 266 mhz. A są małe strowniczki PLC jakiś dziwnych firm nawet oparte o 8051! Z resztą np. taka oczyszczalnia ścieków to nic innego jak załącz/wyłącz pompy z prostymi pomiarami i warunkami.