
Mikroelektronika to modna pasja ostatnich lat, dzięki magicznemu Arduino. Ale jest problem: przy odpowiednim zainteresowaniu szybko przechodzi się do DigitalWrite(), a co dalej – nie do końca wiadomo. Twórcy Arduino dołożyli wielu starań, aby obniżyć próg wejścia do swojego ekosystemu, ale poza nim wciąż czai się mroczny las surowej elektroniki, niedostępnej dla amatorów.
Na przykład, arkusze danych. Wydaje się, że zawierają wszystko, bierz i korzystaj. Ale ich autorzy wyraźnie nie stawiają przed sobą celu popularyzacji mikrokontrolerów; czasami wydaje się, że celowo nadużywają niezrozumiałych terminów i skrótów, opisując proste rzeczy, aby maksymalnie zdezorientować nieświadomych. Ale nie wszystko jest takie złe, przy odrobinie chęci można to zrozumieć.
W tym artykule podzielę się doświadczeniem humanisty w pracy z arkuszami danych w celach hobbystycznych. Tekst jest przeznaczony dla tych, którzy wyrośli z zabawy z Arduino i ma na celu zakładanie pewnej znajomości zasad działania mikrokontrolerów.
Zacznę od tradycyjnego
Migania diodą LED na 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 doświadczony czytelnik. – Dlaczego piszesz coś do rejestru wejściowego PINB? Przecież jest tylko do odczytu!” Rzeczywiście, , jak i większość artykułów edukacyjnych w Internecie, twierdzi, że ten rejestr jest tylko do odczytu. I sam tak myślałem, dopóki nie przeczytałem k Atmega328p, przygotowując ten artykuł. A tam:

To stosunkowo nowa funkcjonalność, której nie było w Atmega8, o której nie wszyscy wiedzą lub nie wspominają ze względów na zgodność wsteczną. Ale jest to całkiem przydatne do pokazania myśli, że warto czytać arkusze danych, aby wykorzystać wszystkie możliwości układu, w tym te mało znane. I to nie jedyny powód.
Dlaczego warto jeszcze czytać arkusze danych
Zazwyczaj arduiności, po zabawie z diodami LED i AnalogWrite'ami, zaczynają podłączać do płytki różne moduły i układy, dla których już istnieją napisane biblioteki. Prędzej czy później pojawia się biblioteka, która nie działa tak, jak powinna. Wtedy amator zaczyna ją grzebać, aby naprawić, a tam…
A tam dzieje się coś całkowicie niezrozumiałego, więc trzeba korzystać z Google, czytać liczne poradniki, czerpać odpowiedni kod z różnych źródeł i w końcu osiągnąć swoje. To daje silne poczucie osiągnięcia, ale w rzeczywistości proces przypomina wynalezienie roweru przez inżynierię wsteczną motocykla. Przy tym nie zwiększa się zrozumienie, jak ten rower działa. Wiem, bo sam tym się zajmowałem dość długo.
Gdybym zamiast tego ciekawego zajęcia poświęcił kilka dni na naukę dokumentacji Atmega328, zaoszczędziłbym ogromną ilość czasu. W końcu to dość prosty mikrokontroler.
Tak więc, trzeba czytać dane techniczne, przynajmniej po to, aby mieć pojęcie, jak w ogóle działa mikrokontroler i co potrafi robić. I jeszcze:
aby sprawdzać i optymalizować cudze biblioteki. Często piszą je ci sami amatorzy, którzy wynajdują koło na nowo; lub, przeciwnie, autorzy celowo wprowadzają w nich nadmiarową ochronę przed głupotą. Niech będzie trzy razy więcej i wolniej, ale na pewno zadziała;
aby móc używać w projekcie układów, do których nikt nie napisał biblioteki;
aby ułatwić sobie zadanie migracji z jednej linii mikrokontrolerów na drugą;
aby w końcu zoptymalizować swój stary kod, który nijak nie mieścił się w Arduino;
aby nauczyć się zarządzać dowolnym układem bezpośrednio przez jego rejestry, nie martwiąc się o poznawanie działania jego bibliotek, jeśli w ogóle są.
Po co pisać bezpośrednio do rejestrów, gdy są HAL i LL?
Słowniczek
HAL, High Abstraction Layer – biblioteka do zarządzania mikrokontrolerem z wysokim poziomem abstrakcji. Jeśli potrzebujesz korzystać z interfejsu SPI1, po prostu konfigurujesz i włączasz SPI1, nie zastanawiając się, jakie rejestry za co odpowiadają.
LL, Low Level API – biblioteka, która zawiera makra lub struktury z adresami rejestrów, pozwalająca na dostęp do nich po nazwie. DDRx, PORTx, PINx na Atmedze – to jest LL.
Dyskusje na temat „HAL, LL czy rejestry” regularnie pojawiają się w komentarzach na Habra. Nie roszcząc sobie dostępu do astralnej wiedzy, po prostu podzielę się swoim amatorskim doświadczeniem i spostrzeżeniami.
Z niejakim zrozumieniem Atmegi i przeczytaniu artykułów na temat wspaniałości STM32, kupiłem pół tuzina różnych płytek – zarówno Discovery, jak i „Niebieskie Tabletki”, a nawet kilka chipów dla moich własnych projektów. Wszystkie przez dwa lata leżały w pudełku. Czasami mówiłem sobie: „wszystko, od tych weekendów uczę się STM”, uruchamiałem CubeMX, generowałem ustawienia dla SPI, patrzyłem na powstały mur tekstu, obficie wzbogacony przez copywriting STM, i decydowałem, że to jest jakoś zbyt skomplikowane.

Zrozumieć, co tu napisał CubeMX, oczywiście można. Ale jednocześnie jasne jest, że zapamiętanie wszystkich sformułowań, aby później pisać je ręcznie, jest nierealne. A w przypadku debugowania, jeśli przypadkiem zapomnę zaznaczyć jakąś opcję w Cube, to będzie już całkowity chaos.
Minęły dwa lata, ja wciąż patrzyłem na jak na różne smaczne, lecz niedostępne dla mojego zrozumienia chipy, i przypadkowo natknąłem się na , choć chodziło o STM8. I nagle zmogłem, że przez cały ten czas pukałem do otwartych drzwi: rejestry w STM są podobnie zorganizowane jak w każdym innym MCU, i do pracy z nimi Cube nie jest konieczny. A co, można było tak?..
HAL i konkretnie STM32CubeMX to narzędzie dla profesjonalnych inżynierów, którzy mocno pracują z chipami STM32. Główną zaletą jest wysoki poziom abstrakcji, możliwość szybkiej migracji z jednego MCU na inny, a nawet z jednego rdzenia na inne, pozostając w ramach serii STM32. Amatorzy rzadko się z tym spotykają – nasz wybór MCU jest zazwyczaj ograniczony do asortymentu AliExpress, a my częściej migrujemy między radykalnie różnymi chipami – przechodzimy z Atmegi na STM, ze STM na ESP, lub co tam nowego podrzucą nam chińscy przyjaciele. HAL tutaj nie pomoże, a nauka pochłonie sporo czasu.
Pozostaje LL – ale do rejestrów jest tylko krok. Osobiście uważam, że pisanie własnych makr z adresami rejestrów jest przydatne: dokładniej studiuję kartę katalogową, myślę, co mi się przyda w przyszłości, a co na pewno nie, lepiej strukturyzuję swoje programy i w ogóle pokonywanie trudności sprzyja zapamiętywaniu.
Ponadto istnieje niuans związany z popularnym STM32F103 – dla niego istnieją dwie niekompatybilne wersje LL, jedna oficjalna od STM, druga – od Leaf Labs, używana w projekcie STM32duino. Jeśli piszę bibliotekę open-source (a taką miałem właśnie ), trzeba albo zrobić dwie wersje, albo zwracać się bezpośrednio do rejestrów.
W końcu porzucenie LL w moim odczuciu upraszcza migrację, zwłaszcza jeśli zaczyna się ją planować już na etapie prac nad projektem. Przykład skrajny: napiszemy program pokazu błysku w Arduino 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 mógł migać diodą LED na chińskiej płytce z STM8 (ze ST Visual Desktop), wystarczy zmienić dwa adresy:
#define DDR_B 0x5007
#define OUT_B 0x5005Tak, korzystam z możliwości podłączenia diody LED na konkretnej płytce, będzie migać bardzo wolno, ale jednak miga!
Jakie są rodzaje arkuszy danych
W artykułach i na forach, zarówno w języku rosyjskim, jak i angielskim, pod "arkuszami danych" rozumie się każdą dokumentację techniczną chipów, ja również stosuję tą definicję w tym tekście. Formalnie są one tylko jednym z rodzajów takiej dokumentacji:
Arkusz danych – TTH, taktyczno-techniczne charakterystyki. Musi być dostępny dla każdego komponentu elektronicznego. Informacje referencyjne, warto je mieć pod ręką, ale nie ma w nich zbyt wiele do przemyślenia. Niemniej jednak, prostsze chipy często ograniczają się do arkusza danych, aby nie wytwarzać zbędnych dokumentów; w takim przypadku Podręcznik referencyjny włącza się również tutaj.
Podręcznik referencyjny – właściwie instrukcja, obszerny dokument liczący ponad 1000 stron. Szczegółowo opisuje działanie wszystkiego, co zostało włożone w chip. Główny dokument do nauki mikrokontrolera. W przeciwieństwie do datasheet, instrukcje są pisane dla szerokiej gamy MК, zawierają wiele informacji o peryferiach, które nie występują w Twoim konkretnym modelu.
Podręcznik programowania lub Podręcznik zestawu instrukcji – instrukcja dotycząca unikalnych poleceń mikrokontrolera. Przeznaczona dla tych, którzy programują w Assemblerze. Autorzy kompilatorów aktywnie z niej korzystają w celu optymalizacji kodu, więc w ogólnym przypadku może nam się nie przydać. Ale warto tu zajrzeć, aby ogólnie zrozumieć niektóre specyficzne polecenia, takie jak wyjście z przerwania, zwłaszcza przy aktywnym użytkowaniu debuggera.
Notatka aplikacyjna – przydatne wskazówki dotyczące rozwiązywania konkretnych problemów, często z przykładami kodu.
Karta erraty – opis przypadków nienaormalnego zachowania chipa wraz z możliwymi obejściami, jeśli są dostępne.
Co znajduje się w arkuszach danych
Bezpośrednio w Arkusz danych mogą być potrzebne nam takie sekcje:
Podsumowanie urządzenia – pierwsza strona arkusza danych krótko opisuje urządzenie. Bardzo przydatna w sytuacjach, gdy gdzieś znalazłeś chip (zauważyłeś w sklepie, wylutowałeś, spotkałeś wzmiankę) i chcesz zrozumieć, czym to jest.
Opis ogólny – bardziej szczegółowy opis możliwości układów z serii.
Pinouts – schematy rozkładów pinów dla wszystkich możliwych obudów układu (na którym nodze jaki pin).
Pin Description – opis przeznaczenia i możliwości każdego pinu.
Memory Map – mapa adresów w pamięci jest nam raczej niepotrzebna, ale czasami zawiera również tabelę adresów bloków rejestrów.
Register Map – tabela adresów bloków rejestrów, zazwyczaj znajduje się w karcie danych, a w Ref Manual – tylko przesunięcia (address offsets).
Electrical Characteristics – w tej sekcji interesują nas w pierwszej kolejności absolute maximum ratings, wymieniające maksymalne obciążenia układu. W przeciwieństwie do niezniszczalnej Atmega328p, większość mikrokontrolerów nie pozwala na podłączanie poważnych obciążeń do pinów, co staje się niemiłym zaskoczeniem dla osób korzystających z Arduino.
Package Information – rysunki dostępnych obudów, przydatne podczas projektowania własnych płytek.
Podręcznik referencyjny strukturalnie składa się z sekcji poświęconych konkretnej peryferii, wskazanej w ich nagłówku. Każdą rozdział można umownie podzielić na trzy części:
Overview, Wprowadzenie, Features – przegląd możliwości peryferii;
Functional Description, Usage Guide lub po prostu główny blok sekcji – szczegółowy opis zasad działania peryferii i możliwości jej użycia;
Registers – opis rejestrów kontrolnych. W prostych przypadkach jak GPIO czy SPI może być to wystarczające, aby zacząć korzystać z peryferii, ale często konieczne jest przeczytanie wcześniejszych części.
Jak czytać karty danych
Karty danych mogą przerażać swoim rozmiarem i obfitością niezrozumiałych słów. W rzeczywistości nie jest tak strasznie, jeśli zna się kilka trików.
Zainstaluj dobrego czytnika PDF. Karty danych pisane są w znakomitych tradycjach papierowych instrukcji, fajnie jest je wydrukować, zaznaczyć plastikowymi zakładkami i oprawić. Hipertekst występuje w nich w śladowych ilościach. Na szczęście przynajmniej struktura dokumentu jest oznaczona zakładkami, więc dobry czytnik z wygodną nawigacją jest bardzo przydatny.
Karta danych to nie podręcznik Stroustrupa, w nim nie trzeba czytać wszystkiego po kolei. Jeśli skorzystałeś z poprzedniej porady – po prostu znajdź w panelu zakładek potrzebny dział.
Karty danych, szczególnie Reference Manuals, mogą opisywać możliwości nie konkretnego układu, ale całej seriiOznacza to, że połowa, a nawet dwie trzecie informacji nie ma związku z Twoim układem scalonym. Zanim zaczniesz przestudiować rejestry TIM7, upewnij się, że Opis ogólnymasz go na swoim wyposażeniu.
Znać angielski na poziomie podstawowym. Karty katalogowe w połowie składają się z terminów, które są obce przeciętnemu użytkownikowi, a w połowie – z prostych zwrotów. Często można znaleźć doskonałe chińskie karty katalogowe w angielskim chińskim, gdzie połowa również składa się z terminów, a druga połowa to losowy zestaw słów.
Jeśli napotkasz nieznane słowo, nie próbuj tłumaczyć go przy pomocy słownika angielsko-rosyjskiego. Jeśli nie możesz zrozumieć histerezy, to tłumaczenie „histereza” nie uczyni sprawy jaśniejszą. Korzystaj z Google'a, Stack Overflow, Wikipedii, forów, gdzie potrzebna koncepcja będzie .
Najlepszym sposobem na zrozumienie przeczytanego tekstu jest sprawdzenie w praktyce. Dlatego miej pod ręką płytkę deweloperską, z którą się zapoznajesz, a najlepiej dwie – na wypadek, gdybyś czegoś nie zrozumiał i zauważył magiczny dym.
Przydatne jest, aby mieć pod ręką kartę katalogową, gdy czytasz czyjś tutorial lub studiujesz cudzą bibliotekę. Jest całkiem możliwe, że znajdziesz w nim bardziej optymalne rozwiązanie swojego problemu. I odwrotnie – jeśli nie możesz z karty katalogowej zrozumieć, jak działa dany rejestr, poszukaj w Google: najprawdopodobniej ktoś już opisał to prostymi słowami lub umieścił zrozumiały kod na GitHubie.
Słowniczek
Trochę przydatnych słów i oznaczeń, które pomogą szybciej oswoić się z kartami katalogowymi. To, co przypomniało mi się w ostatnich dwóch dniach, wszelkie dodatki i poprawki są mile widziane.
Elektryczność
Vcc, Vdd – „plus”, zasilanie
Vss, Vee – „minus”, ziemia
prąd – prąd
napięcie – napięcie
aby ściągnąć prąd – działać jako „ziemia” dla zewnętrznego obciążenia
aby zasilać prąd – dostarczać zasilanie zewnętrznemu obciążeniu
wysoka pin zaciągu/zasilania – pin o zwiększonej „tolerancji” względem obciążenia
IO
H, Wysoki – na pinie Vcc
L, Niski – na pinie Vss
Wysoka impedancja, Hi-Z, dryfujący – na pinie nic nie ma, „wysoka impedancja”, jest praktycznie niewidoczny dla świata zewnętrznego.
słabe podciąganie, słabe ściąganie – wbudowany opornik podciągający/ściągający, przybliżony odpowiednik 50 kΩ (zobacz kartę katalogową). Stosowany, na przykład, aby pin wejściowy nie unosił się w powietrzu, powodując fałszywe wyzwolenia. Słabe – ponieważ łatwo go „przebić”.
push pull – tryb wyjściowy pinu, w którym przełącza się między Wysoki i Niski – standard OUTPUT with Arduino.
open drain – designation of the output mode in which the pin can be either Niski, albo High Impedance / Floating. In this case, it's almost never a "true" open drain; there are protective diodes, resistors, and more. This simply indicates the ground/nothing mode.
true open drain – and this is a true open drain: the pin directly connects to ground when open, or remains in a suspended state when closed. This means it can pass a voltage greater than Vcc if necessary, but the maximum is specified in the datasheet under Absolute Maximum Ratings / Voltage.
Interfejsy
in series – connected in series
to chain – assembling chips in a chain through series connection, increasing the number of outputs.
shift – shift, usually denotes bit shifting. Accordingly, to shift in i to shift out – receiving and transmitting data bit by bit.
latch – a latch that covers the buffer while bits are being shifted. When the transmission is complete, the latch opens, and the bits start working.
to clock in – perform bit-wise transmission, shifting all bits to their required positions.
double buffer, shadow register, preload register – designations of history when the register must be able to accept new data but hold it until a certain moment. For example, for proper PWM operation, its parameters (duty cycle, frequency) should not change until the current cycle is finished, but new parameters can be passed. Accordingly, the current ones are kept in shadow register, and the new ones are entered into preload register, being recorded in the corresponding chip register.
Various
prescaler – frequency divider
to set a bit – set the bit to 1
to clear/reset a bit – reset the bit to 0 (reset – a feature of STM datasheets)
Co dalej
In general, a practical part was planned to demonstrate three projects on STM32 and STM8, created specifically for this article using datasheets, with light bulbs, SPI, timers, PWM, and interrupts:

However, the text is becoming quite lengthy, so the projects are moved to part two.
The skill of reading datasheets will help you with your hobby, but it will hardly replace live communication with fellow enthusiasts on forums and chats. For this, you really need to improve your English first. Therefore, for those who have read to the end – a special prize: two free lessons at Skyeng with the first payment using the code HABR2.
Źródło: habr.com
