Skocz do zawartości

Rejestry STM32 C011


DeadGeneratio

Pomocna odpowiedź

Dobry wieczór, postanowiłem rozpocząć jakże cudną przygodę z rejestrami w mikrokontrolerach STM32. Z racji, że mam maluszka C011F6P6 stwierdziłem, że będzie idealny do nauki. I odpowiednik programistycznego hello world, miganie diodą mnie przerosło, i nie za bardzo wiem dlaczego. Uruchomiłem linię zegarową, ustawiłem pin PA12 jako wyjście, jako push pull przy prędkości = low speed oraz zadeklarowałem, że nie ma być ani podciągnięte do zasilania ani zaniżone do masy. Potem rozkazałem ustawić to wyjście na stan wysoki, odczekać chwilę w jakże optymalny sposób - nie dotarłem jeszcze do odliczania czasu, i ustawić ponownie stan niski. Niestety dioda ledwo ledwo się zaświeciła, ale nie nazwałbym tego nawet stanem agonalnym po potraktowaniu diody jak by bez rezystora w momencie gdy gaśnie już na zawsze a dosłownie tyci tyci światła. Na oscyloskopie nic nie widać aby wyjście to było załączane, na rysunku pokazałem to. Kod przedstawiam poniżej. W załączniku także datasheet dla mojego mikrokontrolera. Może ktoś wie o co może chodzić?

#include "main.h"

int main(void) {
	//Załączenie lini zegarowej dla GPIOA
	RCC->IOPENR |= (1 << 0); // 0 bit ustawiony na 1

	//Ustawienie PA12 OUTPUT
	GPIOA->MODER |= (1 << 24); // 24 bit ustawiony na jeden
	GPIOA->MODER &= ~(1 << 25); // 25 bit ustawiony na zero

	// Ustawienie PA12 jako Push-pull
	GPIOA->OTYPER |= (1 << 12);

	// Ustawienie PA12 jako low speed
	GPIOA->OSPEEDR |= (1 << 24);
	GPIOA->OSPEEDR &= ~(1 << 25);

	// Ustawienie PA12 jako no pull-up i no pull-down
	GPIOA->PUPDR &= ~(1 << 24);
	GPIOA->PUPDR &= ~(1 << 25);

	//Wejście do nieskończonej pętli
	while (1) {
		//Ustaw PA12 HIGH
		GPIOA->BSRR |= (1 << 12);
		for (uint32_t i = 0; i < 9999999; i++) {
			}

		//Ustaw PA12 LOW
		GPIOA->BSRR |= (1 << 28);
		for (uint32_t i = 0; i < 9999999; i++) {
			}
	}
}

image.thumb.png.8047e3dd04c4ba27a575800f1342386c.png

RM0490 STM32C0x1 Reference manual.pdf

Link do komentarza
Share on other sites

Kiedyś próbowałem (i udało się) zrobić wprawkę-ćwiczenie w postaci "minimalnego" kodu świecącego diodą, ale na płytce STM32L4 i za pomocą kodu w assemblerze. Może jakaś inspiracja: 

https://forbot.pl/forum/topic/23017-programowanie-stm32l4-w-asm-cubeide/?do=findComment&comment=194133

PS. Nie napisałeś, czy kod, który wkleiłeś, jest częścią projektu (CubeIDE?), który zawiera jeszcze cokolwiek

 

Edytowano przez ReniferRudolf
Link do komentarza
Share on other sites

Na tej stronie już byłeś? Nawet typ mikrokontrolera się zgadza. 🤔🙂 

https://msalamon.pl/miganie-dioda-na-stm32-czyli-gpio-output-stm32-na-rejestrach-2/ 

Ja dopiero teraz zauważyłem ten portal 😃, nawet kurs tam jakiś na wiosnę zapowiadają.

W innym miejscu mają artykuł, jak przygotować projekt do w/w przykładu. Dla ścisłości sprawdził/zdebugowałbym dokładnie, czy i jaki kod (zapisy do rejestrów) wykonuje się jeszcze przed Twoją funkcją main().  To tyle pytań pomocniczych w kwestii sprawdzenia, czy po stronie SW wszystko gra.

PS. Przy zapisywaniu rejestru BSRR - operacje "atomowe" - zastosuj (wyjątkowo!) zamiast operatora |=

GPIOA->BSRR |= (1 << 12);

zwykłe przypisanie:

GPIOA->BSRR = (1 << 12);

chociaż to najpewniej na nic nie ma wpływu (autor artykułu sam złapał się na tym, że "na YouTube zrobiłem błąd").

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

Byłem, ale podchodziłem do tego ostrożnie bo rodzina się zgadza ale nie model, tam jest C031 a ja mam C011. Jak wrócę do domu to spróbuję przypisać jedynkę, ale wątpię aby to coś dało. Rano jeszcze sprawdziłem na HALu, z podobnymi ustawieniami dioda miga.

Link do komentarza
Share on other sites

1. Jeśli rodzina się zgadza, to masz bardzo dobry punkt odniesienia.

2. "Przejechanie" debuggerem kodu z HAL-a i wyłapanie wszystkich zapisów do rejestrów z biblioteki HAL - aby mieć wzorzec w postaci sekwencji działającej na Twoim zestawie -  w przypadku tak prostego projektu nie jest aż tak czasochłonne (osobiście to sprawdzałem). Paradoksalnie może to być jedna z najszybszych metod w tym przypadku, jeśli masz całość, która działa. Nawiasem mówiąc, dobrze napisana biblioteka miałaby prostą instrumentację w swoim kodzie, która pozwoliłaby zapisywać np. we wskazanym obszarze pamięci "tablicę-log" wszystkich zapisów do rejestru. Autorzy HAL-a tego nie przewidzieli.

Link do komentarza
Share on other sites

Tak jak myślałem, wpisanie = zamiast |= nic nie zmienia. Porównałem dodatkowo kod, co do przycisków to wygląda on dokładnie tak samo jak na rejestrach. W HALu dodatkowo przy zegarach automatycznie HSI jest uruchamiane. Spróbowałem też to wykonać na rejestrach, napisałem takie coś, ale dalej bez skutku.

// RCC clock control register, HSIKERDIV na 011 - clock divider = 8, strona 118
	RCC->CR |= (1 << 5);
	RCC->CR |= (1 << 6);
	RCC->CR &= ~(1 << 7);

	// RCC clock control register, załączenie HSI, strona 118
	RCC->CR |= (1 << 8);

	// RCC clock control register, HSIDIV na 010 - clock division factor = 4, strona 118
	RCC->CR &= ~(1 << 11);
	RCC->CR |= (1 << 12);
	RCC->CR &= ~(1 << 13);

	//RCC I/O port clock enable register,GPIOA bit 0 na 1, strona 129
	RCC->IOPENR |= RCC_IOPENR_GPIOAEN; // 0 bit ustawiony na 1

	// RCC Clock peripherial register, PWREN bit 28 na 1, strona 131
	RCC->APBENR1 |= (1 << 28);

 

Link do komentarza
Share on other sites

3 godziny temu, DeadGeneratio napisał:

Nie odpowiem, że wszystkie, zdecydowaną większość na pewno. Mogło mi coś umknąć albo nie do końca zrozumiałem przez co nie dopisałem. W załączniku wrzucam oba projekty jeżeli ktoś ma ochotę podejrzeć.

Jakiej optymalizacji używasz? Bo kompilator może ci kraść pętle z kodu. Chociaż to raczej mało prawdopodobne rozwiązanie, bo sygnał byłby po prostu na wyższej częstotliwości niż powinien, ale kto tam wie jak dużą pojemność masz na płytce 😉 

Kod wygląda raczej OK, o ile nie brakuje załączenia jakiegoś durnego zegara (klasyczna wpadka przy ARM'ach) 😄 Masz może schemat / zdjęcie płytki, bo się nagle okaże, że szukamy problemu w złym miejscu.

Edytowano przez H1M4W4R1
  • Lubię! 1
Link do komentarza
Share on other sites

(edytowany)

Model płytki oraz schemat połączeń elektrycznych w załącznikach. Do tego wspomnę, że zasilam płytkę przez 3.3V z StLinka oraz podaje 5V na pin 5V. Do tego wycinek z datasheeta płytki, gpio są bezpośrednio z procesorem połączone więc nie wiedzę potrzeby załączania dodatkowo zegara ahb ani tej drugiej magistrali apb.

WeAct-STM32G0xxC0xxCoreBoard_V10 Board Shape 外形.pdf WeAct-STM32G0xxC0xxCoreBoard_V10 SchDoc.pdf

Screenshot_2023-11-17-20-27-27-11_2c052828f9bc068f981717dba52f469b.jpg

Edytowano przez DeadGeneratio
Link do komentarza
Share on other sites

Treker
Ta treść została wynagrodzona przez moderatora!

DeadGeneratio otrzymał odznakę: "Odkrywca (podanie odp. na własne pytanie)"

Temat rozwiązany - problematyczne było wyjście tylko i wyłącznie PA8. Na dokładnie takim samym kodzie, PA4 jako output spowodowało, że dioda zaczęła mrugać.

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