STM32Butterfly2: obsługa portów GPIO w STM32

 

Pierwszymi aplikacjami jakie tworzy osoba ucząca się programowania na komputerze PC zwykle są programy typu „Hello World”, w przypadku programów tworzonych dla mikrokontrolerów istnieje podobny rodzaj aplikacji, tworzonych jako te pierwsze. Są to proste programy służące do sterowania diodami LED. Projekt przeznaczony jest dla płytek STM32Butterfly oraz STM32Butterfly2 (na obu zestawach ewaluacyjnych aplikacja będzie działać bez potrzeby wprowadzania zmian w projekcie).

 

Fot. 1. Wygląd modułu KAmodLED8

Fot. 1. Wygląd modułu KAmodLED8

 

 

Przykładowy projekt przedstawia proste sterowanie portem GPIO, poprzez prezentację stanów poszczególnych linii na diodach LED. Do tego celu został wykorzystany moduł KAmodLED8 (fotografia 1), projekt realizuje efekt węża („przesuwająca” się zapalona jedna dioda LED). Połączenie modułu KAmodLED8 z płytką zostało przedstawione na rysunku 2, można je zrealizować przy użyciu przewodów połączeniowych CAB_A. Linie sygnałowe dostępne są na złączu szpilkowym, natomiast linia zasilania o potencjale 5 V jest wyprowadzona na złączu magistrali SPI lub I2C.

 

Rys. 2. Sposób podłączenia modułu KAmodLED8 do STM32Butterfly2

Rys. 2. Sposób podłączenia modułu KAmodLED8 do STM32Butterfly2

 

 

Listing głównego programu został przedstawiony poniżej.

 

Pierwszym działaniem w programie głównym jest polecenie włączające zegar dla GPIO, do którego podłączone są diody LED. Realizowane jest to poprzez ustawienie odpowiedniego bitu rejestru APB2ENR.

Drugim poleceniem jest konfiguracja linii GPIO, do których podłączone są diody LED, jako wyjść. Odpowiada za to funkcja io_config_ext, jako pierwszy parametr przyjmowana jest nazwa portu, kolejnym parametrem jest maska określające, które linie są konfigurowane (poszczególne bity maski przedstawiają poszczególne linie). Trzeci parametr określa szybkość taktowania portu, ostatni parametr określa sposób działania linii. W przypadku projektu linie zostały skonfigurowane jako linie wyjściowe symetryczne (push-pull).

W kolejnym kroku program przechodzi do nieskończonej pętli while, w której dokonywane jest przełączanie stanów poszczególnych linii.  Odpowiada za to komenda for, zwykle stosowana w raz z inkrementowaniem licznika, która w tym przypadku przesuwa wartość zmiennej określającej linie. W wyniku czego kolejne wartości zmiennej b są następujące: 0x01, 0x02, 0x04, 0x08 itd. .

W samej pętli for mamy dwa polecenia, pierwszym jest funkcja io_set_clr_mask, która ustawia pożądany stan poszczególnych linii. Funkcja ta realizuje działanie w oparciu o podane trzy parametry. Pierwszy z nich określa kontrolowany port, wartość drugiego parametru określa, które linie mają zostać ustawione  w stan wysoki, a które w stan niski. Wartość bitu równa ‘1’ powoduje ustawienie stanu wysokiego danej linii, natomiast wartość bitu ‘0’ powoduje ustawienie stanu niskiego linii. Ostatnim parametrem jest maska, która określa sterowane linie, wartość bitu równa ‘0’ na danej pozycji powoduje zablokowanie zmiany stanu danej linii.

Druga linia pętli for zawiera kolejną pętlę, zadaniem tej pętli jest opóźnienie działania pierwszej funkcji zmieniającej stan linii. Zostało to zrealizowane poprzez wykonywanie poprzez określoną liczbę cykli polecenia nop(), które nie realizuje żadnego zadania poza przejściem do kolejnego polecenia.

Do pobrania

O autorze