STM32MP157A-DK1 pierwsze starcie

Wszystko co dotyczy płytek z rodziny Discovery firmy STM
ODPOWIEDZ
Awatar użytkownika
elvis
Użytkownik
Posty: 16
Rejestracja: 30 lis 2018, 17:50

STM32MP157A-DK1 pierwsze starcie

Post autor: elvis » 05 cze 2019, 17:07

Nowe mikroprocesory STM32MP1 są ostatnio bardzo popularnym produktem, czasem pojawiają się w sprzedaży, ale najczęściej znikają jeszcze szybciej. Przy odrobinie szczęścia można jednak załapać się na takie cudo. Udało mi się jedną upolować więc napiszę kilka słów.
Razem z płytką dostajemy kartę SD z systemem linux i przykładami. Można podłączyć monitor, klawiaturę, myszkę i używać jej jak typowego SBC. To jednak nic nadzwyczajnego - podobnych płytek jest mnóstwo i tutaj ST niczym szczególnie się nie wyróżnia.
Znacznie ciekawsza jest możliwość dobrania się do rdzenia Cortex-M4 i używania płytki jak zwykłego STM32F4xx.
Na początek wypada poznać samą płytkę, w odróżnieniu od chińskich wynalazków tutaj jest znacznie lepiej i o procesorze znajdziemy wszystko co nas interesuje, a nawet więcej:

https://www.st.com/en/microcontrollers- ... mp157.html

Instrukcja do płytki też jest dostępna:

https://www.st.com/en/evaluation-tools/ ... a-dk1.html

Obrazek

Wersja DK1 jest nieco uboższa od DK2, nie ma wyświetlacza, modułu WiFi/BT oraz funkcji kryptograficznych. Jest na niej procesor STM32MP157AAC3, który posiada dwa rdzenie Cortex-A7 oraz jeden Cortex-M4.
Rdzenie Cortex-A7 najlepiej sprawdzają się z pełnym systemem operacyjnym, czyli wspomnianym linuchem, natomiast Cortex-M4 jest jak każdy inny STM32. No może nie do końca - nie posiada pamięci Flash, trzeba więc kod programu załadować do pamięci RAM (a nawet SRAM). Mamy 128 kB na pamięć kodu i kolejne 128 kB na dane. Można dostać się nawet do 512MB DDR, ale domyślnie 2 x 128kB muszą wystarczyć.
W dokumentacji czasem nieśmiało przewija się określenie "Production mode" oraz "Engineering mode". Pierwszy tryb to normalna praca systemu, czyli załadowanie Linux-a, który wczytuje kod dla Cortex-M4. Natomiast Engineering Mode to po prostu zatrzymanie wszystkich rdzeni i oczekiwanie na wgranie kodu przez ST-Linka.
W dokumentacji płytki producent o tym nie wspomina, ale wystarczy przestawić przełączniki BOOT0 na OFF, a BOOT2 na ON i już mamy tryb inżynierski oraz pracę jak ze zwykłym mikrokontrolerem.

Do wygenerowania projekty trzeba niestety używać CubeMX.

Piszę niestety bo nie przepadam za tym narzędziem, ale ST chyba je bardzo lubi.
Podstawowa konfiguracja jest prosta. Wystarczy wybrać źródło zegara, czyli zewnętrzny rezonator 24MHz:

Obrazek

A następnie ustawić taktowanie mikrokontrolera. Maksymalna częstotwliość to 209 MHz, więc całkiem sporo:

Obrazek

Teraz można wygenerować kod projektu. Jak chodzi o środowisko, to akutalnie STM32MP1 jest wspierany tylko przez OpenSTM32, co jest nieco dziwne, ale pewnie później będzie można używać Atollic-a, czy Cube IDE.

Projekt po zaimportowaniu do OpenSTM32 wygląda jak każdy inny na STM32F4 (czyli paskudnie):

Obrazek

Ale poza strasznie brzydki kodem nie ma co narzekać. Wystarczy skompilować projekt i uruchomić. Debugowanie odbywa się zupełnie jak typowych STM32, po prostu dodana została opcja "ST's STM32 MPU Debugging". Skoro linux nie jest używany, w zakładce "Startup" trzeba wybrać "Engineering mode" i można cieszyć się pierwszym programem.

Obrazek

Co ciekawe definiowanie pinów z poziomu CubeMX nie do końca działa. Więc żeby uzyskać miganie diodą pozostaje napisać kawałek własnego kodu:
  1.  
  2.  GPIO_InitTypeDef gpio;
  3.   gpio.Pin = GPIO_PIN_14;
  4.   gpio.Mode = GPIO_MODE_OUTPUT_PP;
  5.   gpio.Pull = GPIO_NOPULL;
  6.   gpio.Speed = GPIO_SPEED_FREQ_LOW;
  7.   gpio.Alternate = 0;
  8.   HAL_GPIO_Init(GPIOA, &gpio);
  9.  
  10.   while (1)
  11.   {
  12.       HAL_GPIO_WritePin(GPIOA, GPIO_PIN_14, GPIO_PIN_SET);
  13.       HAL_Delay(100);
  14.       HAL_GPIO_WritePin(GPIOA, GPIO_PIN_14, GPIO_PIN_RESET);
  15.       HAL_Delay(100);
  16.  
Dioda miga jak należy, biblioteki HAL obsługują też sporo pozostałych modułów, czyli poza GPIO jeszcze DMA, EXTI, HSEM, MDMA, RCC oraz timery. Z poziomu rejestrów można też dobrać się do pozostałych peryferiów.
Mamy więc znany i przez wiele osób lubiany STM32, a jednocześnie możliwość zrobienia pięknego interfejsu przy użyciu linucha - takie dwa w jednym :)

Dodano po 27 minutach 5 sekundach:

Jeszcze mały update. Ze strony https://github.com/STMicroelectronics/STM32CubeMP1 można pobrać pełną wersję biblioteki Cube dla MP1. Dzięki temu uzyskamy dostęp do większości modułów bez konieczności grzebania w rejestrach.

Obrazek

Można używać HAL, a nawet LL jak na zwykłych stm32.

Awatar użytkownika
SunRiver
Administrator
Posty: 686
Rejestracja: 08 paź 2017, 11:27
Lokalizacja: Opole
Kontakt:

Re: STM32MP157A-DK1 pierwsze starcie

Post autor: SunRiver » 05 cze 2019, 18:08

No kawał bardzo fajnego materiału :)
Miło się czyta i kusi do złego ... :P
Bo zasadniczo CubeMx też nie lubię ...
.... z każdym bitem serca ....
💫SunDUINO
💦GitHUB
💦Google Drive
💦Sotton

Awatar użytkownika
elvis
Użytkownik
Posty: 16
Rejestracja: 30 lis 2018, 17:50

Re: STM32MP157A-DK1 pierwsze starcie

Post autor: elvis » 05 cze 2019, 18:17

Ja mam w planach powalczyć z stm32mp1 bez CubeMX, ale tak jest po prostu najłatwiej - projekt zostaje wygenerowany, nie trzeba nic konfigurować, ustawiać. Nawet z OpenSTM32 pewnie można byłoby zrezygnować, bo pod spodem jest zwykły openocd. Tylko znowu, to będzie trochę roboty, a chciałem napisać jak łatwo zacząć. I to faktycznie całkiem fajnie działa.
Jedyny plus CubeMX to wygenerowanie device-tree dla linuksa, uboot-a i optee. Więc można takie pliki po prostu skopiować do yocto i powinno działać w trybie produkcyjnym, czyli bez st-linka.
Przyznam że to mi się najbardziej spodobało, można pisać program jak na stm32, uruchamiać "normalnymi" narzędziami, a na koniec po prostu dodać linucha, na nim zrobić obsługę sieci / wifi, czy piękny interfejs graficzny. Jednocześnie mając całe sterowanie na zwykłym mikrokontrolerze. To sporo łatwiej niż wojować ze sterownikami linucha.

ODPOWIEDZ