Programowanie STM32 w C++ – trudne początki
Mikrokontroler w wersji „bare metal” czyli bez wgranego systemu operacyjnego można zakupić np.
w Botlandzie: STM32F103RBT6 ARM Cortex M3.
W tej wersji kontroler ma 1 przycisk, jedną diodę i serię wyjść/wejść do programowania.
Oprogramowanie
Dla Windows 10 potrzebujemy 3 programów:
- Konfiguratora STM32: STM32CubeMX
- IDE: STM32CubeIDE – można go pobrać bezpośrednio z konfiguratora STM32CubeMX w ostatniej zakładce (może być alternatywnie Atollic, ale lepiej tamten)
- Sterowniki USB do STMa Digitally signed USB driver for ST-Link/V2, ST-Link/V2-1 and STLINK-V3
Sterowniki najpierw instalujemy, potem dopiero podłączamy urządzenie przez USB.
STM32CubeMX
Teraz projekt tworzymy w programie STM32CubeMx.
Start My project from ST Board (jeśli jest, to lepiej, jeśli nie to „Start project from MCU)
ACCESS TO BOARD SELECTOR tam wybieramy NUCLEO-64 (checkbox po lewej) – i po prawej płytkę STM32F103RBTx – Nucleo-F103RB
Mamy wstępnie skonfigurowane wszystkie porty na tej płytce w C++.
Teraz generujemy projekt przechodzimy dalej. Mamy cztery zakładki
- Pinout & Configuration – tu wybierzemy zegar sprzętowy (lepszy niż wbudowany, jest jako osobny układ na płytce) -> System Core (lewa) -> RCC -> High Speed Clock -> Crystal/Ceramic Resonator, oraz Low Speed – to samo. PO PRAWEJ – wszystkie wejścia i piny konfigurujemy (GPIO i in.), w naszym pierwszym projekcie użyjemy dwóch wyjść i jednego wejścia: wchodzimy w Pinout view. Dla PB8- lewy myszy – GPIO Output. Potem Prawy myszy- Enter user label – externLed (tu przyłączymy buzzer lub diodę). Dalej następny PA5 – lewy myszy – select user label – greenLed, przycisk to B1 na PC13 (tego nie ruszamy).
- Clock configuration jak na rysunku, sygnał wchodzi z kwadratu Input Frequency 8 ->HSE. Przy taktowaniu potem można pominąć PLL CLK (opcjonalnie do rysunku można dać HSE na System Clock Mux, ale do sprawdzenia to jest), klikamy Resolve Clock Issues i gotowe. Teraz mamy zegar zewnętrzny do taktowania układu.
- Project Manager – Project Name : nazwa1 -> Location-wybieramy -> Toolchain STM32CubeIDE (WAŻNE! wybrać IDE). Reszta bez zmian
- Tools – tu można pobrać IDE – polecam z tego miejsca dopiero.
- U góry klikamy GENERATE CODE – można po zainstalowaniu IDE od razu je odpalić
- STM32CubeMX
- PINOUT
- System Core
- SYS
- ustawić MODE- Serial Wire.
- STM32
- buzzer np. taki
- Potencjometr B10K
- Czujnik dźwięku ze złączem AO
- Kable typu męski-męski oraz żeński-żeński (po 50 szt.)
- dioda i opornik (doczytać jaki żeby diody danej nie spalić, może być za duży wtedy słabiej świeci)
- zewnętrzny włącznik
- Płytka prototypowa
- Jeden czujnik do wyboru: dźwięku (na hałas), światła, ruchu, wilgoci – czym chcecie się pobawić. Ma mieć trzy wyprowadzenia: VCC, GND, DO (dane) – najlepiej żeby miał też czwarte złącze AO. Weźcie to,co Wam się przyda
- Dla zaawansowanych*: urządzenie na UART albo SPI np. czujnik RFID, karta radiowa itp. – aby poćwiczyć łączenie peryferiów portem szeregowym
IDE
Teraz uruchamiamy IDE, oparte na Eclipse.
Mój projekt nazywa się SecondTry. Po lewej tam, gdzie spis plików zazwyczaj jest, u góry klikamy na ikonkę tak, aby pojawił się projekt.
Rozwijamy – > SecondTry(projekt) -> Core ->SRC ->main.c
Sercem programu jest pętla while(1) może tam być np. taki kod:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | /* USER CODE BEGIN 3 */ HAL_GPIO_WritePin(externLed_GPIO_Port, externLed_Pin, GPIO_PIN_RESET); //patrz niżej komentarz przy greenLed - tu zmieniliśmy nazwę na externLed przy PB8 w Pinout View- do tego portu podłączamy albo buzzer, albo diodę zewnętrzną jak niżej opisano HAL_Delay(500); HAL_GPIO_WritePin(externLed_GPIO_Port, externLed_Pin, GPIO_PIN_SET); HAL_Delay(500); if (HAL_GPIO_ReadPin(B1_GPIO_Port, B1_Pin) == GPIO_PIN_SET) //wcisniety { HAL_GPIO_WritePin(greenLed_GPIO_Port, greenLed_Pin, GPIO_PIN_RESET); //UWAGA! W programie STM32Cube zmieniłem nazwę diody na greenLed - Pinout - Pinoutview - na PA5 prawy myszy - Enter User Label - greenLed. Może być też inna nazwa (tu wkleić) } else { HAL_GPIO_WritePin(greenLed_GPIO_Port, greenLed_Pin, GPIO_PIN_SET); } } /* USER CODE END 3 */ |
UWAGA – kod zawsze piszemy między USER CODE BEGIN i END – to standard nie gubienia kodu w przypadku modyfikacji w STM32Cube.
Możemy podłączyć zewnęntrzą DIODĘ lub BUZZER (z dowolnego sprzętu) w taki sposób :
wyjście SCL/D15 (ma 3,3V, wyjście GPIO to jest) do urządzenia (nóżka +) a nóżka – do wejścia GND trzy piny niżej
Problem z debuggerem
Program uruchamiamy przez USB na urządzeniu zewnętrznym – prawy klawisz myszy na projekcie „Debug As” -> 1STM32…
Program się skompiluje, wgra na mikrokontroler STM32 i zatrzyma na swoim początku (pauza). Jest teraz czas na odpalenie wszelkich potrzebnych akcesoriów np. terminala COM z podglądem komunikatów z kontrolera.
Teraz wciskamy przycisk PLAY – program ruszy od tego momentu, aby skończyć tryb Debug wciskamy STOP (można też pauzować), powracamy do trybu edytora kompilatora.
W przypadku błędu (gdy program się wgrywa i rusza, ale debugger powraca automatycznie do trybu edytora kompilatora):
1 2 3 4 | Target is not responding retrying Target is not responding retrying Connection lost |
Trzeba skonfigurować do debugowania peryferium
Co się przyda
Film z uruchomienia STM32CubeMX i STM32CubeIDE
c.d.n.