STM32 sterownie GPIO (HAL)

Podstawową rzeczą, którą należy opanować jest sterowanie dowolnym pinem mikrokontrolera.

 

Zacznijmy od wygenerowania projektu w STM32CubeMX, aby móc dopisać własny kod programu i przywitać się ze światem migając zieloną diodą (PA5 - piąty pin portu A) dostępną na płytce Nucleo. Otwieramy ostatnio stworzony projekt w STM32CubeMX. Sprawdzamy pod który pin danego portu podpięta jest dioda LED. Jest to port A, pin 5 czyli PA5. Odszukujemy oznaczenie PA5 w programie STM32CubeMX, gdzie widoczny jest mikrokontroler. Klikamy lewym przycikiem myszy na etykiecie i wybieramy opcję GPIO_Output co oznacza, że wybrany pin będzie wyjściem (GPIO_Input - wejście). Poprawne skonfigurowanie pinu podświetla go na zielono i pozostawia w narożniku pinezkę.

Pin mikrokontrolera STM32 jako wyjście
Rys. 1 Pin mikrokontrolera STM32 jako wyjście

 

W programie będziemy odnosić się do tego pinu posługując się jego identyfikatorem w postaci PA5. Nazwa ta niewiele nam mówi, a jeżeli otworzymy program po kilku miesiącach może być ciężko rozszyfrować co było podłączone, do czego ten pin jest wykorzystany. Dużo prościej jest posługiwać się etykietami pinów. Możemy dowolnie nazwać każdy pin przez co program stanie się czytelniejszy. Dla przykładu nazwę pin 5 portu A jako LED_GREEN.

Klikamy prawym przyciskiem myszy na pinie PA5 mikrokontrolera i wybieramy "Enter User Label". Pozwoli to wpisać dowolną zastępczą nazwę pinu, którą możemy wykorzystać w programie. Pin nazwałem LED_GREEN, ponieważ będzie on odpowiadał za włączenie i wyłączenie zielonej diody LED.

 

Nadanie etykiety dowolnemu pinowi mikrokontrolera
Rys. 2 Nadanie etykiety dowolnemu pinowi mikrokontrolera

Konfiguracja mikrokontrolera jest gotowa. Taktowanie zostawmy domyślne. Można przystąpić do wygenerowania kodu wynikowego i zaimportowania go do posiadanego środowiska. W moim przypadku jest to SW4STM32. Kod generujemy klikając w menu "Project/Generate Code". W zakładce "Project" wpisujemy nazwę projektu (pole "Project Name") i wybieramy IDE. W polu "Toolchain / IDE" wybieramy "SW4STM32". Warto także wybrać odpowiednie dla nas miejsce, w którym zapiszemy wygenerowany projekt ("Project Location"). Zakładkę "Code Generator" pozostawiam bez zmian. Klikamy "OK" i program powienien wygenerować w wybranym przez nas miejscu gotowy kod.

Po zaimportowaniu projektu przechodzimy do pliku "main.c" (w oknie z projektem wybieramy: "Application/User/main.c"), to w nim napiszemy kod odpowiedzialny za miganie diodą LED. Warto przed wykonaniem jakiejś pracy zapisać projekt i zbudować go (skompilować). W tym celu naciskamy "File/Save" następnie klikamy na ikonę "młotka". Jeżeli wszystko przebiegło prawidłowo to u dołu ekranu powinna znaleźć się informacja "Build finished". 

Przygotowanie projektu do pracy
Rys. 3 Przygotowanie projektu do pracy

Plik "main.c" zawiera znaczniki oznaczone:

/* USER CODE BEGIN ... */ /* USER CODE END ... */

Między nimi powinien znaleźć się kod pisany przez użytkownika, ponieważ program STM32CubeMX nie usunie kodu zawartego między tymi określeniami. Wszystko co znajdzie się poza znacznikami to zostanie usunięte przy następnej generacji kodu z CubeMX.

Odszukujemy znaczniki: 

/* USER CODE BEGIN WHILE */

while(1)

{

 

/* USER CODE END WHILE */

Tutaj umieszczamy nasz kod. Powinien wyglądać w ten sposób:

/* USER CODE BEGIN WHILE */

while(1)

{

 /* version 1 */
 /* LED_GREEN_GPIO_Port -> Port A */
 /* LED_GREEN_GPIO_Pin -> Pin 5 */
 /* GPIO_PIN_SET -> 1 */
 /* GPIO_PIN_RESET -> 0 */
 HAL_GPIO_WritePin(LED_GREEN_GPIO_Port,LED_GREEN_Pin,GPIO_PIN_SET);
 HAL_Delay(1000);
 HAL_GPIO_WritePin(LED_GREEN_GPIO_Port,LED_GREEN_Pin,GPIO_PIN_RESET);
 HAL_Delay(1000);

 /* version 2 */
 /* HAL_GPIO_TogglePin(LED_GREEN_GPIO_Port,LED_GREEN_Pin);
 HAL_Delay(1000); */

/* USER CODE END WHILE */

 

O co chodzi ? 

Funkcja HAL_GPIO_WritePin(...) ustawia pin danego portu (podane jako argumenty funkcji) w stanie wysokim (GPIO_PIN_SET) lub niskim (GPIO_PIN_RESET).

Funkcja HAL_GPIO_Delay(1000) wprowadza opóźnienie, dzięki czemu zobaczymy miganie diody LED.

Druga wersja programu jest nieco krótsza, ponieważ wykorzystuje funkcję HAL_GPIO_TogglePin(...) . Funkcja ta zmienia stan pinu danego portu na przeciwny. 0-1-0-1-0...

Program jest gotowy. Można przystąpić do zaprogramowania mikrokontrolera. Wybieramy "Debug", uruchamiamy debbuger i zielona dioda LED dostępna na płytce NUCLEO-F103RB powinna migać.