Witaj,
Aby zrozumieć, o co się w tych nazwach rozchodzi, może zobaczmy do dokumentu, który Rysio przytoczył, czyli en.DM00031020.pdf oraz do pliku
stm32f429xx.h. Plik ten znajduje się w katalogu
CMSIS/device/ w/w projektu. A dlaczego akurat ten plik ? Bo jest bezpośrednio powiązany z mikrokontrolerem, który znajduje się na naszej płytce Discovery. Znajdują się w nim definicje bitów rejestrów, struktury rejestrów peryferii i jeszcze innych ciekawych rzeczy.
RCC (Reset and Control Clock) to tak naprawdę jest cały zestaw rejestrów, które odpowiedzialne są za infrastrukturę zegarową.
Zaglądając do w/w pliku nagłówkowego od linii 711 znajduje się struktura
RCC_TypeDef zawierająca rejestry należące do
RCC. Kolejność rejestrów w strukturze też nie jest przypadkowa. Są one umieszczone w takiej kolejności, w jakiej występują w przestrzeni adresowej naszego stm-a.
Aby się nie zaplątać, nazwy rejestrów są takie same jak w w/w dokumentacji
AHB1ENR jest to nazwa jednego z wielu rejestrów należących do grupy
RCC. A po czym to widać ? Bo znajduje się w strukturze
RCC_TypeDef (plik stm32f429xx.h).
Porównując z dokumentacją, jego dokładny opis znajdziemy w rozdziale 6.3.10 w/w pdf-a. Skoczmy więc do tego rozdziału ! Co tam na samym początku się znajduje ? Taka fajna tabelka z opisem bitów w tym rejestrze. I jak się przyglądniemy to na pozycji bitu nr 6 mamy nasz
GPIOGEN, którym włączamy/wyłączamy taktowanie całego portu G. Ale w programie nie użyliśmy nazwy
GPIOEN, tylko
RCC_AHB1ENR_GPIOGEN. I tu już po samej nazwie możemy wywnioskować, że ów bit
GPIOEN znajduje się w rejestrze
AHB1ENR, który należy do grupy rejestrów
RCC. A definicję tego naszego
RCC_AHB1ENR_GPIOGEN znajdziemy w naszym pliku nagłówkowym stm32f429xx.h w linii 5785.
Nie wkleiłem tu jak wygląda struktura opisująca rejestry
RCC bo za długa jest, ale pozwoliłem sobie wkleić strukturę portów. A wygląda ona tak:
Kod:
typedef struct
{
__IO uint32_t MODER; /*!< GPIO port mode register, Address offset: 0x00 */
__IO uint32_t OTYPER; /*!< GPIO port output type register, Address offset: 0x04 */
__IO uint32_t OSPEEDR; /*!< GPIO port output speed register, Address offset: 0x08 */
__IO uint32_t PUPDR; /*!< GPIO port pull-up/pull-down register, Address offset: 0x0C */
__IO uint32_t IDR; /*!< GPIO port input data register, Address offset: 0x10 */
__IO uint32_t ODR; /*!< GPIO port output data register, Address offset: 0x14 */
__IO uint32_t BSRR; /*!< GPIO port bit set/reset register, Address offset: 0x18 */
__IO uint32_t LCKR; /*!< GPIO port configuration lock register, Address offset: 0x1C */
__IO uint32_t AFR[2]; /*!< GPIO alternate function registers, Address offset: 0x20-0x24 */
} GPIO_TypeDef;
I widzimy jak na dłoni, jakie rejestry są w grupie rejestrów portów. Mamy między innymi wspomniany przez Ciebie Rysio rejestr
MODER, za pomocą którego konfigurujemy jaką funkcję przybierze dany pin - wejście, wyjście, funkcja alternatywna, bądź tryb analogowy. Każdy pin portu w tym rejestrze ma przypisane po dwa bity.
I tu dochodzimy do naszego
MODER13_0. Dokładnie w programie użyte zostało
GPIO_MODER_MODER13_0, które po samej nazwie już mówi, że bity odnoszą się do pinu 13, leżą w rejestrze
MODER, należącym do grupy
GPIO.
No dobrze, a co oznacza ta końcówka
_0 ? Zobaczmy więc do dokumentacji (rozdział 8.4.1) oraz do naszego przytaczanego pliku nagłówkowego (w okolicach linii 4906)....
GPIO_MODER_MODER13_0 -
01 :General purpose output mode
GPIO_MODER_MODER13_1 -
10 :Alternate function mode
GPIO_MODER_MODER13 - 11 : Analog mode
Definicji dla dwóch bitów o wartości 00 nie ma. Raz, że jest to wartość domyślna po resecie, a dwa, że możemy to zrobić np. tak:
Kod:
&= ~GPIO_MODER_MODER13
Zostało to magiczne
GPIOG-> MODER Jak to się je ?? W tym miejscu należy się zapoznać ze strukturami oraz wskaźnikami w języku C.
Zaglądnijmy więc do naszego pliku nagłówkowego - stm32f429xx.h.
Struktura opisująca rejestry portów nazywa się
GPIO_TypeDef Ale jak to, struktura jest jedna, a portów jest kilka, i każdy ma swoje osobne rejestry. Jest na tyle dobrze, że rejestrów dla danego portu jest tyle samo, ułożonych w takiej samej kolejności...
Grzebiąc dalej w naszym pliku nagłówkowym widzimy takie cudo:
Kod:
#define GPIOG_BASE (AHB1PERIPH_BASE + 0x1800U)
Tu już widać przy okazji, że GPIOG wisi na szynie zegarowej AHB1,
oraz
Kod:
#define GPIOG ((GPIO_TypeDef *) GPIOG_BASE)
Oczywiście taka definicja jest nie tylko dla portu GPIOG, ale również i dla pozostałych portów, różniąca się adresem bazowym w przestrzeni adresowej
No to już wiemy co to jest, to nasze
GPIOG. Jest to wskaźnik na strukturę rejestrów portu GPIOG. Pisząc
mówimy, że będziemy się odnosić do rejestru
MODER należącego do portu GPIOG, którego rejestry opisane są w strukturze
GPIO_TypeDef.
Taka sama zasada czytania definicji dotyczy się wszystkich peryferiów, bitów, rejestrów.
Mam nadzieję, że nic nie pomieszałem. Sam się dopiero uczę, więc jeżeli są w tych wypocinach jakieś błędy i nieścisłości, proszę bardziej doświadczonych o korektę.