Witaj,
Marku, dlaczego uważasz, że w przykładzie ustawienie pinów jest uproszczone ?
Pamiętaj, aby zapoznać się z dokumentem
ReferenceManual STM32F4 , w którym opisane są peryferia. Nie trzeba czytać i przerabiać całego. Wystarczy zaglądnąć do konkretnego działu, a stanie się jasność.
Pytałeś się o zegary taktujące - informacje na ten temat znaleźć można w rozdziale 6.2
Należy pamiętać, że domyślnie wszystkie peryferia nie związane z rdzeniem są wyłączone i aby je użyć, należy najpierw włączyć im taktowanie.
Diody na naszej płytce Discovery są podłączone do portu GPIOG, do pinów 13 i 14
Kod:
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOGEN; // włączamy taktowanie portu GPIOG
Teraz zaglądniemy do rozdziału 6.3.10 i co widzimy ? Rejestr, za pomocą którego włączamy między innymi taktowanie portów. Jak widzisz, każdy port ma swój bit za to odpowiedzialny.
Kod:
GPIOG->MODER |=GPIO_MODER_MODER13_0 | GPIO_MODER_MODER14_0; // ustawiamy pin 13 i 14 jako wyjście
W rozdziale 8 w/w dokumentu dowiedzieć się można w jakich trybach mogą pracować piny portów, na co wpływają bity konfiguracyjne rejestrów konfiguracyjnych portów. Idąc dalej dojdziemy do rozdziału 8.4, który teraz nas będzie interesował.
Rejestr GPIOx_MODER - ten ustawiamy powyższą linią kodu, a dokładnie bity MODER13 oraz MODER14 jako wyjścia.
Zostały jeszcze do ustawienia GPIOx_OTYPER, GPIOx_OSPEEDR, GPIOx_PUPDR. Zobaczmy najpierw jakie mają wartości domyślne i przeczytajmy to co jest pod tabelką każdego z tych rejestrów:
GPIOx_OTYPER - ustawiony jest domyślnie dla GPIOG jako output push-pull, czyli taki tryb nas interesuje, więc po co dodatkowo ustawiać to co jest ustawione ?
GPIOx_OSPEEDR - ustawiony jest domyślnie dla GPIOG jako low-speed - dla diodek nie trzeba nic przestawiać, bo chyba nie ma dla nich różnicy, czy zbocze będzie bardzo strome, czy będzie trochę pochylone. Świecić będą tak samo !!
GPIOx_PUPDR - tego rejestru też nie ma potrzeby ruszać bo i po co, skoro ustawienie w rejestrze GPIOx_OTYPER jest jako wyjście push-pull, więc dodawanie do tego dodatkowo rezystorów pull-up lub pull-down jest bezcelowe i nieekonomiczne
Kod:
GPIOG->ODR |= GPIO_ODR_ODR_13; //ustawiamy na wyjściu 13 stan wysoki
GPIOx_ODR - rejestr wyjściowy portu. Ważne jest 16 młodszych bitów, które odpowiadają pinom 0..15 danego portu. Odczytując natomiast ten rejestr dostaniemy wartość, która została wpisana !!!
GPIOx_IDR - rejestr tylko do odczytu - odczytując go dostajemy informację o rzeczywistym stanie pinów, nawet jak pracują jako wyjściowe w trybie pull-up lub pull-down, open-drain (ale nie push-pull). Zwierając do masy (stan logiczny 0) lub do Vcc (stan logiczny 1) pin pracujący jako wyjście push-pull prawdopodobnie go uszkodzimy.
Jak więc widzisz, bez podstawowej znajomości dokumentacji i wiedzy jak się po niej poruszać ciężko jest zrozumieć, co jest ustawiane pisząc za pomocą bibliotek HAL, SPL, czy jeszcze innych, które się pojawią. A jak wiesz, w tych bibliotekach, czy jest potrzebne, czy nie i tak się wypełnia całą strukturę i przekazuje ją do funkcji bibliotecznej.