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:

  1. Konfiguratora STM32: STM32CubeMX
  2. IDE: STM32CubeIDE – można go pobrać bezpośrednio z konfiguratora STM32CubeMX w ostatniej zakładce (może być alternatywnie Atollic, ale lepiej tamten)
  3. 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.
wybór płytki STM32
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

  1. 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).
    Pinout
  2. 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.
    Clock
  3. Project Manager – Project Name : nazwa1 -> Location-wybieramy -> Toolchain STM32CubeIDE (WAŻNE! wybrać IDE). Reszta bez zmian
  4. Tools – tu można pobrać IDE – polecam z tego miejsca dopiero.
  5. U góry klikamy GENERATE CODE – można po zainstalowaniu IDE od razu je odpalić
  6. 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.
    Clock

    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

    1. STM32CubeMX
    2. PINOUT
    3. System Core
    4. SYS
    5. ustawić MODE- Serial Wire.

    Co się przyda

    1. STM32
    2. buzzer np. taki
    3. Potencjometr B10K
    4. Czujnik dźwięku ze złączem AO
    5. Kable typu męski-męski oraz żeński-żeński (po 50 szt.)
    6. dioda i opornik (doczytać jaki żeby diody danej nie spalić, może być za duży wtedy słabiej świeci)
    7. zewnętrzny włącznik
    8. Płytka prototypowa
    9. 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
    10. Dla zaawansowanych*: urządzenie na UART albo SPI np. czujnik RFID, karta radiowa itp. – aby poćwiczyć łączenie peryferiów portem szeregowym

    c.d.n.