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.

Technologie End of Life i bezpieczeństwo sieci – wyzwania Europy związane z tzw. długiem technologicznym
Najczęstsze błędy firm przy wyborze dostawcy energii i jak ich uniknąć
Fotorezystor, czyli czujnik światła dwojakiego działania. Przykład innowacji w automatyce i elektronice możliwej dzięki technologii fotooporników 



