STM32CUBE + STM32STUDIO: jak używać tych narzędzi?

Otwieramy main.c i mamy przed sobą plik, który będziemy odpowiednio zmieniać dla naszych potrzeb. Najważniejsze jest to, aby wpisywać kod w wyznaczonych miejscach, to znaczy miedzy specjalnie zakomentowanymi miejscami:

Na powyższym zdjęciu widać zmienne, oraz prototypy funkcji, które dodano w odpowiednich miejscach. Można je przepisać do swojego projektu lub przekopiować z dołączonego projektu. Krótkie objaśnienie dodanych zmiennych oraz prototypów funkcji:

#define STLM75_ADDRESS 0x90 – Adres bazowy układu STLM75 (można go wyczytać z dokumentacji shielda KA-NUCLEO-WEATHER)

#define STLM75_REG_TEMP_REGISTER 0x00 – Adres rejestru z którego będziemy odczytywać temperaturę

uint8_t DataTemp = 0; – zmienna w której przechowamy odczytywaną temperaturę

int flagLIGHT; – zmienna pomocnicza do obsługi przerwań

int flagPUSH  =  0; – również zmienna pomocnicza, którą wykrzystamy do obsługi przerwań

Pierwszym prototypem funkcji dodanym do kodu jest

uint8_t STLM75_temp( void );

Jest to funkcja która odczyta wartości temperatury z czujnika STLM75. Aby zobaczyć całą funkcje należy przewinąć kod niżej i znaleźć jej całą definicję, która wygląda następująco:

Po zaznaczeniu funkcji HAL_I2C_MEM_Read(..); można zobaczyć co dokładnie jest do niej przekazywane. Pozwoli to lepiej zrozumieć program. Warto również zapoznać się z pełną dokumentacją czujnika (link).

Kolejna funkcja to:

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);

Jest to funkcja która posłuży nam do obsługi przerwań. Jak widać jedynym parametrem który przyjmuje jest  uint16_t GPIO_Pin. Jest to oczywiście pin od którego pochodzi przerwanie, a więc w naszym przypadku któryś z pinów do którego podłączony jest Joystick. Jak widać do obsługi wielu przerwań mamy jedną funkcję, więc aby wiedzieć od jakiego pinu pochodzi przerwanie użyto zwykłych warunków if(){..}. Funkcja w kodzie wygląda następująco:

W dalszej części działanie funkcji będzie bardziej zrozumiałe. Na tę chwilę można wywnioskować, że poruszenie Joysticka w górę ustawia flagLIGHT na wartość “1”, poruszenie w dół ustawia wartość “0”, zaś wciskanie bedzie zmieniać flagPUSH na wartości jej przeciwne (w naszym przypadku po prostu “1” i “0”).

Ostatnie dwie funkcje to:

void STLM75_LIGHT_CONTROL();

void STLM75_LIGHT_OFF();

Pierwsza funkcja służy do bardzo prostej sygnalizacji mierzonej temperatury za pomocą LED-RGB. Jej kod wygląda następująco:

Jak widać jest to bardzo prosta funkcja, opierająca się na trzech warunkach. Pierwszy warunek jest spełniony gdy temperatura czujnika przekroczy  28°C i sprawi, że zapali się dioda czerwona. Kolejny warunek jest spełniony dla temperatur z przedziału <20°C, >28°C i zapala diodę zieloną. Ostatni warunek jest spełniony dla każdej temperatury mniejszej od 20°C i zapala diodę niebieską.

Ostatnia funkcja void STLM75_LIGHT_OFF(); służy do zgaszenia wszystkich diod:


Przyjrzyjmy się sposobie w jaki diody są zapalane/gaszone. Z dokumentacji można przeczytać, że diody są zapalane gdy na liniach GPIO jest stan niski(“0”). Analogicznie wnioskujemy, że będą gaszone stanem wysokim(“1”). Funkcja HAL_GPIO_WritePin przyjmuje trzy parametry, o których można przeczytać najeżdżając na funkcję kursorem:

Pierwszy parametr to port na którym umieszczony jest pin, którym chcemy sterować. Kolejny parametr to już konkretny pin, a ostatni parametr to wartość jaką chcemy podać na ten pin.

Nasuwa się pytanie “skąd znamy te parametry?”. Oczywiście można je wyczytać z dokumentacji, ale łatwiej będzie się posłużyć tym co daje nam CubeMX. Przejdźmy do sekcji automatycznie wygenerowanej przez CubeMX, w której zawarte są informacje o skonfigurowanym przez nas GPIO.


Widzimy tutaj jak zostały nazwane piny służące do obsługi LED-RGB i odpowiadające im porty. LED_R oraz LED_G są na wspólnym porcie GPIOA, zaś LED_B na osobnym porcie GPIOB, który dla wygody został przez CubeMX nazwany LED_B_GPIO_Port.

Ostatnią rzeczą jaką należy umieścić w kodzie programu to kilka prostych warunków w nieskończonej pętli

while(1){..} znajdującej się w funkcji

int main(void){..} naszego programu.

Warunki te przedstawiają się następująco:


Drugi warunek włącza lub wyłącza prostą sygnalizację temperatury za pomocą LED-RGB.Pierwszy warunek będzie warunkować odczytywanie temperatury z czujnika. Gdy flagPUSH będzie równy “1” temperatura w zmiennej DataTemp będzie na bieżąco aktualizowana. Zmienna flagPUSH będzie zmieniać się przy wciskaniu Joystkicka.

Kod programu jest już gotowy, teraz należy go wgrać na

płytkę. Aby to zrobić wybieramy Run>Run As>STM32..

Jeżeli z jakichś powodów ta opcja by nie zadziałała można projekt wgrać na płytkę poprzez program ST_LINK Utility, którego używaliśmy na samym początku projektu. Aby to zrobić budujemy program w SW4STM32: