STM8S001J3 (5). Porty wejścia/wyjścia mikrokontrolera oraz przerwania zewnętrzne

STM8S001J3 (5). Porty wejścia/wyjścia mikrokontrolera oraz przerwania zewnętrzne
Pobierz PDF Download icon
W ramach serii artykułów dotyczących 8-pinowego mikrokontrolera STM8S001J3 przyszedł czas na zapoznanie się z podstawowym peryferium, jakim są porty wejścia/wyjścia oraz towarzyszącym im blokiem EXTI, który odpowiada za powiązane z portami przerwania zewnętrzne. W artykule przedstawiono opis tych dwóch zasobów mikrokontrolera, a ich działanie zilustrowano przykładowymi aplikacjami.

W każdym systemie elektronicznym mikrokontroler poprzez swoje wyprowadzenia, a dalej ścieżki na płytce PCB dołączony jest do pewnej liczby podzespołów, z którymi musi się komunikować. Komunikację należy tu rozumieć jako umiejętność wysyłania i odbierania informacji w postaci sygnału elektrycznego (napięciowego). Zadanie to realizują porty wejścia/wyjścia.

Porty wejścia/wyjścia w mikrokontrolerze STM8S001J3

Porty mikrokontrolera mogą pracować w dwóch trybach. Pierwszy z nich to GPIO (General Purpose Input Output). W trybie tym programista ma bezpośrednią kontrolę nad portami i może sterować nimi z poziomu aplikacji. Porty w trybie GPIO wykorzystywane są przede wszystkim do operacji wejścia wyjścia, np. odczytywania stanów przycisków lub sterowania stanem (włącz/wyłącz) przekaźników, kluczy tranzystorowych, LEDów itp.

Drugi tryb pracy portów wejścia/wyjścia nazywany jest trybem alternatywnym. W trybie ty porty są połączone z peryferiami mikrokontrolera, aby umożliwić ich komunikowanie się ze światem zewnętrznym. Przykładowo porty mogą być wykorzystane przez przetwornik A/C do odczytywania wartości napięcia z wyprowadzenia mikrokontrolera, przez timer do generowania sygnału PWM poza układ lub przez interfejsy komunikacyjne do realizacji transmisji danych między mikrokontrolerem i innymi układami.

Port wejścia/wyjścia w mikrokontrolerze STM8 składa się z następujących bloków:

- Rejestrów (Registers) służących do konfiguracji tryby pracy portu, do przechowywania odczytanej z pinu wartości logicznej (w przypadku pracy w trybie wejściowym) i do przechowywania wartości, która na zostać wystawiona na pinie (w przypadku pracy w trybie wyjściowym).

- Kontrolera wejścia (Input Driver), który zbudowany jest z przerzutnika Schmitta i rezystora podciągającego do napięcia zasilania.

- Kontrolera wyjścia (Output Driver), który zbudowany jest z multipleksera sterowania (rejestry portu lub peryferia) oraz sterownika sygnału wyjściowego kontrolującego tranzystory.

- Dwóch diod zabezpieczających: jedna między pinem i dodatnim potencjałem napięcia zasilania, druga między pinem i ujemnym potencjałem napięcia zasilania.

Schemat blokowy portu wejścia wyjścia mikrokontrolera STM8 pokazano na rysunku 1. Poprzez aktywowanie i konfigurowanie poszczególnych elementów portu można uzyskać różne konfiguracje pracy. Łącznie jest ich dziewięć. Konfiguracje wejściowe: floating without interrupt, floating with interrupt, pull-up without interrupt oraz pull-up with interrupt. Konfiguracje wyjściowe: Open drain, Open drain fast, Push-pull, Push-pull fast oraz True open drain. W praktyce jednak budowa portów wejścia/wyjścia nie zawsze jest taka sama, dlatego istotne jest sprawdzenie w dokumentacji, jakie tryby są dostępne dla danego portu mikrokontrolera.

Jak już wspomniano wcześniej, wybrane porty wejścia/wyjścia mogą pracować w trybie alternatywnym, co oznacza wykorzystanie portu przez inne peryferia mikrokontrolera. W tabeli 1 przedstawiono zestawienie wszystkich portów mikrokontrolera STM8S001J3 wraz z dostępnymi dla nich konfiguracjami.

Struktura krzemowa mikrokontrolera dysponuje również portami wejścia/wyjścia, które nie są poł?czone z?pinami obudowy. S? to: PA2, PB0, PB1, PB2, PB3, PB6, PB7, PC1, PC2, PC7, PD0, PD2, PD4, PD7, PE5 oraz PF4. Powinny one zosta? skonfigurowane przez u?ytkownika w?trybie pracy ączone z pinami obudowy. Są to: PA2, PB0, PB1, PB2, PB3, PB6, PB7, PC1, PC2, PC7, PD0, PD2, PD4, PD7, PE5 oraz PF4. Powinny one zostać skonfigurowane przez użytkownika w trybie pracy output push-pull, a ich wyjściowy poziom logiczny powinien zostać ustawiony jako niski. Ma to na celu obniżenie poboru prądu mikrokontrolera i zwiększenie odporności EMC układu.

Podczas konfigurowania portów wejścia/wyjścia należy zwrócić szczególną uwagę na port PD1, który jest współdzielony z interfejsem programowania i debugowania SWIM. Z uwagi na brak pinu NRST aplikacja mikrokontrolera STM8S001J3 musi sama zagwarantować, że interfejs SWIM jest dostępny w momencie, gdy sprzętowy programator debuger ST-Link nawiązuje połączone z mikrokontrolerem. Po rekonfiguracji portu PD1 interfejs ten nie jest dłużej dostępny, zatem aby mieć pewność, że ST-Link połączy się z mikrokontrolerem zaleca się, aby pierwszym etapem działania aplikacji była kilkusekundowa pętla opóźniająca, która da czas potrzebny użytkownikowi na zainicjowanie trybu debugowania. Po upłynięciu tego czasu aplikacja może realizować właściwe jej zadania, w tym przekonfigurować domyślny tryb portu PD1.

Porty wejścia/wyjścia w STM8CubeMX

Narzędziem ułatwiającym pracę z portami mikrokontrolera STM8S001J3 jest program komputerowy STM8CubeMX. Dzięki niemu programista może w prosty sposób (za pomocą graficznego interfejsu użytkownika) sprawdzić, jakie są możliwe konfiguracje (tryby wejścia, wyjścia i alternatywne) dla wszystkich portów mikrokontrolera. Przykładowy scenariusz pokazano na rysunku 2.

Funkcje SPL do sterowania portami wejścia/wyjścia

Aby w prosty sposób skonfigurować porty wejścia/wyjścia układu STM8S001J3, a następnie nimi sterować, warto w aplikacji użyć bibliotek SPL (Standard Peripheral Library) przygotowanych dla mikrokontrolerów STM8S. Pliki stm8s_gpio.h oraz stm8s_gpio.c udostępniają szereg funkcji do tego celu. Ich zestawienie zaprezentowano w tabeli 2.

Przykładowa aplikacja sterująca portami wejścia/wyjścia

W celu wykonania przykładowej aplikacji zostało użyte środowisko programistyczne STVD (ST Visual Develop) oraz kompilator Cosmic CXSTM8. Opis tych narzędzi, jak również instrukcja jak wykonać za ich pomocą szablon nowego projektu wraz z dodaniem bibliotek SPL są dostępne w trzecim artykule z tej serii. Korzystając ze wspomnianego szablonu projektu należy edytować kod pliku main.c, w którym umieszczony zostanie cały kod aplikacji.

Przykładowa aplikacja demonstruje podstawowy sposób wykorzystania portów wejścia/wyjścia, a więc odczytywanie wartości logicznej z wejścia portu oraz wystawianie wartości logicznej na wyjściu portu. Na potrzeby generowania sygnału wejściowego użyty został przycisk (dołączony do portu PA3), natomiast w celu wizualizacji sygnału wyjściowego wykorzystano diodę LED (dołączony do portu PC3). Program działa według schematu: jeśli przycisk nie jest wciśnięty, dioda LED miga, a gdy przycisk jest wciśnięty, dioda LED nie miga. W tym celu wykonane zostaną następujące kroki:

Zostanie wykonana funkcja opóźniająca delay().

Na początku aplikacji wywołana zostanie funkcja opóźniająca, co przeciwdziała przez kilka sekund ewentualnemu późniejszemu wyłączeniu interfejsu programowania i debugowania SWIM będącemu efektem rekonfiguracji portów.

Wykonany zostanie kod konfiguracji portów wejścia/wyjścia, które nie są poł?czone z?wyprowadzeniami mikrokontrolera (kod wzi?ty z?noty aplikacyjnej AN5047: ączone z wyprowadzeniami mikrokontrolera (kod wzięty z noty aplikacyjnej AN5047: Getting started with the STM8S001J3 microcontroller).

Wywołanie funkcji GPIO_Init() skonfiguruje port PC3 jako wejście i PA3 jako wyjście.

W nieskończonej pętli:

- Wywołanie funkcji GPIO_ReadInputPin() pozwoli określić poziom logiczny na wejściu portu PC3. W zależności od wyniku zwróconego przez tą funkcję Instrukcja warunkowa if zdecyduje o dalszym kroku.
- Jeśli na wejściu portu odczytany zostanie niski stan logiczny, wywołane zostaną kolejno funkcje GPIO_WriteHigh(), delay(), GPIO_WriteLow() i ponownie delay(), co spowoduje mignięcie diody LED.
- Jeśli na wejściu portu odczytany zostanie wysoki stan logiczny, nie zostanie wykonane żadne zadanie.

Kod zgodny z zaprezentowanym opisem pokazano w listingu 1.

Moduł EXTI w mikrokontrolerze STM8S001J3

Obsługę portów wejścia/wyjścia można usprawnić poprzez użycie przerwań zewnętrznych (EXTI – External Interrupts). Blok EXTI jest częścią kontrolera przerwań o nazwie ITC (Interrupt controller). Kontroler ten udostępnia do 32 przerwań sprzętowych z możliwością konfiguracji 4 poziomów priorytetów oraz 3 niemaskowalne przerwania: RESET, TRAP oraz TLI (Top Level Interrupt). W odniesieniu do portów mikrokontrolera STM8S001J3 możliwe jest wykorzystanie przerwań od grupy portów PA (wyprowadzenia PA1, PA3), PB (PB4, PB5), PC (PC3 współdzielony z TLI, PC4, PC5, PC6) oraz PD (PD1, PD3, PD5, PD6). Aby port mógł generować przerwanie, musi być skonfigurowany do pracy w trybie wejściowym z włączonym przerwaniem. Każda grupa portów ma wybieralny typ zbocza sygnału, które aktywuje przerwanie (opadające, rosnące lub oba).

Funkcje SPL do sterowania modułem EXTI

Biblioteki SPL udostępniają funkcje dla przerwań zewnętrznych, których użycie ułatwia pisanie kodu aplikacji. Funkcje te znajdują się w plikach stm8s_exti.h oraz stm8s_exti.c. Ich zestawienie zaprezentowano w tabeli 3.

Przykładowa aplikacja sterująca modułem EXTI

Łatwo zauważyć, że przygotowana wcześniej aplikacja sterującą portami wejścia/wyjścia nie jest zbyt efektywna ze względu na programową obsługę przycisku, z czego wynika konieczność nieustanego (czasochłonnego) sprawdzania przez mikrokontroler stanu logicznego na wejściu portu. Zadanie to można zoptymalizować przez dodanie obsługi przerwania (EXTI), dzięki czemu zmiana poziomu logicznego na wejściu portu (naciśnięcie przycisku) będzie sygnalizowane sprzętowo. Modyfikacja pliku main.c polega na:

- Dodaniu zmiennej interrupt, która przechowuje informację o przerwaniu.
- Zmianie argumentu funkcji GPIO_Init()GPIO_MODE_IN_FL_NO_IT na GPIO_MODE_IN_FL_IT.
- Wywołaniu funkcji EXTI_SetExtIntSensitivity() ustawiającej aktywne zbocze dla przerwania.
- Wywołanie funkcji enableInterrupts() włączającej przerwania.
- Wewnątrz instrukcji warunkowej if:
- Zamianie wywołania funkcji GPIO_ReadInputPin() na zmienną interrupt.
- Wyzerowanie zmiennej interrupt.

Kod zgodny z zaprezentowanym opisem pokazano w listingu 2. Obsługa przerwań zaimplementowana jest w pliku stm8s_it.c. W pliku tym należy:

- Zasygnalizować przez dyrektywę extern istnienie zmiennej interrupt.
- Przypisać wartość 1 zmiennej interrupt w funkcji obsługi przerwania od grupy portów PC.

Kod pokazano w listingu 3.

Podsumowanie

W artykule przekazano podstawowe informacje o portach wejścia/wyjścia i przerwaniach zewnętrznych mikrokontrolera STM8S001J3 wraz z opisem przykładowych aplikacji. Osoby chcące dowiedzieć się bardziej szczegółowych informacji powinny sięgnąć do dokumentacji technicznej producenta. Parametry i charakterystyka obu zasobów mikrokontrolera dostępne są w nocie katalogowej mikrokontrolera (datasheet). Z kolei schematy oraz opis wszystkich funkcjonalności i rejestrów znajduje się w podręczniku użytkownika mikrokontrolera (user manual RM0016). Informacje uzupełniające dostępne są w nocie aplikacyjnej AN5047: Getting started with the STM8S001J3 microcontroller. Dodatkowo aplikacje testowe dostępne są w podkatalogu bibliotek SPL: …STM8S_StdPeriph_LibProjectSTM8S_StdPeriph_ExamplesGPIO oraz …STM8S_StdPeriph_LibProjectSTM8S_StdPeriph_ExamplesEXTI.

Szymon Panecki
szymon.panecki@st.com

Artykuł ukazał się w
Elektronika Praktyczna
kwiecień 2018
DO POBRANIA
Pobierz PDF Download icon
Materiały dodatkowe
Elektronika Praktyczna Plus lipiec - grudzień 2012

Elektronika Praktyczna Plus

Monograficzne wydania specjalne

Elektronik listopad 2024

Elektronik

Magazyn elektroniki profesjonalnej

Raspberry Pi 2015

Raspberry Pi

Wykorzystaj wszystkie możliwości wyjątkowego minikomputera

Świat Radio listopad - grudzień 2024

Świat Radio

Magazyn krótkofalowców i amatorów CB

Automatyka, Podzespoły, Aplikacje październik 2024

Automatyka, Podzespoły, Aplikacje

Technika i rynek systemów automatyki

Elektronika Praktyczna listopad 2024

Elektronika Praktyczna

Międzynarodowy magazyn elektroników konstruktorów

Elektronika dla Wszystkich listopad 2024

Elektronika dla Wszystkich

Interesująca elektronika dla pasjonatów