ZL31ARM: zabawa z GPIO w STM32
Program demonstracyjny na początku swojego działania (listing 1) ustawia prędkość taktowania rdzenia oraz inicjalizuje i włącza odpowiednie porty GPIO (w przykładzie są to porty: C oraz B), do linii których podłączono moduły KAmodLED8 (jak na rysunku 1).
List. 1.
//konfigurowanie portow GPIO GPIO_InitTypeDef GPIO_InitStructure; //Porty wyjsciowe GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //wyjscie push-pull GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_Init(GPIOC, &GPIO_InitStructure); //Port B pin 5 jako wejsciowy GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //Wejscie "plywajace" GPIO_Init(GPIOB, &GPIO_InitStructure); //Port C piny 0 oraz 1 jako wejsciowe GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 ; GPIO_Init(GPIOC, &GPIO_InitStructure);
Następnie zaczyna się cykliczne wykonywanie głównej części programu, w którym sprawdzane są stany przycisków joysticka, uaktualniane stałe czasowe odmierzania czasu oraz generowany nowy wzór do wyświetlenia na LED (listing 2).
List. 2.
while (1) { //zapisz nowy stan portu GPIO_Write(GPIOB, KtoryLEDR ); GPIO_Write(GPIOC, KtoryLEDG ); //Odczyt stanu pinu 0 portu C if (GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_0)==0) { LiczDo=LiczDo-10000; //Zwieksz predkosc //Ograniczenie maksymalnej predkosci if(LiczDo<200000) LiczDo=200000; } //Odczyt stanu pinu 1 portu C if (GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_1)==0) { LiczDo=LiczDo+10000; //Zmniejsz predkosc //Ograniczenie minimalnej predkosci if(LiczDo>700000) LiczDo=700000; } if (kierunekLewo) //jesli w lewo, { KtoryLEDR=KtoryLEDR<<1; //przesun pozycje LEDR w lewo KtoryLEDG=KtoryLEDG>>1; //przesun pozycje LEDG w prawo if (KtoryLEDR>=0x8000) //jesli dioda 8 - zmien kierunek { kierunekLewo=FALSE; } } else //jesli w prawo { KtoryLEDR=KtoryLEDR>>1; //przesun pozycje LEDR w prawo KtoryLEDG=KtoryLEDG<<1; //przesun pozycje LEDG w lewo if (KtoryLEDR<=0x0100) //jesli dioda 1 - zmien kierunek { kierunekLewo=TRUE; } } for(i=0; i < LiczDo; i++); //Opoznienie-predkosc LED //Odczyt stanu pinu 5 portu B if (GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5)==0) { for(i=0; i < 2500000; i++); //Opoznienie dla "slow motion" } }
Przykładowy projekt przygotowany w środowisku µVision (Keil/ARM) z kompletem plików źródłowych udostępniamy do pobrania poniżej.