Skocz do zawartości

[C] STM32F103 operacje na rejestrach


ozi(pl)

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 😉

Link do komentarza
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.

Link do komentarza
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.

Link do komentarza
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

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.