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
SP5FCS Offline
Adam
*****

Liczba postów: 1,071
Dołączył: 02-02-2009
Post: #112
RE: Programowanie ARM, nauka, środowiska programistyczne IDE
Ryszard, makra generalnie mają za zadanie poprawić czytelność kodu i ułatwić jego modyfikację. Przykład: sterujemy diodą LED.

Klasyczne rozkazy na rejestrach do sterowanie diodą LED wyglądają tak:

Kod:
GPIOG->BSRRL = GPIO_Pin_14;  //1->LED, dioda świeci
GPIOG->BSRRH = GPIO_Pin_14;  //0->LED, dioda gaśnie

Jeśli w dużym programie trafisz na taką linię kodu to bez schematu nie wiesz praktycznie nic.

Kod:
GPIOG->BSRRL = GPIO_Pin_14;

Wiadomo, że zmieniasz stan na nodze procesora i tyle, nawet nie wiesz czy taki rozkaz włącza urządzenie czy wyłącza bo dioda może być podwieszona do zasilania lub do masy. Aby kod był bardziej czytelny należy posługiwać się własnymi nazwami opisującymi sterowane elementy systemu, w tym przypadku LED_RED.

Kod:
#define LED_RED_GPIO        GPIOG
#define LED_RED_RCC        RCC_AHB1Periph_GPIOG
#define LED_RED_PIN         GPIO_Pin_14
#define LED_RED_OFF         LED_RED_GPIO->BSRRH = LED_RED_PIN       //niski stan na pinie
#define LED_RED_ON           LED_RED_GPIO->BSRRL = LED_RED_PIN       //wysoki stan na pinie


Dla naszej diody definiujemy port, zegar taktujący dla portu, maskę pinu oraz makra ON/OFF. W definicji makra jest również zawarta informacja o sposobie włączania diody (zerem czy jedynką). Teraz w programie jak chcesz zapalić LED_RED to nie musisz pamiętać na jakim porcie i pinie masz tą diodę ani tego, że włączanie jest jedynką, po prostu piszesz:

Kod:
LED_RED_ON;    // zamiast: GPIOG->BSRRL = GPIO_Pin_14;

Każdy kto widzi taki rozkaz (makro) od razu wie co on robi, kod jest czytelny a program krótszy i łatwiejszy w pisaniu. Dodatkową zaletą stosowania makr jest bardzo łatwa zmiana konfiguracji sterowania. Jeśli musimy zmienić pin diody z pin_14 na pin_12 to poprawiamy tylko definicję jednego makra bez konieczności szukania w całym kodzie programu.

Makra mogą być również bardziej rozbudowane np. z parametrami.

Kod:
#define _gpio_mode_set(gpio,pin_maska)      gpio->MODER   |= pin_maska       //ustawia tryb pracy pinow na porcie

Mamy zdefiniowane makro do konfiguracji pinów portu. nasz pin_14 dla diody LED_RED może pracować w czterech trybach:

Kod:
//domyślny po resecie INPUT oraz
#define GPIO_14_MODE_OUT    ((uint32_t)0x10000000)
#define GPIO_14_MODE_AF     ((uint32_t)0x20000000)
#define GPIO_14_MODE_ANL    ((uint32_t)0x30000000)

Aby skonfigurować nasz pin dla diody jako wyjście wpisujemy:

Kod:
_gpio_mode_set(GPIOG, GPIO_14_MODE_OUT);  //na rejestrach lub
_gpio_mode_set(LED_RED_GPIO, LED_RED_MODE);  //nazwy symboliczne

Ważne jest aby na początku nie mylić numeru pinu, numeru trybu z maską pinu, maską trybu bo to zupełnie co innego.

73 Adam
25-07-2016 0:13
Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
Odpowiedz 


Wiadomości w tym wątku
RE: Programowanie ARM, nauka, środowiska programistyczne IDE - SP5FCS - 25-07-2016 0:13

Skocz do:


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