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?

Link to post
Share on other sites

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ć.

Link to post
Share on other sites

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);
}
Link to post
Share on other sites
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

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.

Link to post
Share on other sites

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.

Link to post
Share on other sites

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 !

Link to post
Share on other sites

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? 🙂

Link to post
Share on other sites

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...

Link to post
Share on other sites

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!

Link to post
Share on other sites

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?

Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.