LinkedIn YouTube Facebook
Szukaj

Wstecz
Artykuły

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.