STM32 Porty GPIO — dla opornych 3

STM32 Porty GPIO — dla opornych 3
Razem głosów: 20 co stanowi: 97% całości.

2476ps-STM32AUDIO-PHOTO

No dobrze poznaliśmy już rejestry dzięki którym możemy sobie zarządzać portami GPIO, ale to nie wszystko :) sprawa jest bardziej skomplikowana niż się wydaje  co prawda stronę sprzętową mamy z głowy to jednak czas poznać stronę programową i właśnie tym się teraz zajmiemy….

Rejestry ,które poznaliśmy  zostały odwzorowane na określonych miejscach pamięci w ramach przestrzeni adresowej mikrokontrolerów STM32. Wszystko było by cacy i super gdyby nie to że te miejsca zostały zdefiniowane z kolei  w różnych plikach nagłówkowych.  Dlatego teraz wypadało by się do nich dobrać i je poznać.

—> Definicje w  C i niektóre typedefs -y 

Zaglądając do pliku nagłówkowego stm32F4xx.h  możemy znaleźć taką oto ciekawą definkę :

Oczywiście stm32F4xx.h znajduje się w standardowych bibliotekach dostarczanych przez STM  i warto się z nimi zapoznać ….

Hmm… analiza członków struktury w typedef ujawnia wszystkie mapy rejestrów o których rozmawialiśmy wcześniej  jednakże jest pewien wyjątek  —  a jest nim rejestr BSRR widzicie ??  zobaczmy to jeszcze raz w powtórce:

Zobaczcie został on podzielony na dwie części BSRRL i BSRRH.  Zrobiono to celowo i teraz ładnie widać różnice w funkcjonowaniu tych dwóch 16 bitowych połówek rejestru, czyli ustawianie i kasowanie pojedynczych bitów w rejestrze danych wyjściowych __ODR.

Lokalizacja GPIO w pamięci  –>>

Gdy już mamy ładnie zorganizowane rejestry w struktury co widzimy powyżej,  teraz musimy odwzorować je na odpowiednim miejscu w pamięci.  I tu po małym przekopaniu saperką naszego pliku nagłówka odnajdujemy kolejne ciekawe zakopane głęboko miejsce  gdzie znajdujemy #definesy :

Dokładna analiza doprowadza nas do wniosku że dinozaury wyginęły bowiem … nie nie żartowałem, ale dowiadujemy się że rejestry dla GPIOD znajdują się pod adresem  0x40000C000 w pamięci.  Co dla nas oznacza że powinniśmy bez problemu uzyskać dostęp do poszczególnych rejestrów  w taki bezpośredni sposób:

Dobrze zatem spróbujmy zrobić coś praktycznego by się przekonać o słuszności naszych obserwacji , wniosków i analiz :

>>>  PRAKTYKA …. 

Po tej całej teorii aż dziwnie prawda ??  Ale wydaje mi się że jesteśmy już gotowi na napisanie kodu. Zatem stworzymy sobie 2 proste programiki które będą realizować zadania :

— toglowanie  GPIO

— miganie jedną diodą LED

Oczywiście wiem przecież pokazałem kod na początku , a jednak upieram się byśmy zrobili to jeszcze raz ale nieco inaczej. To jak  pobawimy się ??

No to jazda…

Widzicie pierwszy nasz programik będzie miał za zadanie przełączać stan GPIO na przeciwny tak szybko jak tylko jest to możliwe, z wykorzystaniem domyślnego stanu zerowania mikrokontrolera.  Oczywiście przyda się szybki oscyloskop w celu uwidocznienia i udowodnienia ze nasza aplikacja działa :) Natomiast druki nasz przypadek będzie bezczelnie migał diodą LED :) na płytce… niemniej będzie to wymagać od nas nieco więcej pisania kodu, głównie w celu zapewnienia odpowiednich opóźnień tak byśmy mogli obserwować zmiany stanów pinu gołym okiem.


1. PROGRAM


 

W zasadzie niema w tym programie nic specjalnego i skomplikowanego. Składa się z dwóch części :

  • Inicjalizacji GPIO
  • Pętli przełączającej

No to zobaczmy jak to wygląda :

Proste prawda ??  Zobaczcie jak łatwo zrealizować całość. Jak widać istotą jest uruchomienie i zainicjowanie zegara obwodów peryferyjnych. Potem oczywiście wykonujemy inicjalizację portu GPIO  — tu trzeba wziąć pod uwagę domyślne taktowanie Discovery po resecie. Domyślnie jest to 8MHz , a więc ustawiamy prędkość portu wyjściowego odpowiednio do tego stanu, Co siłą rzeczy prowadzi nas do konfiguracji Pinu PD0 jako wyjście o szybkości 25MHz , bez rezystorów PU / PD.

Widzicie ??  Mam nadzieję że ta część jest jasna :)  zatem czas na pętlę nieskończoną główną. gdzie wykorzystujemy zestaw podzielonego rejestru BSRR  i jak widać  najpierw  wykonujemy SET PIN0 w porcie D , a potem RESET PIN0 :)

Jeśli skompilowaliście program to na oscyloskopie powinniście widzieć przebieg prostokątny o częstotliwości 25Mhz :)

stm32_toogleport

Widzicie ??  Nie  ?? , a no tak … ty i ty … tak tak ty .. nie macie dostępu do oscyloskopu. Nic strasznego właśnie dlatego zrobimy teraz drugi program:)


 

2 POGRAM


 

Nasza płytka STM32F4 Discovery – podobnie jak każda inna Disco zresztą posiada Diody LED na pokładzie , w tym wypadku jest ich aż 4 … i są one dostępne na pinach  12, 13, 14 i 15  Portu D :)

Tak się prezentuje nasza pinologia kolorycznie i tabelarycznie :)

pin Kolor DIODY
12 Zielony
13 Pomarańczowy
14 Czerwony
15 Niebieski

No dobrze czas na nasz kod , którego punktem wyjścia będzie poprzednik, niemniej 25Mhz dla naszego oka to zbyt szybko więc zadbamy tutaj o kilka szczegółów umożliwiających nam obserwację migania diody:)

No i nasz program radośnie miga niebieską diodą  na naszej Discoverce … cóż za radość :)

Całość była bardzo nudna prawda ??  Dla niektórych nawet bardzo…. a tym czasem zobaczcie sami ile się nauczyliście,  Przykład w tych 2ch prostych programikach jakże dennych i beznadziejnych pokazuje podstawowy sposób obsługiwania portów GPIO oraz ich prawidłową konfigurację  łącznie z zainicjowaniem i włączeniem  obwodów czasowych. Co prawda używaliśmy zaledwie , albo aż Portu D niemniej na tej podstawie każdy już teraz nie powinien mieć kłopotów z wykorzystaniem tych technik i umiejętnie rozszerzyć stosowanie GPIO do sterowania zaawansowanymi metodami kontroli różnych urządzeń , no rejestrów przesuwnych i wielu wielu innych…

 

Miłej zabawy ….

 

 

 

Podziel się na:
  • Print
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Mixx
  • Google Bookmarks
  • Blogplay