Skocz do zawartości

Kurs STM32 - #4 - Sterowanie portami GPIO w praktyce


Pomocna odpowiedź

Wcześniej pojawiały się podobne problemy, podobno pomagało zatrzymywanie wszystkich sesji debuggera. Najprościej byłoby odłączyć Nucleo, zrestartować komputer - czy wtedy też jest problem z uruchomieniem programu?

Problem może się pojawiać jeśli uruchomi się jednocześnie kilka programów pod debuggerem. Należy pamiętać o zatrzymywaniu programu (ikonka z czerwonym kwadracikiem w oknie debug). Jeśli program jest uruchamiany bez debuggera, takich problemów nie powinno być.

  • 2 tygodnie później...

Witam,

mam pewien problem ze zmianą kierunku migania linijki LED. Mianowicie po przyciśnięciu przycisku pierwszy raz faktycznie kierunek się zmienia, natomiast po drugim wciśnięciu już nic się nie dzieje i diody migają w kierunku, w którym świeciły po wciśnięciu pierwszy raz przycisku. Wciśnięcie inkrementuje wartość zmiennej kierunek ale nie działa prawdopodobnie warunek na wpisanie zera do zmiennej. Pomoże ktoś ?

#include "stm32f10x.h"

volatile uint32_t timer_ms = 0;
uint32_t i = 0 ;
volatile uint32_t kierunek = 0;

void SysTick_Handler ();
void delay_ms (int time);
void EXTI15_10_IRQHandler();

int main(void)
{
   GPIO_InitTypeDef gpio;
   EXTI_InitTypeDef exti;
   NVIC_InitTypeDef nvic;

   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC, ENABLE);
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

   GPIO_StructInit(&gpio);
   EXTI_StructInit(&exti);

   exti.EXTI_Line = EXTI_Line13;
   exti.EXTI_Mode = EXTI_Mode_Interrupt;
   exti.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
   exti.EXTI_LineCmd = ENABLE;
   EXTI_Init(&exti);

   nvic.NVIC_IRQChannel = EXTI15_10_IRQn;
   nvic.NVIC_IRQChannelPreemptionPriority = 0x00;
   nvic.NVIC_IRQChannelSubPriority = 0x00;
   nvic.NVIC_IRQChannelCmd = ENABLE;
   NVIC_Init(&nvic);

   GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource13);

   gpio.GPIO_Pin = GPIO_Pin_5;
   gpio.GPIO_Mode = GPIO_Mode_Out_PP;
   GPIO_Init(GPIOA, &gpio);

   gpio.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;
   gpio.GPIO_Mode = GPIO_Mode_Out_PP;
   GPIO_Init(GPIOC, &gpio);

   SysTick_Config(SystemCoreClock / 1000);

   while (1)
   {
   	//zmiana kierunku zapalania diód
   	switch (kierunek)
   	    	{
   	    	case 0:
   	        	{
   	        		for ( i = 0 ; i < 10; i++)
   	        		{
   	        			GPIO_SetBits(GPIOC, 1 << i);
   	        			delay_ms(50);
   	        			GPIO_ResetBits(GPIOC, 1 << i);
   	        			if ( i > 10 )
   	            			{
   	            				i=0;
   	            			}
   	        		}
   	            	break;
   	        	}
   	    	case 1:
   	    		{
   	    			for ( i = 0; i < 10; i--)
   	        		{
   	    				GPIO_SetBits(GPIOC, 1 << i);
   	    				delay_ms(50);
   	    				GPIO_ResetBits(GPIOC, 1 << i);
   	    				if ( i <= 0 )
   	    					{
   	    						i = 10;
   	    					}
   	        		}
   	    			break;
   	    		}
   	    	}
   	if ( kierunek > 1)
   	    {
   			kierunek = 0;
   	    }
   }
}

void SysTick_Handler ()
{
if (timer_ms)
{
	timer_ms--;
}
}

void delay_ms (int time)
{
   timer_ms = time;
   while (timer_ms) {};
}

void EXTI15_10_IRQHandler()
{
if (EXTI_GetITStatus(EXTI_Line13)) {
	if (GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13) == 0) {
		GPIO_SetBits(GPIOA, GPIO_Pin_5);
		kierunek ++;
		} else {
		GPIO_ResetBits(GPIOA, GPIO_Pin_5);
		}
}
EXTI_ClearITPendingBit(EXTI_Line13);
}

Vroobee, zanim pójdziemy dalej wytłumacz się proszę z tego fragmentu:

                       for ( i = 0; i < 10; i--) 
                       { 
                             [...]
                           if ( i <= 0 ) 
                               { 
                                   i = 10; 
                               } 
                       } 

Ok. Więc pętla for jak każdy widzi. Pierwsza zapalana jest dioda na pinie o numerze i, odczekanie, zgaszona dioda i sprawdzenie warunku czy zmienna i jest mniejsza od 0. Jak jest to do zmiennej i wpisywana jest 10. Kolejny obieg zmniejszenie wartości zmiennej do 9 i tak w kółko.

Vroobee, raz, że to strasznie pokrętne, bo jak już powinieneś zrobić:

  for ( i = 10; i > 0; i--) 

A dwa, zrobiłeś z for'a pętlę nieskończoną, więc nie ma co się dziwić, że nigdy z niej nie wychodzi i nie reaguje na zmiany 🙂 Sprawdź sobie, czy program kiedykolwiek wychodzi z tej pętli.

Kurde, racja. Zmieniłem tak jak napisałeś i jest gitara 🙂 Wcześniej próbowałem zrobić podobnie tylko że dałem i < 0, uznałem że to zły pomysł bo nie działało i zmieniłem to na i = 0 ; i < 10 ; i--. Znaki robią różnicę 😃

DZIĘKI !

Hm, chyba patrzymy na dwa różne kody. Ja widzę to:

1. W pierwszym przebiegu wartość zmiennej i będzie równa 0.

2. Przed drugim przebiegiem pętli zmienna sterująca zostanie zdekrementowana.

3. Ponieważ jest to zmienna typu uint32_t, to jej wartość będzie już wynosiła 4294967295 (bo przecież nie -1, to jest typ bez znaku).

4. Ponieważ jest to więcej niż 10, drugi przebieg pętli już się nie wykona.

Czy jest jakaś trzecia interpretacja? 🙂

Zgadzam się 🙂 z rozpędu napisałem uint32_t i nie zwróciłem uwagi na to że to nie będzie -1 jak się zdekrementuje. My bad.

Hm, chyba patrzymy na dwa różne kody.

Racja, dzięki za czujność - skupiłem się tylko na tej oryginalnej pętli for 🙂

  • 2 tygodnie później...

Witajcie,

po ogłoszeniu o rozpoczęciu kursu na waszej stronie zbierałem się, żeby kupić płytkę i zacząć na niej coś robić.

Teraz próbuję was nadgonić. Mam nadzieję, że na stare wątki jeszcze zaglądacie 🙂.

W tej chwili rozwiązałem zadanie 4.2 i mam do niego pytanie. Ale najpierw kod:

#include "stm32f10x.h"

int button = 0;



int main(void)
{
GPIO_InitTypeDef gpio;
EXTI_InitTypeDef exti;
NVIC_InitTypeDef nvic;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

gpio.GPIO_Pin = GPIO_Pin_13;
gpio.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOC, &gpio);

GPIO_StructInit(&gpio);
gpio.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|
					GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;
gpio.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOC, &gpio);

GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource13);

EXTI_StructInit(&exti);
exti.EXTI_Line = EXTI_Line13;
exti.EXTI_Mode = EXTI_Mode_Interrupt;
exti.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
exti.EXTI_LineCmd = ENABLE;
EXTI_Init(&exti);

nvic.NVIC_IRQChannel = EXTI15_10_IRQn;
nvic.NVIC_IRQChannelPreemptionPriority = 0x00;
nvic.NVIC_IRQChannelSubPriority = 0x00;
nvic.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&nvic);

while (1)	//dlaczego ta pętla jest tak bardzo ważna?
{
}
}

void EXTI15_10_IRQHandler()
{


if (EXTI_GetITStatus(EXTI_Line13))
{
	button++;

		while (GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13) == 0)
		{

				if (button == 1)
				{
					GPIO_SetBits(GPIOC, GPIO_Pin_0);
				}


				else if (button == 2)
				{
					GPIO_SetBits(GPIOC, GPIO_Pin_1);
				}


				else if (button == 3)
				{
					GPIO_SetBits(GPIOC, GPIO_Pin_2);
				}


				else if (button == 4)
				{
					GPIO_SetBits(GPIOC, GPIO_Pin_3);
				}


				else if (button == 5)
				{
					GPIO_SetBits(GPIOC, GPIO_Pin_4);
				}


				else if (button == 6)
				{
					GPIO_SetBits(GPIOC, GPIO_Pin_5);
				}


				else if (button == 7)
				{
					GPIO_SetBits(GPIOC, GPIO_Pin_6);
				}


				else if (button == 8)
				{
					GPIO_SetBits(GPIOC, GPIO_Pin_7);
				}


				else if (button == 9)
				{
					GPIO_SetBits(GPIOC, GPIO_Pin_8);
				}


				else if (button == 10)
				{
					GPIO_SetBits(GPIOC, GPIO_Pin_9);
				}
			}

		if (GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13) == 1)
			{
				GPIO_ResetBits(GPIOC, GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|
							GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9);
			}

		if (button >= 10)
			{
				button = 0;
			}


	EXTI_ClearITPendingBit(EXTI_Line13);
}
}

Interesuje mnie pętla "while (1) {}". Po jej usunięcie program nie działa. Po przeniesieniu pętli "void EXTI15_10_IRQHandler(){...} " wewnątrz while(1) również wsio się sypie. Czemu tak się dzieje?

Pozdrawiam i z góry dziękuję za odpowiedź.

EDIT:

Poczytałem kod Vroobee i zrozumiałem o co chodzi. W pętli while(1) jest główny program a pod void EXTI15_10_IRQHandler(){...} jest instrukcja przerwania i w niej jest zawarte, co ma się dziać, gdy to przerwanie nastąpi.

czytaj kurs ze zrozumieniem, argens...

Tutaj moja odpowiedź na zadanie 4.3

Ale z tego, co widzę, to i tak nikt już tutaj nie zagląda :/.

#include "stm32f10x.h"

int button = 0;

volatile uint32_t timer_ms = 0;

void SysTick_Handler()
{
if (timer_ms) {
	timer_ms--;
}
}

void delay_ms(int time)
{
timer_ms = time;
while (timer_ms) {};
}

int main(void)
{
   GPIO_InitTypeDef gpio;
   EXTI_InitTypeDef exti;
   NVIC_InitTypeDef nvic;

   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC, ENABLE);
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

   gpio.GPIO_Pin = GPIO_Pin_13;
   gpio.GPIO_Mode = GPIO_Mode_IPU;
   GPIO_Init(GPIOC, &gpio);

   GPIO_StructInit(&gpio);
   gpio.GPIO_Pin = GPIO_Pin_5;
   gpio.GPIO_Mode = GPIO_Mode_Out_PP;
   GPIO_Init(GPIOA, &gpio);

   GPIO_StructInit(&gpio);
   gpio.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|
                       GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;
   gpio.GPIO_Mode = GPIO_Mode_Out_PP;
   GPIO_Init(GPIOC, &gpio);

   GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource13);

   EXTI_StructInit(&exti);
   exti.EXTI_Line = EXTI_Line13;
   exti.EXTI_Mode = EXTI_Mode_Interrupt;
   exti.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
   exti.EXTI_LineCmd = ENABLE;
   EXTI_Init(&exti);

   nvic.NVIC_IRQChannel = EXTI15_10_IRQn;
   nvic.NVIC_IRQChannelPreemptionPriority = 0x00;
   nvic.NVIC_IRQChannelSubPriority = 0x00;
   nvic.NVIC_IRQChannelCmd = ENABLE;
   NVIC_Init(&nvic);

   SysTick_Config(SystemCoreClock / 1000);

   uint32_t led = 0;

   while (1)
   {
   	GPIO_SetBits(GPIOC, 1 << led);
   	delay_ms(150);
   	GPIO_ResetBits(GPIOC, 1 << led);

   	if (++led >= 10) 
   	{
   				led = 0;
   	}
   }
}

void EXTI15_10_IRQHandler()
{
   if (EXTI_GetITStatus(EXTI_Line13))
   {
           if (GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13) == 0)
           {
           	GPIO_SetBits(GPIOA, GPIO_Pin_5); // zapalenie diody
           }

           if (GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13) == 1)
           {
           	GPIO_ResetBits(GPIOA, GPIO_Pin_5); // zgaszenie diody
           }

       EXTI_ClearITPendingBit(EXTI_Line13);
   }
}

/**********************************************************************/

[ Dodano: 29-11-2015, 20:20 ]

Zadanie 4.4 rozwiązałem "łopatologicznie" raz jako zwykła pętla a raz przycisk (przerwanie):

#include "stm32f10x.h"

int button = 0;

volatile uint32_t timer_ms = 0;

void SysTick_Handler()
{
if (timer_ms) {
	timer_ms--;
}
}

void delay_ms(int time)
{
timer_ms = time;
while (timer_ms) {};
}

int main(void)
{
   GPIO_InitTypeDef gpio;
   EXTI_InitTypeDef exti;
   NVIC_InitTypeDef nvic;

   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC, ENABLE);
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

   gpio.GPIO_Pin = GPIO_Pin_13;
   gpio.GPIO_Mode = GPIO_Mode_IPU;
   GPIO_Init(GPIOC, &gpio);

   GPIO_StructInit(&gpio);
   gpio.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|
                       GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;
   gpio.GPIO_Mode = GPIO_Mode_Out_PP;
   GPIO_Init(GPIOC, &gpio);

   GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource13);

   EXTI_StructInit(&exti);
   exti.EXTI_Line = EXTI_Line13;
   exti.EXTI_Mode = EXTI_Mode_Interrupt;
   exti.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
   exti.EXTI_LineCmd = ENABLE;
   EXTI_Init(&exti);

   nvic.NVIC_IRQChannel = EXTI15_10_IRQn;
   nvic.NVIC_IRQChannelPreemptionPriority = 0x00;
   nvic.NVIC_IRQChannelSubPriority = 0x00;
   nvic.NVIC_IRQChannelCmd = ENABLE;
   NVIC_Init(&nvic);

//    uint32_t led = 0;

SysTick_Config(SystemCoreClock / 1000);

   while (1)
   {
   	 GPIO_SetBits(GPIOC, GPIO_Pin_0);	//1
   	 delay_ms(150);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_0);
   	 delay_ms(150);

   	 GPIO_SetBits(GPIOC, GPIO_Pin_0);	//2
    	 GPIO_SetBits(GPIOC, GPIO_Pin_1);
   	 delay_ms(150);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_0);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_1);
   	 delay_ms(150);

   	 GPIO_SetBits(GPIOC, GPIO_Pin_0);	//3
    	 GPIO_SetBits(GPIOC, GPIO_Pin_1);
    	 GPIO_SetBits(GPIOC, GPIO_Pin_2);
   	 delay_ms(150);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_0);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_1);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_2);
   	 delay_ms(150);

   	 GPIO_SetBits(GPIOC, GPIO_Pin_0);	//4
    	 GPIO_SetBits(GPIOC, GPIO_Pin_1);
    	 GPIO_SetBits(GPIOC, GPIO_Pin_2);
    	 GPIO_SetBits(GPIOC, GPIO_Pin_3);
   	 delay_ms(150);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_0);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_1);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_2);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_3);
   	 delay_ms(150);

   	 GPIO_SetBits(GPIOC, GPIO_Pin_0);	//5
    	 GPIO_SetBits(GPIOC, GPIO_Pin_1);
    	 GPIO_SetBits(GPIOC, GPIO_Pin_2);
    	 GPIO_SetBits(GPIOC, GPIO_Pin_3);
    	 GPIO_SetBits(GPIOC, GPIO_Pin_4);
   	 delay_ms(150);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_0);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_1);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_2);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_3);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_4);
   	 delay_ms(150);

   	 GPIO_SetBits(GPIOC, GPIO_Pin_0);	//6
    	 GPIO_SetBits(GPIOC, GPIO_Pin_1);
    	 GPIO_SetBits(GPIOC, GPIO_Pin_2);
    	 GPIO_SetBits(GPIOC, GPIO_Pin_3);
    	 GPIO_SetBits(GPIOC, GPIO_Pin_4);
        GPIO_SetBits(GPIOC, GPIO_Pin_5);
   	 delay_ms(150);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_0);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_1);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_2);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_3);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_4);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_5);
   	 delay_ms(150);

   	 GPIO_SetBits(GPIOC, GPIO_Pin_0);	//7
    	 GPIO_SetBits(GPIOC, GPIO_Pin_1);
    	 GPIO_SetBits(GPIOC, GPIO_Pin_2);
    	 GPIO_SetBits(GPIOC, GPIO_Pin_3);
    	 GPIO_SetBits(GPIOC, GPIO_Pin_4);
        GPIO_SetBits(GPIOC, GPIO_Pin_5);
        GPIO_SetBits(GPIOC, GPIO_Pin_6);
   	 delay_ms(150);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_0);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_1);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_2);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_3);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_4);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_5);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_6);
   	 delay_ms(150);

   	 GPIO_SetBits(GPIOC, GPIO_Pin_0);	//8
    	 GPIO_SetBits(GPIOC, GPIO_Pin_1);
    	 GPIO_SetBits(GPIOC, GPIO_Pin_2);
    	 GPIO_SetBits(GPIOC, GPIO_Pin_3);
    	 GPIO_SetBits(GPIOC, GPIO_Pin_4);
        GPIO_SetBits(GPIOC, GPIO_Pin_5);
        GPIO_SetBits(GPIOC, GPIO_Pin_6);
        GPIO_SetBits(GPIOC, GPIO_Pin_7);
   	 delay_ms(150);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_0);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_1);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_2);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_3);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_4);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_5);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_6);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_7);
   	 delay_ms(150);

    	 GPIO_SetBits(GPIOC, GPIO_Pin_0);	//9
    	 GPIO_SetBits(GPIOC, GPIO_Pin_1);
    	 GPIO_SetBits(GPIOC, GPIO_Pin_2);
    	 GPIO_SetBits(GPIOC, GPIO_Pin_3);
    	 GPIO_SetBits(GPIOC, GPIO_Pin_4);
        GPIO_SetBits(GPIOC, GPIO_Pin_5);
        GPIO_SetBits(GPIOC, GPIO_Pin_6);
        GPIO_SetBits(GPIOC, GPIO_Pin_7);
        GPIO_SetBits(GPIOC, GPIO_Pin_8);
   	 delay_ms(150);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_0);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_1);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_2);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_3);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_4);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_5);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_6);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_7);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_8);
   	 delay_ms(150);

    	 GPIO_SetBits(GPIOC, GPIO_Pin_0);	//10
    	 GPIO_SetBits(GPIOC, GPIO_Pin_1);
    	 GPIO_SetBits(GPIOC, GPIO_Pin_2);
    	 GPIO_SetBits(GPIOC, GPIO_Pin_3);
    	 GPIO_SetBits(GPIOC, GPIO_Pin_4);
        GPIO_SetBits(GPIOC, GPIO_Pin_5);
        GPIO_SetBits(GPIOC, GPIO_Pin_6);
        GPIO_SetBits(GPIOC, GPIO_Pin_7);
        GPIO_SetBits(GPIOC, GPIO_Pin_8);
        GPIO_SetBits(GPIOC, GPIO_Pin_9);
   	 delay_ms(150);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_0);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_1);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_2);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_3);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_4);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_5);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_6);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_7);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_8);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_9);
   	 delay_ms(150);

    	 GPIO_SetBits(GPIOC, GPIO_Pin_1);	//11
    	 GPIO_SetBits(GPIOC, GPIO_Pin_2);
    	 GPIO_SetBits(GPIOC, GPIO_Pin_3);
    	 GPIO_SetBits(GPIOC, GPIO_Pin_4);
        GPIO_SetBits(GPIOC, GPIO_Pin_5);
        GPIO_SetBits(GPIOC, GPIO_Pin_6);
        GPIO_SetBits(GPIOC, GPIO_Pin_7);
        GPIO_SetBits(GPIOC, GPIO_Pin_8);
        GPIO_SetBits(GPIOC, GPIO_Pin_9);
   	 delay_ms(150);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_1);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_2);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_3);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_4);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_5);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_6);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_7);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_8);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_9);
   	 delay_ms(150);

    	 GPIO_SetBits(GPIOC, GPIO_Pin_2);	//12
    	 GPIO_SetBits(GPIOC, GPIO_Pin_3);
    	 GPIO_SetBits(GPIOC, GPIO_Pin_4);
        GPIO_SetBits(GPIOC, GPIO_Pin_5);
        GPIO_SetBits(GPIOC, GPIO_Pin_6);
        GPIO_SetBits(GPIOC, GPIO_Pin_7);
        GPIO_SetBits(GPIOC, GPIO_Pin_8);
        GPIO_SetBits(GPIOC, GPIO_Pin_9);
   	 delay_ms(150);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_2);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_3);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_4);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_5);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_6);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_7);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_8);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_9);
   	 delay_ms(150);

    	 GPIO_SetBits(GPIOC, GPIO_Pin_3);	//13
    	 GPIO_SetBits(GPIOC, GPIO_Pin_4);
        GPIO_SetBits(GPIOC, GPIO_Pin_5);
        GPIO_SetBits(GPIOC, GPIO_Pin_6);
        GPIO_SetBits(GPIOC, GPIO_Pin_7);
        GPIO_SetBits(GPIOC, GPIO_Pin_8);
        GPIO_SetBits(GPIOC, GPIO_Pin_9);
   	 delay_ms(150);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_3);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_4);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_5);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_6);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_7);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_8);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_9);
   	 delay_ms(150);

    	 GPIO_SetBits(GPIOC, GPIO_Pin_4);	//14
        GPIO_SetBits(GPIOC, GPIO_Pin_5);
        GPIO_SetBits(GPIOC, GPIO_Pin_6);
        GPIO_SetBits(GPIOC, GPIO_Pin_7);
        GPIO_SetBits(GPIOC, GPIO_Pin_8);
        GPIO_SetBits(GPIOC, GPIO_Pin_9);
   	 delay_ms(150);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_4);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_5);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_6);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_7);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_8);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_9);
   	 delay_ms(150);

        GPIO_SetBits(GPIOC, GPIO_Pin_5);	//15
        GPIO_SetBits(GPIOC, GPIO_Pin_6);
        GPIO_SetBits(GPIOC, GPIO_Pin_7);
        GPIO_SetBits(GPIOC, GPIO_Pin_8);
        GPIO_SetBits(GPIOC, GPIO_Pin_9);
   	 delay_ms(150);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_5);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_6);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_7);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_8);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_9);
   	 delay_ms(150);

        GPIO_SetBits(GPIOC, GPIO_Pin_6);	//16
        GPIO_SetBits(GPIOC, GPIO_Pin_7);
        GPIO_SetBits(GPIOC, GPIO_Pin_8);
        GPIO_SetBits(GPIOC, GPIO_Pin_9);
   	 delay_ms(150);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_6);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_7);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_8);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_9);
   	 delay_ms(150);

        GPIO_SetBits(GPIOC, GPIO_Pin_7);	//17
        GPIO_SetBits(GPIOC, GPIO_Pin_8);
        GPIO_SetBits(GPIOC, GPIO_Pin_9);
   	 delay_ms(150);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_7);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_8);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_9);
   	 delay_ms(150);

        GPIO_SetBits(GPIOC, GPIO_Pin_8);	//18
        GPIO_SetBits(GPIOC, GPIO_Pin_9);
   	 delay_ms(150);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_8);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_9);
   	 delay_ms(150);

        GPIO_SetBits(GPIOC, GPIO_Pin_9);	//19
   	 delay_ms(150);
   	 GPIO_ResetBits(GPIOC, GPIO_Pin_9);
   	 delay_ms(150);

/*    	 if (++led >= 10)
   	 {
   		 led = 0;
  	 	 }*/
    }

}


void EXTI15_10_IRQHandler()
{
   if (EXTI_GetITStatus(EXTI_Line13))
   {
       button++;

           while (GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13) == 0)
           {

                   if (button == 1)
                   {
                       GPIO_SetBits(GPIOC, GPIO_Pin_0);
                   }


                   else if (button == 2)
                   {
                   	GPIO_SetBits(GPIOC, GPIO_Pin_0);
                       GPIO_SetBits(GPIOC, GPIO_Pin_1);
                   }


                   else if (button == 3)
                   {
                   	GPIO_SetBits(GPIOC, GPIO_Pin_0);
                   	GPIO_SetBits(GPIOC, GPIO_Pin_1);
                       GPIO_SetBits(GPIOC, GPIO_Pin_2);
                   }


                   else if (button == 4)
                   {
                   	GPIO_SetBits(GPIOC, GPIO_Pin_0);
                   	GPIO_SetBits(GPIOC, GPIO_Pin_1);
                   	GPIO_SetBits(GPIOC, GPIO_Pin_2);
                       GPIO_SetBits(GPIOC, GPIO_Pin_3);
                   }


                   else if (button == 5)
                   {
                   	GPIO_SetBits(GPIOC, GPIO_Pin_0);
                   	GPIO_SetBits(GPIOC, GPIO_Pin_1);
                   	GPIO_SetBits(GPIOC, GPIO_Pin_2);
                   	GPIO_SetBits(GPIOC, GPIO_Pin_3);
                       GPIO_SetBits(GPIOC, GPIO_Pin_4);
                   }


                   else if (button == 6)
                   {
                   	GPIO_SetBits(GPIOC, GPIO_Pin_0);
                   	GPIO_SetBits(GPIOC, GPIO_Pin_1);
                   	GPIO_SetBits(GPIOC, GPIO_Pin_2);
                   	GPIO_SetBits(GPIOC, GPIO_Pin_3);
                   	GPIO_SetBits(GPIOC, GPIO_Pin_4);
                       GPIO_SetBits(GPIOC, GPIO_Pin_5);
                   }


                   else if (button == 7)
                   {
                   	GPIO_SetBits(GPIOC, GPIO_Pin_0);
                   	GPIO_SetBits(GPIOC, GPIO_Pin_1);
                   	GPIO_SetBits(GPIOC, GPIO_Pin_2);
                   	GPIO_SetBits(GPIOC, GPIO_Pin_3);
                   	GPIO_SetBits(GPIOC, GPIO_Pin_4);
                       GPIO_SetBits(GPIOC, GPIO_Pin_5);
                       GPIO_SetBits(GPIOC, GPIO_Pin_6);
                   }


                   else if (button == 8)
                   {
                   	GPIO_SetBits(GPIOC, GPIO_Pin_0);
                   	GPIO_SetBits(GPIOC, GPIO_Pin_1);
                   	GPIO_SetBits(GPIOC, GPIO_Pin_2);
                   	GPIO_SetBits(GPIOC, GPIO_Pin_3);
                   	GPIO_SetBits(GPIOC, GPIO_Pin_4);
                       GPIO_SetBits(GPIOC, GPIO_Pin_5);
                       GPIO_SetBits(GPIOC, GPIO_Pin_6);
                       GPIO_SetBits(GPIOC, GPIO_Pin_7);
                   }


                   else if (button == 9)
                   {
                   	GPIO_SetBits(GPIOC, GPIO_Pin_0);
                   	GPIO_SetBits(GPIOC, GPIO_Pin_1);
                   	GPIO_SetBits(GPIOC, GPIO_Pin_2);
                   	GPIO_SetBits(GPIOC, GPIO_Pin_3);
                   	GPIO_SetBits(GPIOC, GPIO_Pin_4);
                       GPIO_SetBits(GPIOC, GPIO_Pin_5);
                       GPIO_SetBits(GPIOC, GPIO_Pin_6);
                       GPIO_SetBits(GPIOC, GPIO_Pin_7);
                       GPIO_SetBits(GPIOC, GPIO_Pin_8);
                   }


                   else if (button == 10)
                   {
                   	GPIO_SetBits(GPIOC, GPIO_Pin_0);
                   	GPIO_SetBits(GPIOC, GPIO_Pin_1);
                   	GPIO_SetBits(GPIOC, GPIO_Pin_2);
                   	GPIO_SetBits(GPIOC, GPIO_Pin_3);
                   	GPIO_SetBits(GPIOC, GPIO_Pin_4);
                       GPIO_SetBits(GPIOC, GPIO_Pin_5);
                       GPIO_SetBits(GPIOC, GPIO_Pin_6);
                       GPIO_SetBits(GPIOC, GPIO_Pin_7);
                       GPIO_SetBits(GPIOC, GPIO_Pin_8);
                       GPIO_SetBits(GPIOC, GPIO_Pin_9);
                   }


                   else if (button == 11)
                   {
                   	GPIO_SetBits(GPIOC, GPIO_Pin_1);
                   	GPIO_SetBits(GPIOC, GPIO_Pin_2);
                   	GPIO_SetBits(GPIOC, GPIO_Pin_3);
                   	GPIO_SetBits(GPIOC, GPIO_Pin_4);
                       GPIO_SetBits(GPIOC, GPIO_Pin_5);
                       GPIO_SetBits(GPIOC, GPIO_Pin_6);
                       GPIO_SetBits(GPIOC, GPIO_Pin_7);
                       GPIO_SetBits(GPIOC, GPIO_Pin_8);
                       GPIO_SetBits(GPIOC, GPIO_Pin_9);
                   }


                   else if (button == 12)
                   {
                   	GPIO_SetBits(GPIOC, GPIO_Pin_2);
                   	GPIO_SetBits(GPIOC, GPIO_Pin_3);
                   	GPIO_SetBits(GPIOC, GPIO_Pin_4);
                       GPIO_SetBits(GPIOC, GPIO_Pin_5);
                       GPIO_SetBits(GPIOC, GPIO_Pin_6);
                       GPIO_SetBits(GPIOC, GPIO_Pin_7);
                       GPIO_SetBits(GPIOC, GPIO_Pin_8);
                       GPIO_SetBits(GPIOC, GPIO_Pin_9);
                   }


                   else if (button == 13)
                   {
                   	GPIO_SetBits(GPIOC, GPIO_Pin_3);
                   	GPIO_SetBits(GPIOC, GPIO_Pin_4);
                       GPIO_SetBits(GPIOC, GPIO_Pin_5);
                       GPIO_SetBits(GPIOC, GPIO_Pin_6);
                       GPIO_SetBits(GPIOC, GPIO_Pin_7);
                       GPIO_SetBits(GPIOC, GPIO_Pin_8);
                       GPIO_SetBits(GPIOC, GPIO_Pin_9);
                   }


                   else if (button == 14)
                   {
                       GPIO_SetBits(GPIOC, GPIO_Pin_5);
                       GPIO_SetBits(GPIOC, GPIO_Pin_6);
                       GPIO_SetBits(GPIOC, GPIO_Pin_7);
                       GPIO_SetBits(GPIOC, GPIO_Pin_8);
                       GPIO_SetBits(GPIOC, GPIO_Pin_9);
                   }


                   else if (button == 15)
                   {

                       GPIO_SetBits(GPIOC, GPIO_Pin_6);
                       GPIO_SetBits(GPIOC, GPIO_Pin_7);
                       GPIO_SetBits(GPIOC, GPIO_Pin_8);
                       GPIO_SetBits(GPIOC, GPIO_Pin_9);
                   }


                   else if (button == 16)
                   {
                       GPIO_SetBits(GPIOC, GPIO_Pin_7);
                       GPIO_SetBits(GPIOC, GPIO_Pin_8);
                       GPIO_SetBits(GPIOC, GPIO_Pin_9);
                   }


                   else if (button == 17)
                   {
                       GPIO_SetBits(GPIOC, GPIO_Pin_8);
                       GPIO_SetBits(GPIOC, GPIO_Pin_9);
                   }


                   else if (button == 18)
                   {
                       GPIO_SetBits(GPIOC, GPIO_Pin_9);
                   }
               }

           if (GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13) == 1)
               {
                   GPIO_ResetBits(GPIOC, GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|
                               GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9);
               }

           if (button >= 18)
               {
                   button = 0;
               }


       EXTI_ClearITPendingBit(EXTI_Line13);
   }
}

/****************************************************/

Trochę "elegantsza" wersja

#include "stm32f10x.h"

int button = 0;

volatile uint32_t timer_ms = 0;

void SysTick_Handler()
{
if (timer_ms) {
	timer_ms--;
}
}

void delay_ms(int time)
{
timer_ms = time;
while (timer_ms) {};
}

int main(void)
{
   GPIO_InitTypeDef gpio;
   EXTI_InitTypeDef exti;
   NVIC_InitTypeDef nvic;

   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC, ENABLE);
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

   gpio.GPIO_Pin = GPIO_Pin_13;
   gpio.GPIO_Mode = GPIO_Mode_IPU;
   GPIO_Init(GPIOC, &gpio);

   GPIO_StructInit(&gpio);
   gpio.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|
                       GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;
   gpio.GPIO_Mode = GPIO_Mode_Out_PP;
   GPIO_Init(GPIOC, &gpio);

   GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource13);

   EXTI_StructInit(&exti);
   exti.EXTI_Line = EXTI_Line13;
   exti.EXTI_Mode = EXTI_Mode_Interrupt;
   exti.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
   exti.EXTI_LineCmd = ENABLE;
   EXTI_Init(&exti);

   nvic.NVIC_IRQChannel = EXTI15_10_IRQn;
   nvic.NVIC_IRQChannelPreemptionPriority = 0x00;
   nvic.NVIC_IRQChannelSubPriority = 0x00;
   nvic.NVIC_IRQChannelCmd = ENABLE;
   NVIC_Init(&nvic);

   uint32_t i = 0;

SysTick_Config(SystemCoreClock / 1000);

   while (1)
   {
  		for ( i = 0 ; i < 10; i++)
  		{
  			GPIO_SetBits(GPIOC, 1 << i);
  			delay_ms(200);

           if ( i > 10 )
           {
               i=0;
           }
	}

      	for (i = 0; i < 10; i++)
       {
      		GPIO_ResetBits(GPIOC, 1 << i);
         	delay_ms(200);
       }
   }
}

o to w tym zadaniu chodziło?

Pozdrawiam!

Witajcie,

tak sie zastanawiam, odnośnie funkcji konfiguracyjnej timer "SysTick_Config(SystemCoreClock / 1000);". Czy to przypadkiem nie jest błąd, że tutaj przerwanie wykona się co 1ms?

Przecież analizując to, wynika jasno, że skoro zdefiniowanie SystemCoreClock na wartość 65MHz i następnie podzielenie jej przez 1000, to otrzymamy 65kHz. Idąc dalej tym tropem, czas po jakim nastąpi przerwanie będzie równy ~16ms.

Dochodząc do sedna, czy to mój błąd analizy, czy po prostu ta funkcja jest tak "inteligentna", ze dzieląc wartość taktowania rdzenia przez tysiąc, funkcja potem odtworzy sobie przez ile podzieliliśmy i na postawie tego, ten tysiąc w rzeczywistości oznacza 1ms?

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...