Skocz do zawartości
ozi(pl)

[C] STM32F103 operacje na rejestrach

Pomocna odpowiedź

Witam!

Jestem początkującym programista i mam lekkie problemy z operacjami na rejestrach czy jest ktoś tutaj z obecnych zajmujący się tym? Ponieważ nie do końca rozumiem pewne rzeczy. Obsługę portów GPIO jakoś już ogarnąłem. Robie kurs stm lecz moj keil nie chcial wczytac gotowych bibliotek takich jak w kursie wiec wzialem do reki referance i zaczalem probowac sam. Udalo mi sie zrobic miganie dioda oraz systick uruchomic -> to ostanie to w sumie najprotsze poniewaz wystarczylo wpisac komende.

Lecz nie wiem czy dobrze skonfigurowałem EXTI i nie wiem jak ruszyc z NVIC. Tak samo czy timery musze uruchomic juz wraz z przerwaniami?

	//WLACZENIE OBSLUGI PRZERWANIA
RCC->APB2ENR |= RCC_APB2ENR_AFIOEN;


//inicjalizacja obslui przerwan EXTI 
//DLA 13 PORTU

AFIO->EXTICR[3]=(1<<13); //WLACZENIE PRZERWANIE NA 13 PIN - NOTA KATALOGOWA
EXTI->IMR  |= (1<<13); //WLACZENIE PRZERWAN NA 13 PINIE
EXTI->RTSR |= (1<<13); //narastajace zbocze
EXTI->FTSR |= (1<<13); //OPADAJACE ZBOCZE

//KONFIGURACJA NVIC 
//tutaj musze znalesc co do konca ustawiac	

to jest moj ładny kod 🙂 na obsluge przerwan lecz nie wiem jak ruszyc NVIC poniewaz w refance nie za bardzo rozpisali sie na ten temat.

void EXTI15_10_IRQHandler(void)
{
	int i;
	EXTI->PR |= (1<<13);// wyzwolenie przerwania po wykryciu przerwania

	if(!(GPIOC->IDR & (1<<13)))
	{
		if (i>2)
		{
			i=0;
		}
		else
				{
					switch (i)
				{
					case 0:
						zapal();
						delay(200);
						zgas();
						break;
					case 1:
						zapal();
						delay(200);
						zgas();
						delay(200);
						zapal();
						delay(200);
						zgas();
						delay(200);
						break;
					case 2:
						zapal();
						delay(200);
						zgas();
						delay(200);
						zapal();
						delay(200);
						zgas();
						delay(200);
						zapal();
						delay(200);
						zgas();
						delay(200);
						break;
					case 3:
						zapal();
						delay(200);
						zgas();
						delay(200);
						zapal();
						delay(200);
						zgas();
						delay(200);
						zapal();
						delay(200);
						zgas();
						delay(200);
						zapal();
						delay(200);
						zgas();
						delay(200);
						break;
				}
		EXTI->PR &=~(1<<13);		

	}
}

to jest moj kod na przerwanie ale nie działa nie wiem dlaczego czy własnie dlatego, ze NVIC jest nie skonfigurowany? doczytalem, ze jestes PR musi byc zerowany po skończeniu przerwania. Zamysl mam taki, ze w main dioda swieci caly czas a po po przerwaniu chcialem by byl licznik to znaczy ze naciskamy raz dioda mrugnie raz dwa razy to dwa razy etc w mainie funkcja dziala a w przerwaniu niestety nie.

if(!(GPIOC->IDR & (1<<13)))

tak samo nie mam pewnosci czy ten zapis jest poprawny tak jak napisaem na poczatku jestem poczatkujacym programista i sam znak & oznacza w tym zapisie, ze "w sumie" czy to jest warunek?

Dziekuje za pomoc 😉

Udostępnij ten post


Link to post
Share on other sites
Zachęcam do przerobienia kursu opartego o bibliotekę StdPeriph - to dużo ułatwia na początek.

Ale jeśli koniecznie chcesz używać rejestrów możesz popatrzeć na mojego nieco zapomnianego bloga: https://stm32pb.blogspot.com/2017/04/odczyt-stanu-wejscia-za-pomoca.html

akurat przypadkiem trafilem na twoj blog 😃 i mam do Ciebie pytanie

NVIC->ISER[EXTI15_10_IRQn/32]=1 << (EXTI15_10_IRQn % 32);

nie rozumiem tego przypisania oraz dlaczego dzielimy na 32?

nastepne mam maly problem jak zrobic obsluge przycisku tak aby w mainie zwiekszal mi licznik. Tzn robie projekt i w main chce aby byl wybor trybu swiecenia a w przerwaniu ikrementowal zmienna np "j". Hmm moze by bylo jasniej. W main jest wybor swiecenia na podstawie klikniec w przycisk. moglbym zrobic prostszym case ale zalezy mi na tym aby po ktoryms tak kliknieciu w main funckja wyswietlania byla caly czas.

Robie sterownik do led adresowalnych.

Udostępnij ten post


Link to post
Share on other sites

Rejestr jest 32-bitowy, stąd dzielenie (i reszta z dzielenia po prawej stronie). Wszystko jest w dokumentacji procesora... Jak już pisałem - na początek polecam użycie bibliotek, wtedy takie niskopoziomowe detale są ukryte w bibliotece.

Udostępnij ten post


Link to post
Share on other sites

Używałem StdPeriph w Keil-u i nie było najmniejszego problemu.

Udostępnij ten post


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