STM8 na rejestrach dla lamerów

To miejsce dla mało znanych mikrokontrolerów jak ST7, ST8, MSP itd , z wyłączeniem AVR !!
Regulamin forum
W tym miejscu dopuszczalne są wszelkie formy mikrokontrolerów 8/16/24 bitowych , ale nie wolno zamieszczać postów dotyczących mikrokontrolerów AVR , ARDUINO itd ... jest wiele for im poświęconych i wszystkie ATMEGOWE będą definitywnie poddawane dekapitacji.

PISZEMY tylko o mikrokontrolerach:

ST7 , STM8, MSP430 , dsPIC , i innych mało znanych i popularnych
a nawet zapomnianych jak : Z80, 6510 , m68K ...

NIE PISZEMY O POPULARNYCH AVR !!
ODPOWIEDZ
Awatar użytkownika
l3n1n
Moderator
Posty: 216
Rejestracja: 28 paź 2017, 8:46
Lokalizacja: 3M

STM8 na rejestrach dla lamerów

Post autor: l3n1n » 09 lut 2019, 18:25

Zakupiłem sobie w farnell.com płytkę STM8S-Discovery bo sie temat STM8 zrobił modny u nas na forum i na czacie. W związku z tym pomyślałem, ze warto spróbować. No bo co stoi na przeszkodzie?
Płytka przyszła z Farnella fajna i migająca od urodzenia wbudowanym LEDEM. Trochę mi to popsuło zamysły bo co chciałem z tą płytką zrobić na samym początku? Oczywiście zamigać ledem :). A tu masz. On już miga. No ok. Ale spróbuję zrobić to samodzielnie, zmieniając częstotliwość migania itp.
Nefarious19 pięknie opisał temat instalacji Eclipse pod Windowsa więc nie pozostało mi nic innego jako podążyć jego tropem. Nie będę powtarzał tych mądrości które zawiera post mojego mądrego kolegi.
Po zainstalowaniu środowiska przyjrzałem się mojej Disco:

Obrazek

Płytka wygląda elegancko. I posiada własny programator ST-LINK ver.1. Cóż podłączyłem pod mojego Windowsa i... System zrobił mi niespodziankę. Płytka działa, LED miga z różnymi prędkościami w zależności od dotknięcia palcem płytki dotykowej. Każde kolejne dotknięcie płytki powoduje wzrost częstotliwości migania na zasadzie: pierwsza prędkość, druga prędkość, trzecia prędkość, wyłączenie.

https://youtu.be/5XKB1nNZPW0

(Na filmie wychwyciłem niestety tylko trzy fazy, nie wiedzieć czemu :))

Ale w systemie owa płytka została u mnie znaleziona jako urządzenie magazynujące a nie jako programator ST-LINK.
I za żadne skarby nie chciała być widziana inaczej. Próbowałem instalacji sterowników, aktualizacji firmware i dziesiątek innych opcji. Niestety nie chciała ze mną współpracować. Dlatego odłamałem od płytki programator, z wielkim bólem serca, bo nie lubie tego rodzaju dewastacji. I podłączyłem do niej mój zakupiony na Aliexpress programator ST-LINK/2 z wbudowanym złączem SWIM do programowania między innymi właśnie takich maluchów.
Ta operacja w pewnym momencie przyniosła oczekiwane przeze mnie rezultaty i płytka zaczęła ze mną (z systemem) współpracować.
Podłączyłem ją do programatora a programator do USB. Potrzebne było jeszcze zasilanie w związku z tym wykorzystałem konwerter FTDI który akurat miałem pod ręką jako zasilacz :). Wprawdzie prąd jaki otrzymujemy z tego urządzenia nie jest zbyt wielki jednak jak się okazało na moje potrzeby był wystarczający.

Obrazek

No dobra, kwestie sprzętu mamy załatwioną. Spróbujmy wreszcie coś napisać.

Dlaczego na rejestrach? Chciałem zobaczyć jak to będzie. Bez bibliotek, bez otoczki...

Wziąłem notę i popatrzyłem co tam namazali. Zaczynałem od AVR i pamiętałem, że trzeba określić port i pin :). No to spróbujmy. Nota od STM8S-Discovery może nam posłużyć jako przewodnik, gdzie podłączyć złącze SWIM programatora (PIN DATA/SWIM do portu PD1 w segmencie CN4 goldpinów do pina numer 6, RST DO CN1 pin numer 1, GND do CN1 pin numer 5 oraz VCC do CN1 pin numer 7) lub zobaczyć do którego pina jest podłączony LED wbudowany w Disco (port D pin 0) albo gdzie podłączyć zasilanie zewnętrzne (CN1 pin numer 4 podłączamy GND a CN1 pin numer 8 podłączamy 3,3V).
Jeżeli jednak chcemy dowiedzieć się coś więcej o rejestrach to musimy sięgnąć po notę naszego mikrokontrolera.

Na początku zobaczmy jak wygląda z zegarem naszego kontrolera. W nocie na stronie 16 mamy informację:

Obrazek

Jak widać, po resecie uC pracuje z prędkością 2MHz. Aby wykorzystać pełne 16MHz, które daje nam mikrokontrolera należy ustawić we właściwy sposób preskaler. Jak? Oczywiście szukamy w nocie informacji.
Na stronie 35 znajdujemy odpowiednią informację:

Obrazek

Pod adresem 0x00 50C6 mamy rejestr z etykietą CLK_CKDIVR o nazwie Clock divider register. Chcąc pracować z pełną prędkością zegara musimy mu w naszym programie (po każdy restarcie urządzenia) nadać wartość 0.
Teraz szukamy informacji na temat portu i pinu. Wiemy, ze nasz LED jest podłączony do PORT D, do PIN 0. Przeszukujemy notę i na stronie 32 mamy tabelę:

Obrazek

Widzimy informację o interesującym nas porcie D. Nas do naszego przykładu interesują trzy PD_ODR, PD_DDR oraz PD_CR1.
Są to odpowiednio: Port D data output latch register o adresie 0x00 500F (ustawiamy pin jako wyjście), Port D data direction register o adresie 0x00 5011 (ustawiamy kierunek danych), Port D control register 1 o adresie 0x00 5012.

Teraz wystarczy te informacje umieścić w naszym programie.
Definiujemy sobie nazwy rejestrów tak jak się nazywają w tabelce:

Kod: Zaznacz cały

#define CLK_DIV	*(unsigned char*)0x50C6

#define PD_ODR	*(unsigned char*)0x500F 
#define PD_DDR	*(unsigned char*)0x5011
#define PD_CR1	*(unsigned char*)0x5012


unsigned long int delay;

void main()

	{
	// teraz nadajemy im odpowiednie wartości:
	CLK_DIV = 0x00; //ustawiam zegar
	PD_ODR = 0x0;	//ustawiamy stan niski dla całego portu D




	PD_DDR |= 1 << 0; //Ustawiamy pin PD0 jako wyjście
	PD_CR1 |= 1 << 0; //ustawiamy pin PD0 jako PP (push-pool)

	while(1) { PD_ODR ^= 1 << 0;
	for(delay = 0 ; delay < 250000; delay++){}; //tu taki prostacki delajek, który służy nam jako opóźnienie czasowe


	}

}
Kompilujemy....
Wgrywamy...
I działa!

I to by było na tyle. I niech mi powie, że to było coś strasznego :) (poza moim ględzeniem).

Dopiszę jeszcze post jak to zrobić z mikrokontrolerem STM8S103F3. Ale to już osobno bo i płytka inna i jest pewna mała ciekawostka dotycząca udostępnionych na płytce pinów.

gdyby ktoś przypadkiem doczytał do końca a znalazł jakiś błąd lub miał jakieś merytoryczne uwagi proszę o informację, chętnie dokonam poprawek.

Awatar użytkownika
SunRiver
Administrator
Posty: 591
Rejestracja: 08 paź 2017, 11:27
Lokalizacja: Opole
Kontakt:

Re: STM8 na rejestrach dla lamerów

Post autor: SunRiver » 09 lut 2019, 18:45

odpuszczę sobie uwagi , kawał dobrego textu -- zwłaszcza elementy horroru mi się podobały
-- odłamywanie programatora i dewastacja
szkoda że nie było na filmie :)
.... z każdym bitem serca ....
💫SunDUINO
💦GitHUB
💦Google Drive
💦Sotton

Awatar użytkownika
l3n1n
Moderator
Posty: 216
Rejestracja: 28 paź 2017, 8:46
Lokalizacja: 3M

Re: STM8 na rejestrach dla lamerów

Post autor: l3n1n » 10 lut 2019, 11:39

STM8 na rejestrach dla lamerów - ciąg dalszy

Zgodnie z obietnicą walczymy dalej z STM8S. Tym razem wziąłem inny układ na tapetę. Jest to bardzo prościutka płytka z układem STM8S103F3P6. Płytka po za uC posiada gniazdo mini USB, służące jedynie do zasilania układu, przełącznik micro switch oraz diodę LED, która pełni jednak tylko rolę indykatora POWER i nie pozwala na sterowanie przez użytkownika. Poza tym posiada cztery goldpiny wyprowadzające złącze SWIM oraz wyprowadzenie umożliwiające wlutowanie goldpinów (męskich lub żeńskich) z wyjściami GND, VCC VCap, 5V, 3.3V i RST. Oraz GPIO: PA1, PA2, PA3, PB4, PB5, PC3, PC4, PC5, PC6, PC7, PD1, PD2, PD3, PD4, PD5, PD6. Jak widzimy nie ma tego za wiele ale dzięki Alternate Function daje nam dość spore możliwości jak na taka małą płyteczkę.

Obrazek

Obrazek

Jednak jak porównacie tę płytkę z tą, którą zaprezentował Nefarious19 w swoim poście to zauważycie pewną istotną różnicę. A mianowicie dysponuje ona dodatkową diodą LED, która jest oddana do dyspozycji użytkownika, z której to mój szanowny kolega mógł swobodnie skorzystać. Jednak do moich celów nie jest to niezbędne bo chciałbym zaprezentować wam jak skorzystać z udostępnionych pinów. Podłączyłem jak poprzednio płytkę do programatora STM32/V2 i zasiliłem ją tym razem nie przy pomocy konwertera tylko skorzystałem z gniazda mini USB.

Obrazek

No to ok. Przystępujemy do pracy.
Jak się okazuje w przypadku obu mikrokontrolerów czyli stm8s105 i stm8s103 użyte przeze mnie w programie nazwy i adresy rejestrów są identyczne więc nie musimy zbytnio się wysilać. w związku że mam w płytce piny z czterech różnych portów muszę sobie przygotować odpowiednie definicje.

Dla portu A:

Kod: Zaznacz cały


#define PA_ODR	*(unsigned char*)0x5000
#define PA_DDR	*(unsigned char*)0x5002
#define PA_CR1		*(unsigned char*)0x5003
Dla portu B:

Kod: Zaznacz cały

#define PB_ODR	*(unsigned char*)0x5005
#define PB_DDR	*(unsigned char*)0x5007
#define PB_CR1	*(unsigned char*)0x5008
Dla poru C:

Kod: Zaznacz cały

#define PC_ODR	*(unsigned char*)0x500A
#define PC_DDR	*(unsigned char*)0x500C
#define PC_CR1	*(unsigned char*)0x500D
Preskaler jest już ustawiony, we właściwy sposób i ustawienia portu D też mamy przygotowane.

No to teraz podłączamy teraz diodę LED do portu A do pinu PA1. Przygotowuejmy kod:

Kod: Zaznacz cały

#define CLK_DIV	*(unsigned char*)0x50C6

#define PA_ODR	*(unsigned char*)0x5000
#define PA_DDR	*(unsigned char*)0x5002
#define PA_CR1	        *(unsigned char*)0x5003

unsigned long int delay;

void main()

{

	CLK_DIV = 0x00;
	PA_ODR = 0x0;




	PA_DDR |= 1 << 1;
	PA_CR1 |= 1 << 1;

	while(1) { PA_ODR ^= 1 << 1;
	for(delay = 0 ; delay < 250000; delay++){};


}

}
Teraz na tapetę bierzemy port B. Mamy dwa piny z portu B do dyspozycji: PB4 i PB5. Zaczynamy od portu PB4:

Kod: Zaznacz cały

#define CLK_DIV	*(unsigned char*)0x50C6

#define PB_ODR	*(unsigned char*)0x5005
#define	PB_DDR	*(unsigned char*)0x5007
#define PB_CR1	*(unsigned char*)0x5008

unsigned long int delay;

void main()

{

	CLK_DIV = 0x00;
	PB_ODR = 0x0;




	PB_DDR |= 1 << 4;
	PB_CR1 |= 1 << 4;

	while(1) { PB_ODR ^= 1 << 4;
	for(delay = 0 ; delay < 250000; delay++){};


}

}

Kompilujemy, wgrywamy i... nic. Sprawdzamy połączenia i... nadal nic. Zepsuty? No to spróbujmy z portem PB5. Wprowadzamy poprawki programu, sejwujemy, kompilujemy, wgrywamy i... znowu nic. No cóż, nie będę robił z siebie idioty i po prostu sięgnę do noty :).

Notę znajdujemy pod linkiem: https://www.st.com/resource/en/datasheet/stm8s103f2.pdf.

Wciskam ctrl+F i wyszukuję PB4. Znajdujemy na stronie 24 w tabelce opis portów PB4 i PB5.

Obrazek

Widzimy, że w kolumnie Output/PP (push-lull) mamy wyraźny minus przy obydwóch portach. A w kolumnie Output/OD (open drain) wiguruje tajemnicza literka T z odnośnikiem do wyjaśnienia. Pod tabelką znajdujemy pewną informację:

Obrazek

Czyli już wiemy, że piny PB4 i PB5 pracują w trybie Open Drain a Push Pull nie został w ich przypadku zaimplementowany.
No cóż, zamieniamy "nóżki" Leda i podłączamy anodę (dłuższą "nóżkę") do VCC a katodę do PB4 lub PB5 i... dioda LED zaczyna swoją ciężką pracę :).

No cóż, portu C, nie będę już opisywał. Pracuje on tak jak port A i port D. Bez niespodzianek. Wydaje mi się że wszystko jest już jasne.
Nie jest moim zamiarem chwalić się swoja przenikliwością tylko pokazać wam, że posługiwanie się notą nie boli i jest tak naprawdę podstawą.
Wyzwaniem jest przeczytanie RM dla danego mikrokontrolera, ale czasami jest to niezbędne. RM czyli Reference Manual dostępny dla STM8S tu.

Nie wiem, czy ten opis komukolwiek się przyda czy nie, ale dla mnie jest to ciekawy sposób na utrwalenie pewnych informacji i ciekawy trening.
Miłego banglowania pinami :).

Awatar użytkownika
squeez
Użytkownik
Posty: 102
Rejestracja: 16 paź 2017, 23:52

Re: STM8 na rejestrach dla lamerów

Post autor: squeez » 10 lut 2019, 11:51

Zamiast samemu robić memory map (makra dla adresów rejestrów) można skorzystać z gotowca przygotowanego przez ST
https://www.st.com/en/embedded-software ... m8069.html

Ja akurat korzystam z samego stm8s.h reszty bibliotki SPL nie używam ale mrówcza robota jest już zrobiona więc można czas spożytkować na kod :)

Ale jak kto lubi no i samemu pisanie makr do rejestrów zbliża z układem :D

Awatar użytkownika
l3n1n
Moderator
Posty: 216
Rejestracja: 28 paź 2017, 8:46
Lokalizacja: 3M

Re: STM8 na rejestrach dla lamerów

Post autor: l3n1n » 10 lut 2019, 12:44

Oczywiście że można. Jednak jak się chce pojazać podstawy podstaw nie można iść na skróty bo przekaz będzie mniej jasny. Po za tym, tak jak piszesz, studiowanie noty pomaga w lepszym zrozumieniu i poznaniu układu.

Awatar użytkownika
elvis
Użytkownik
Posty: 11
Rejestracja: 30 lis 2018, 17:50

Re: STM8 na rejestrach dla lamerów

Post autor: elvis » 10 lut 2019, 12:55

Tylko dopisz te nieszczęsne volatile. Bo zmienisz opcje lub wersję kompilatora i wszystko przestanie działać. Albo jeszcze ktoś ten kod skopiuje i będzie spamował w połowie sieci że mu nie działa.

Awatar użytkownika
squeez
Użytkownik
Posty: 102
Rejestracja: 16 paź 2017, 23:52

Re: STM8 na rejestrach dla lamerów

Post autor: squeez » 10 lut 2019, 14:01

no fakt volatile się przyda :)

Można też sobie trochę ułatwić życie i zrobić takie "podstawowe" makro:

Kod: Zaznacz cały

#define _SFR(memaddr)     (*(volatile unsigned char *)(0x5000 + (memaddr)))
0x5000 to adres pierwszego rejestru (PA_ODR) i wtedy można od niego liczyć "offset" i tak np.:

Kod: Zaznacz cały

#define PA_ODR    _SFR(0x00)
#define PA_IDR    _SFR(0x01)
#define PA_DDR    _SFR(0x02)
#define PA_CR1    _SFR(0x03)
#define PA_CR2    _SFR(0x04)
i tak dalej :)

Wówczas nie trzeba za każdym razem klepać całego:

Kod: Zaznacz cały

(*(volatile unsigned char *)0x500xx)

ODPOWIEDZ