Ankieta: Jaki system operacyjnym preferujesz
Ankieta jest zamknięta.
Windows 60.78% 31 60.78%
Linux 31.37% 16 31.37%
MAC/OS 7.84% 4 7.84%
Inny 0% 0 0%
Razem 51 głosów 100%
*) odpowiedź wybrana przez Ciebie [Wyniki ankiety]

Odpowiedz 
 
Ocena wątku:
  • 1 Głosów - 5 Średnio
  • 1
  • 2
  • 3
  • 4
  • 5
Programowanie ARM, nauka, środowiska programistyczne IDE
SQ8MVY Offline
Paweł
****

Liczba postów: 724
Dołączył: 30-07-2011
Post: #96
RE: Programowanie ARM, nauka, środowiska programistyczne IDE
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 rejestrzeAHB1ENR, 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
Kod:
GPIOG-> MODER
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ę.

73 Paweł
(Ten post był ostatnio modyfikowany: 17-07-2016 0:11 przez SQ8MVY.)
16-07-2016 23:15
Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
Odpowiedz 


Wiadomości w tym wątku
RE: Programowanie ARM, nauka, środowiska programistyczne IDE - SQ8MVY - 16-07-2016 23:15

Skocz do:


Użytkownicy przeglądający ten wątek: 4 gości