Jak i dlaczego czytać arkusze danych, jeśli Twoim hobby są mikrokontrolery

Jak i dlaczego czytać arkusze danych, jeśli Twoim hobby są mikrokontrolery

Mikroelektronika to modne hobby ostatnich lat za sprawą magicznego Arduino. Ale tu jest problem: przy wystarczającym zainteresowaniu można szybko przerosnąć DigitalWrite(), ale co dalej zrobić, nie jest do końca jasne. Twórcy Arduino włożyli wiele wysiłku w obniżenie bariery wejścia do swojego ekosystemu, ale poza nim wciąż znajduje się ciemny las trudnych obwodów, niedostępny dla amatora.

Na przykład arkusze danych. Wygląda na to, że mają wszystko, weź to i korzystaj. Ale ich autorzy wyraźnie nie stawiają sobie za cel popularyzacji mikrokontrolerów; Czasami wydaje sięże celowo nadużywają niezrozumiałych terminów i skrótów przy opisywaniu prostych rzeczy, aby jak najbardziej zmylić niewtajemniczonych. Ale nie wszystko jest takie złe, w razie potrzeby trumna się otwiera.

W tym artykule podzielę się doświadczeniem specjalisty humanistyki komunikującego się z arkuszami danych w celach hobbystycznych. Tekst przeznaczony jest dla amatorów wyrosłych ze spodni Arduino i zakłada pewne zrozumienie zasad działania mikrokontrolerów.

Zacznę od tradycyjnego

Miganie diody LED w Arduino

I od razu kod:

void setup() {
DDRB |= (1<<5);
}

void loop() {
PINB = (1<<5);
for (volatile uint32_t k=0; k<100000; k++);
}

"Co to jest? – zapyta wyrafinowany czytelnik. – Po co zapisujesz coś do rejestru wejściowego PINB? To tylko do czytania!” Naprawdę, Dokumentacja Arduino, podobnie jak większość artykułów edukacyjnych w Internecie, stwierdza, że ​​ten rejestr jest tylko do odczytu. Sam tak myślałem, dopóki nie przeczytałem tego ponownie arkusz danych do Atmega328p, przygotowując ten artykuł. I tam:

Jak i dlaczego czytać arkusze danych, jeśli Twoim hobby są mikrokontrolery

Jest to stosunkowo nowa funkcjonalność, nie było jej na Atmega8, nie wszyscy o niej wiedzą lub nie wspomina się o niej ze względu na wsteczną kompatybilność. Ale jest to całkiem odpowiednie do zademonstrowania poglądu, że warto czytać arkusze danych, aby wykorzystać wszystkie możliwości chipa, w tym te mało znane. I to nie jest jedyny powód.

Po co jeszcze czytać arkusze danych?

Zwykle inżynierowie Arduino, po wystarczającej zabawie z diodami LED i AnalogWrites, zaczynają podłączać do płytki wszelkiego rodzaju moduły i chipy, dla których istnieją już napisane biblioteki. Wcześniej czy później pojawia się biblioteka, która nie działa tak, jak powinna. Potem amator zaczyna dłubać, żeby to naprawić, a potem...

I dzieje się tam coś zupełnie niezrozumiałego, więc trzeba wejść do Google, przeczytać liczne tutoriale, wyciągnąć fragmenty czyjegoś odpowiedniego kodu i wreszcie osiągnąć swój cel. Daje to ogromne poczucie spełnienia, ale w rzeczywistości proces ten przypomina wymyślanie koła na nowo poprzez inżynierię wsteczną motocykla. Co więcej, zrozumienie działania tego roweru nie wzrasta. Wiem, bo sam to robiłem przez dłuższy czas.

Gdybym zamiast tej ekscytującej czynności spędził kilka dni na studiowaniu dokumentacji Atmega328, zaoszczędziłbym ogromną ilość czasu. W końcu jest to dość prosty mikrokontroler.

Dlatego musisz przynajmniej przeczytać arkusze danych, aby wyobrazić sobie, jak ogólnie działa mikrokontroler i co potrafi. I dalej:

  • do sprawdzania i optymalizowania bibliotek innych osób. Często piszą je ci sami amatorzy, którzy na nowo odkrywają koło; lub wręcz przeciwnie, autorzy celowo uczynili je nadmiernie niezawodnymi. Niech będzie trzy razy większy i wolniejszy, ale na pewno zadziała;

  • móc wykorzystać chipy w projekcie, dla którego nikt nie napisał biblioteki;

  • aby ułatwić sobie migrację z jednej linii MK na drugą;

  • aby w końcu zoptymalizować swój stary kod, który nie pasował do Arduino;

  • nauczyć się sterować dowolnym chipem bezpośrednio poprzez jego rejestry, bez zawracania sobie głowy studiowaniem struktury jego bibliotek, jeśli takie istnieją.

Po co pisać bezpośrednio do rejestrów, skoro jest HAL i LL?

Glosariusz
HAL, warstwa wysokiej abstrakcji – biblioteka do sterowania mikrokontrolerem o wysokim poziomie abstrakcji. Jeśli potrzebujesz skorzystać z interfejsu SPI1, po prostu skonfigurujesz i włączysz SPI1, nie zastanawiając się, które rejestry za co odpowiadają.
LL, API niskiego poziomu – biblioteka zawierająca makra lub struktury z adresami rejestrów, umożliwiająca dostęp do nich po nazwie. DDRx, PORTx, PINx w Atmedze to LL.

W komentarzach na Habré regularnie pojawiają się spory na temat „HAL, LL czy rejestry”. Nie żądając dostępu do wiedzy astralnej, po prostu podzielę się moimi amatorskimi doświadczeniami i przemyśleniami.

Mniej więcej zorientowawszy się w Atmedze i po przeczytaniu artykułów o cudowności STM32, kupiłem pół tuzina różnych płytek - Discovery i Blue Pills, a nawet same chipsy do moich domowych produktów. Wszyscy zbierali kurz w pudełku przez dwa lata. Czasami mówiłem sobie: „To wszystko, od tego weekendu opanuję STM”, uruchomiłem CubeMX, wygenerowałem konfigurację dla SPI, spojrzałem na powstałą ścianę tekstu, obficie doprawioną prawami autorskimi STM i zdecydowałem, że to w jakiś sposób zbyt dużo.

Jak i dlaczego czytać arkusze danych, jeśli Twoim hobby są mikrokontrolery

Oczywiście możesz dowiedzieć się, co napisał tutaj CubeMX. Ale jednocześnie jasne jest, że zapamiętywanie wszystkich sformułowań, a następnie pisanie ich ręcznie jest nierealne. Aby to debugować, jeśli przypadkowo zapomnę zaznaczyć pole w Kostce, nie ma w tym nic złego.

Minęły dwa lata, a ja nadal oblizuję usta Wyszukiwarka ST MCU na wszelkiego rodzaju smaczne, ale poza moim zrozumieniem, frytki i przypadkowo natknąłem się wspaniały artykuł, chociaż chodzi o STM8. I nagle Zdałem sobie sprawę, że przez cały ten czas pukałem do otwartych drzwi: rejestry STM są ułożone w taki sam sposób, jak rejestry każdego innego MK, a Cube nie jest konieczny do pracy z nimi. Czy było to w ogóle możliwe?..

HAL, a konkretnie STM32CubeMX to narzędzie dla profesjonalnych inżynierów, którzy blisko współpracują z chipami STM32. Główną cechą jest wysoki poziom abstrakcji, możliwość szybkiej migracji z jednego MCU na drugi, a nawet z jednego rdzenia na drugi, pozostając w obrębie linii STM32. Hobbyści rzadko spotykają się z takimi problemami - nasz wybór mikrokontrolerów z reguły ogranicza się do asortymentu AliExpress, a często migrujemy między radykalnie różnymi chipami - przechodzimy z Atmegi na STM, z STM na ESP lub jakąkolwiek nowość nasi chińscy przyjaciele rzucić na nas. HAL tu nie pomoże, a studiowanie go pochłonie dużo czasu.

LL pozostaje - ale od niego do rejestrów jest pół kroku. Osobiście uważam, że pisanie moich makr z adresami rejestrów jest przydatne: dokładniej studiuję arkusz danych, myślę o tym, czego będę potrzebować w przyszłości, a czego na pewno nie, lepiej strukturyzuję swoje programy i ogólnie pokonywanie pomaga zapamiętywać .

Ponadto istnieje niuans z popularnym STM32F103 - istnieją dla niego dwie niekompatybilne wersje LL, jedna oficjalna od STM, druga od Leaf Labs, używana w projekcie STM32duino. Jeśli napiszesz bibliotekę typu open source (a ja miałem dokładnie takie zadanie), musisz albo stworzyć dwie wersje, albo uzyskać bezpośredni dostęp do rejestrów.

Wreszcie wyeliminowanie LL moim zdaniem upraszcza migrację, zwłaszcza jeśli planuje się ją od samego początku projektu. Przesadny przykład: napiszmy Arduino Blink w Atmel Studio bez LL:

#include <stdint.h>

#define _REG(addr) (*(volatile uint8_t*)(addr))

#define DDR_B 0x24
#define OUT_B 0x25

int main(void)
{
    volatile uint32_t k;

    _REG(DDR_B) |= (1<<5);

    while(1)
    {
        _REG(OUT_B) |= (1<<5);
        for (k=0; k<50000; k++);
        _REG(OUT_B) &= ~(1<<5);
        for (k=0; k<50000; k++);
    } 
}

Aby ten kod mrugał diodą na chińskiej płytce z STM8 (ze ST Visual Desktop), wystarczy zmienić w nim dwa adresy:

#define DDR_B 0x5007
#define OUT_B 0x5005

Tak, korzystam z możliwości podłączenia diody na konkretnej płytce, będzie ona migać bardzo wolno, ale będzie!

Jakie rodzaje arkuszy danych są dostępne?

W artykułach i na forach, zarówno rosyjskich, jak i angielskich, „arkusze danych” oznaczają wszelką dokumentację techniczną chipów i to samo robię w tym tekście. Formalnie są to tylko jeden rodzaj takiej dokumentacji:

Karta katalogowa – Charakterystyki użytkowe, parametry taktyczne i techniczne. Obowiązkowe dla każdego elementu elektronicznego. Informacje ogólne warto mieć pod ręką, ale nie ma w nich zbyt wiele do przeczytania w sposób przemyślany. Jednak prostsze chipy często ograniczają się do arkusza danych, aby nie tworzyć niepotrzebnych dokumentów; w tym przypadku Instrukcja obsługi jest tutaj uwzględniony.

Instrukcja obsługi – sama instrukcja, zdrowa książeczka licząca ponad 1000 stron. Praca wszystkiego, co upchnięto w chipie, została szczegółowo opisana. Główny dokument dotyczący opanowania mikrokontrolera. w odróżnieniu datasheet, instrukcje są napisane dla szerokiej gamy MK i zawierają wiele informacji na temat urządzeń peryferyjnych, które nie są dostępne w Twoim konkretnym modelu.

Podręcznik programowania lub Podręcznik zestawu instrukcji – instrukcje dotyczące unikalnych poleceń mikrokontrolera. Zaprojektowany dla tych, którzy programują w języku asemblera. Autorzy kompilatorów aktywnie wykorzystują go do optymalizacji kodu, więc w ogólnym przypadku nie będziemy go potrzebować. Jednak zajrzenie tutaj jest przydatne do ogólnego zrozumienia, niektórych konkretnych poleceń, takich jak wyjście z przerwania, a także do aktywnego korzystania z debugera.

Nota – przydatne wskazówki dotyczące rozwiązywania konkretnych problemów, często z przykładami kodu.

Arkusz erraty – opis przypadków niestandardowego zachowania chipa z ewentualnymi możliwościami obejścia problemu.

Co znajduje się w arkuszach danych

Bezpośrednio Karta katalogowa możemy potrzebować następujących sekcji:

Podsumowanie urządzenia – pierwsza strona karty katalogowej krótko opisuje urządzenie. Bardzo przydatne w sytuacjach, gdy znalazłeś gdzieś chip (widziałeś go w sklepie, przylutowałeś, natrafiłeś na wzmiankę) i chcesz zrozumieć, co to jest.

Ogólny opis – bardziej szczegółowy opis możliwości chipów z linii.

Pinouty – schematy pinów dla wszystkich możliwych pakietów chipów (który pin jest na której nóżce).

Opis pinów – opis przeznaczenia i możliwości każdego pinu.

Mapa pamięci – mapa adresowa raczej nie będzie nam potrzebna w pamięci, czasami jednak zawiera ona także tablicę adresów bloków rejestrów.

Zarejestruj mapę – tabela adresów bloków rejestrów z reguły znajduje się w arkuszu danych i w Patrz instrukcja – tylko zmiany (offsety adresów).

Charakterystyki elektryczne – w tej sekcji jesteśmy przede wszystkim zainteresowani absolutne maksimum ocen, podając maksymalne obciążenia na chip. W przeciwieństwie do niezniszczalnego Atmega328p, większość MK nie pozwala na podłączenie poważnych obciążeń do pinów, co staje się niemiłą niespodzianką dla Arduinistów.

Informacje o paczce – rysunki dostępnych obudów, przydatne przy projektowaniu tablic.

Instrukcja obsługi strukturalnie składa się z działów poświęconych konkretnym peryferiom wskazanym w ich tytule. Każdy rozdział można podzielić na trzy części:

Przegląd, Wprowadzenie, Korzyści – przegląd możliwości peryferyjnych;

Opis funkcjonalny, Przewodnik użytkowania lub po prostu główny blok sekcji - szczegółowy opis tekstowy zasady działania urządzenia peryferyjnego i sposobu jego obsługi;

Rejestry – opis rejestrów kontrolnych. W prostych przypadkach, takich jak GPIO czy SPI, może to wystarczyć, aby zacząć korzystać z peryferii, ale często trzeba jeszcze przeczytać poprzednie części.

Jak czytać arkusze danych

Arkusze danych z przyzwyczajenia straszą swoją objętością i mnóstwem niezrozumiałych słów. W rzeczywistości wszystko nie jest takie straszne, jeśli znasz kilka lifehacków.

Zestaw dobry czytnik plików PDF. Arkusze danych pisane są w chwalebnej tradycji instrukcji papierowych, świetnie nadają się do wydrukowania, wstawienia plastikowych zakładek i przyszycia. Hipertekst obserwuje się w nich w ilościach śladowych. Na szczęście przynajmniej struktura dokumentu jest zaprojektowana z zakładkami, dlatego bardzo potrzebny jest odpowiedni czytnik z łatwą nawigacją.

Arkusz danych nie jest podręcznikiem Stroustrupa; zawiera nie trzeba czytać wszystkiego. Jeśli skorzystałeś z poprzedniej porady, po prostu znajdź żądaną sekcję na pasku zakładek.

Zwłaszcza arkusze danych Podręczniki referencyjne, może opisać możliwości nie konkretnego chipa, ale całą linię. Oznacza to, że połowa, a nawet dwie trzecie informacji nie jest związanych z Twoim chipem. Zanim zaczniesz studiować rejestry TIM7, sprawdź Ogólny opis, masz to?

Wiedzieć Angielski wystarczający do Poziom podstawowy. Arkusze danych składają się w połowie z terminów nieznanych przeciętnemu rodzimym użytkownikom języka i w połowie z prostych struktur łączących. Istnieją również doskonałe chińskie arkusze danych w języku chińskim angielskim, gdzie połowa to także terminy, a druga połowa to losowy zestaw słów.

Jeśli się spotkasz nieznane słowo, nie próbuj tłumaczyć go za pomocą słownika angielsko-rosyjskiego. Jeśli jesteś zdezorientowany histereza, to tłumaczenie „histereza” nie sprawi, że będzie ci cieplej. Skorzystaj z Google, Stack Overflow, Wikipedii, forów, gdzie będzie wymagana koncepcja wyjaśnione prostymi słowami na przykładach.

Najlepszym sposobem na zrozumienie tego, co czytasz, jest sprawdź w akcji. Dlatego miej pod ręką tablicę debugowania, z którą się zapoznałeś, a najlepiej dwie, na wypadek, gdybyś nadal coś źle zrozumiał i zobaczył magiczny dym.

Dobrym zwyczajem jest trzymanie arkusza danych pod ręką czytanie czyjegoś poradnika lub studiowanie cudzej biblioteki. Jest całkiem możliwe, że znajdziesz w nim bardziej optymalne rozwiązanie swojego problemu. I odwrotnie - jeśli z datasheet nie rozumiesz jak faktycznie działa rejestr, wpisz w Google: najprawdopodobniej ktoś już wszystko opisał prostymi słowami lub zostawił przejrzysty kod na GitHubie.

Glosariusz

Kilka przydatnych słów i symboli, które pomogą Ci szybko przyzwyczaić się do arkuszy danych. To, co sobie przypomniałem w ciągu ostatnich kilku dni, uzupełnienia i poprawki są mile widziane.

elektryczność
Vcc, vdd – „plus”, jedzenie
Vss, Vee – „minus”, ziemia
aktualne - aktualny
Napięcie - Napięcie
zatapiać prąd – pełnić funkcję „masy” dla obciążenia zewnętrznego
do źródła prądu – zasilanie obciążenia zewnętrznego
wysoki pin zlewu/źródła – sworzeń o zwiększonej „tolerancji” obciążenia

IO
H, wysoki – na pinie Vcc
L, niski – na pinie Vss
Wysokiej impedancji, Cześć-Z, unoszący się – na bolcu nie ma nic, „wysoka rezystancja”, jest praktycznie niewidoczny dla świata zewnętrznego.
słabe podciągnięcie, słabe ściąganie – wbudowany rezystor podciągający/rozciągający, w przybliżeniu równoważny 50 kOhm (patrz arkusz danych). Służy na przykład do zapobiegania zwisaniu pinu wejściowego w powietrzu, powodując fałszywe alarmy. Słaby - ponieważ łatwo jest mu „przerwać”.
pchać ciągnąć – tryb wyjścia pinowego, pomiędzy którym się przełącza Wysoki и niski – regularne WYJŚCIE z Arduino.
otwarty Spływ – oznaczenie trybu wyjściowego, w którym pin może się znajdować niskiLub Wysoka impedancja/pływająca. Co więcej, prawie zawsze nie jest to „prawdziwy” otwarty dren; są tam diody ochronne, rezystory i tak dalej. Jest to po prostu oznaczenie trybu uziemienia/braku.
prawdziwy otwarty odpływ - ale to jest prawdziwy otwarty dren: kołek prowadzi bezpośrednio do ziemi, jeśli jest otwarty, lub pozostaje w zawieszeniu, jeśli jest zamknięty. Oznacza to, że w razie potrzeby można przez niego przepuścić napięcie większe niż Vcc, ale maksimum jest nadal określone w arkuszu danych w sekcji Absolutne maksymalne wartości znamionowe/napięcie.

Interfejsy
w serii – połączone szeregowo
łańcuch – złożyć chipy w łańcuch za pomocą połączenia szeregowego, zwiększając liczbę wyjść.
przesunięcie – przesunięcie, zwykle oznacza przesunięcie bitowe. Odpowiednio, się przestawić и się przesunąć – odbierać i przesyłać dane bit po bicie.
zatrzask – zatrzask zakrywający bufor podczas przesuwania przez niego bitów. Po zakończeniu przenoszenia zawór otwiera się i bity zaczynają działać.
zameldować się – wykonaj transfer bit po bicie, przesuń wszystkie bity w odpowiednie miejsca.
podwójny bufor, rejestr cieni, wstępne załadowanie rejestru – oznaczenia historii, gdy rejestr musi móc przyjąć nowe dane, ale przetrzymać je do pewnego momentu. Przykładowo, aby PWM działał poprawnie, jego parametry (cykl pracy, częstotliwość) nie powinny się zmieniać aż do zakończenia bieżącego cyklu, ale nowe parametry można już przenieść. W związku z tym obecne są utrzymywane na poziomie rejestr cieni, i wpadają nowe wstępne załadowanie rejestru, zapisywany w odpowiednim rejestrze chipa.

Wszelkiego rodzaju rzeczy
preskaler – preskaler częstotliwości
trochę ustawić – ustaw bit na 1
aby trochę wyczyścić/zresetować – zresetować bit do 0 (zresetuj – Funkcja arkusza danych STM)

Co dalej

Ogólnie rzecz biorąc, zaplanowano tutaj część praktyczną z demonstracją trzech projektów na STM32 i STM8, wykonanych specjalnie na potrzeby tego artykułu przy użyciu arkuszy danych, z żarówkami, SPI, timerami, PWM i przerwaniami:

Jak i dlaczego czytać arkusze danych, jeśli Twoim hobby są mikrokontrolery

Ale tekstu jest dużo, więc projekty przesyłane są do drugiej części.

Umiejętność czytania arkuszy danych pomoże Ci w Twoim hobby, ale jest mało prawdopodobne, że zastąpi komunikację na żywo z innymi hobbystami na forach i czatach. W tym celu musisz przede wszystkim poprawić swój angielski. Dlatego też osoby, które ukończyły lekturę, otrzymają nagrodę specjalną: dwie bezpłatne lekcje w Skyeng przy pierwszej płatności za pomocą kodu HABR2.

Źródło: www.habr.com

Dodaj komentarz