Obwód wyjściowy każdej linii GPIO w STM32 jest zbudowany z pary tranzystorów MOS. W idealnym świecie ich parametry byłyby zawsze takie same: niezależnie od egzemplarza układu, temperatury pracy czy napięcia zasilania. W rzeczywistości tak nie jest, ale na szczęście bardziej rozbudowane mikrokontrolery STM32 mają wbudowane rozwiązania pozwalające przeciwdziałać nieuniknionym dryfom i tolerancjom produkcyjnym.
Na zachowanie bufora wyjściowego w układach CMOS wpływa kilka czynników. Pierwszym jest rozrzut parametrów procesu technologicznego. Naturalne różnice występują pomiędzy egzemplarzami układów scalonych, nawet jeżeli pochodzą one z tego samego krzemowego wafla. Drugi czynnik – tym razem już aplikacyjny – to napięcie zasilania domeny I/O, a trzeci to temperatura struktury półprzewodnikowej. Wszystkie te czynniki określa się skrótem PVT, od angielskich słów Process, Voltage, Temperature. Ich wpływ jest szczególnie widoczny wtedy, gdy pin GPIO pracuje jako szybkie wyjście i musi przełączać się z dużą częstotliwością, sterując jednocześnie rzeczywistą pojemnością obciążenia.
I/O compensation cell jest wewnętrznym blokiem stosowanym w niektórych mikrokontrolerach STM32, który ma ograniczyć wpływ PVT na właściwości elektryczne wyjść cyfrowych. W uproszczeniu można powiedzieć, że komórka kompensacyjna dostraja efektywną siłę bufora wyjściowego, osobno dla części odpowiedzialnej za zbocze narastające i opadające. W dokumentacji ST mechanizm ten jest opisywany jako regulacja zachowania tranzystorów P-MOS i N-MOS, a więc elementów bezpośrednio odpowiedzialnych za ładowanie i rozładowywanie pojemności obciążenia.
Brzmi skomplikowanie? Aby lepiej zrozumieć cel i zasadę działania komórek kompensacyjnych, przyjrzyjmy się z bliska wpływowi czynników PVT na dynamikę wyjść mikrokontrolera.
I/O compensation cell – a komu to potrzebne?
Najłatwiej zrozumieć sens stosowania bloku I/O compensation cell, rozpatrując skrajne przypadki. Jeżeli wewnętrzny bufor sterujący bramkami tranzystorów komplementarnych N-MOS i P-MOS okaże się „zbyt mocny”, zbocza na wyjściu mikrokontrolera będą bardzo strome, a to – jak już dobitnie wykazał nasz eksperyment opublikowany w trzeciej części artykułu – może powodować wzrost emisji zaburzeń elektromagnetycznych (EMI), nie wspominając o odbiciach czy przeregulowaniach sygnałów cyfrowych. A to gotowa recepta na problemy ujawniające się w badaniach EMC, a nawet już w czasie docelowej eksploatacji.
Drugi skrajny przypadek to bufor „zbyt słaby”, czyli pracujący ze zbyt wysoką impedancją sterującą bramkami tranzystorów wyjściowych. Wtedy zbocza są łagodne, a sygnał dłużej przebywa w zakresie przejściowym pomiędzy logicznym zerem i jedynką. Może to z kolei prowadzić do zmniejszenia marginesu czasowego, błędów próbkowania i szeregu innych problemów zależnych od temperatury, wartości napięcia zasilającego albo konkretnego egzemplarza mikrokontrolera. Układ, który poprawnie działa na biurku konstruktora, może zatem przestać funkcjonować podczas testów w komorze klimatycznej albo po zmianie partii produkcyjnej.
Na poniższych wykresach, zaczerpniętych z oryginalnej dokumentacji STMicroelectronics, pokazano właśnie dwa skrajne przypadki. Strome nachylenie charakterystyki przejściowej (tj. zależności napięcia wyjściowego od sygnału sterującego buforem) oznaczono napisem w kolorze zielonym (best case), a najbardziej łagodne – kolorem różowym (worst case). W praktycznych układach chcemy, aby nasz układ pracował gdzieś pośrodku, czyli w przedziale dobrze kontrolowanych, stabilnych czasów narastania i opadania. Taka stabilność przekłada się też na „trzymanie w ryzach” impulsów prądowych (dolny wykres), które powstają podczas przeładowywania pojemności obciążenia.

Komórka kompensacyjna ma na celu ograniczenie tego rozrzutu. Jej zadaniem nie jest zatem uzyskanie najszybszego możliwego działania GPIO, lecz stabilizacja właściwości bufora wyjściowego w różnych warunkach pracy. Docelowo oznacza to bardziej przewidywalne czasy narastania i opadania oraz mniejszą zmienność zachowania szybkich interfejsów.
Rejestr OSPEEDR i I/O compensation cell, czyli… dobrze dobrana para
Bardzo ważne jest rozróżnienie dwóch mechanizmów: ustawienia rejestru OSPEEDR i działania bloku I/O compensation cell. Rejestr OSPEEDR wybiera jedną z kilku klas szybkości wyjściowej pinu – szczegółowy opis wpływu nastaw GPIO na parametry dynamiczne znajdziesz w poprzednich częściach tego materiału:
- STM32: OSPEEDR, czyli szybko, szybciej i najszybciej (1). Podstawy
- STM32: OSPEEDR, czyli szybko, szybciej i najszybciej (2). Praktyczne pomiary dynamiki GPIO
- STM32: OSPEEDR, czyli szybko, szybciej i najszybciej (3). GPIO kontra EMC, czyli walka żywiołów
Blok I/O compensation cell działa na innym poziomie. Nie zastępuje wyboru OSPEEDR i nie zwalnia projektanta z konieczności analizy integralności sygnałowej. Jego rolą jest za to kompensacja zmian parametrów bufora wynikających z PVT. Można to porównać do dwóch pokręteł: OSPEEDR to niejako czteropozycyjny przełącznik, który określa ogólną klasę szybkości wyjścia, natomiast komórka kompensacyjna pomaga utrzymać bardziej powtarzalne właściwości tego wyjścia w zmiennych warunkach pracy, dzięki czemu mikrokontroler faktycznie „trzyma parametry” zgodnie z wolą projektanta.
Użycie komórki kompensacyjnej – kiedy i jak to zrobić?
W praktyce użycie komórki kompensacyjnej trzeba rozważyć przede wszystkim wtedy, gdy mikrokontroler pracuje z szybkimi interfejsami wyprowadzonymi na piny GPIO. Typowe przykłady to FMC/FSMC, QSPI/OSPI/XSPI, SDIO/SDMMC, szybkie SPI, interfejsy równoległe, linie zegarowe MCO oraz inne sygnały, dla których zbocza i marginesy czasowe mają istotne znaczenie. W zastosowaniach niskoczęstotliwościowych, takich jak sterowanie LED, przekaźnikami, prostymi wejściami cyfrowymi czy wolnymi liniami sterującymi, komórka kompensacyjna nie będzie miała absolutnie żadnego znaczenia praktycznego.
Co ważne, nie wszystkie mikrokontrolery STM32 są wyposażone w blok kompensacji, a jeżeli go mają, to szczegóły jego konfiguracji mogą dość mocno się różnić pomiędzy poszczególnymi rodzinami układów. Popatrzmy na dwa przykłady.
Przykład włączenia w kodzie
W notach katalogowych mikrokontrolerów STM32F4 komórka kompensacyjna jest lakonicznie przywoływana zaledwie w kilku miejscach, a najważniejsze jest zalecenie, które brzmi:
For maximum frequencies above 50 MHz and VDD > 2.4 V, the compensation cell should be used.
Reference manual rodziny STM32F4 także podaje stosunkowo niewiele informacji na temat bloku I/O compensation cell – warto przy tym zwrócić uwagę na fakt, że dokumentacja odwołuje się jeszcze do starych określeń nastaw rejestru OSPEEDR (50 MHz, 100 MHz) zamiast nowych (High speed, Very high speed):

W projektach opartych na starszych rodzinach STM32 procedura uruchamiania bloku kompensacji sprowadza się do włączenia taktowania bloku SYSCFG, aktywacji komórki kompensacyjnej i odczekania na ustawienie flagi gotowości w rejestrze CMPCR, który ma następującą postać:

W kodzie HAL najprostsza implementacja (bez użycia timeoutu) może wyglądać następująco:
__HAL_RCC_SYSCFG_CLK_ENABLE();
HAL_EnableCompensationCell();
while ((SYSCFG->CMPCR & SYSCFG_CMPCR_READY) == 0)
{
/* w praktycznej implementacji warto dodac obsluge bledu
po przekroczeniu okreslonego timeoutu */
}W kodzie z użyciem tylko bibliotek CMSIS i rejestrów te same operacje wyglądają następująco:
RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN;
SYSCFG->CMPCR |= SYSCFG_CMPCR_CMP_PD;
while ((SYSCFG->CMPCR & SYSCFG_CMPCR_READY) == 0)
{
/* w praktycznej implementacji warto dodac obsluge bledu
po przekroczeniu okreslonego timeoutu */
}Różne rodziny STM32 – różne implementacje
Powyższy przykład dotyczy wspominanych wcześniej mikrokontrolerów STM32F4 – czyli rodziny już nieco leciwej (choć wciąż niezwykle popularnej). Nowsze, bardziej rozbudowane implementacje mogą zawierać kilka osobnych komórek kompensacyjnych, a przykład można zobaczyć na rysunku poniżej. W rodzinie STM32H7Rx7Sx jedna komórka kompensacyjna obsługuje „zwykłe” linie GPIO, podczas gdy dwie pozostałe są dedykowane wyłącznie do obsługi linii powiązanych z superszybkimi interfejsami XSPI1 i XSPI2, osiągającymi w optymalnych warunkach częstotliwość sygnału zegarowego na poziomie aż 180 MHz!

Za bardziej rozbudowaną strukturą idzie oczywiście także więcej ustawień w rejestrach – tutaj nie wystarczą już tylko proste bity włączające dany blok i flagi pozwalające na sprawdzenie aktualnego stanu jego działania. W przypadku rodziny STM32H7Rx7Sx analiza dokumentacji daje już całkiem dokładny wgląd w działanie komórek kompensacyjnych.

Sterowanie każdą komórką kompensacyjną odbywa się poprzez regulację ustawień półbajtów NSRC[3:0] i PSRC[3:0], które ustalają impedancję układu sterującego bramkami tranzystorów wyjściowych, odpowiednio N-MOS (od strony masy) i P-MOS (od strony VCC). Wartości te mogą pochodzić z rejestru SBS_CCVALR i być automatycznie sterowane w pętli sprzężenia zwrotnego, ale istnieje także opcja zastosowania wartości ustawionych arbitralnie przez użytkownika za pomocą rejestru SBS_CCSWVALR, osobno dla poszczególnych komórek kompensacyjnych.

Czy komórki kompensacyjne w STM32 zmniejszają zakłócenia EMI?
Odpowiedź brzmi następująco: mogą pomóc, ale nie należy traktować ich jako gotowej recepty na problemy natury EMC. Jeżeli źródłem emisji są błędy w layoucie PCB, to włączenie i nawet najbardziej poprawna konfiguracja komórek kompensacyjnych nie usunie przyczyny problemu. Może natomiast zmniejszyć rozrzut zachowania buforów I/O i pomóc w uzyskaniu bardziej przewidywalnych parametrów dynamicznych, czyli – najprościej mówiąc – utrzymać integralność sygnałów w użytecznych ryzach. A to już bardzo wiele, zważywszy na szerokie widmo zakłóceń generowanych przez szybkie sygnały prostokątne – wystarczy przypomnieć sobie, jak daleko w naszym eksperymencie z trzeciej części tego artykułu sięgało widmo sygnału o częstotliwości zaledwie 690 kHz…
Podsumowanie
Komórki kompensacyjne GPIO w rodzinie STM32 stanowią mechanizm przeznaczony do stabilizacji właściwości dynamicznych GPIO w zmiennych warunkach procesu technologicznego, napięcia i temperatury. Ma to szczególne znaczenie przy najszybszych interfejsach, dla których czasy narastania i opadania, marginesy czasowe oraz integralność sygnału decydują o poprawnej pracy całego urządzenia. Ich użycie nie zastępuje jednak świadomego doboru nastaw OSPEEDR, a tym bardziej poprawnego projektu PCB, który w przypadku szybkich linii sygnałowych zawsze jest absolutnie niezbędny i wymaga skrupulatnej implementacji dobrych praktyk projektowych.

