niedziela, 4 października 2015

[1] STM32 Nuclo F411RE - Inicjalizacja GPIO I/O

Tym razem przedstawię sposób inicjalizacji portów GPIO, jakie są dostępne w wykorzystywanym prze zemnie mikrokontrolerze. Przedstawię też krótki program pozwalający na obsługę wbudowanego przycisku oraz diody.

Wstęp


W tej wersji Nucleo mamy do wyboru następujące wyprowadzenia kompatybilne z Arduino, oraz wyprowadzenia Morpho. W skład tych drugich wchodzą wszystkie dostępne funkcjonalne wyprowadzenia mikrokontrolera. Rozmieszczenie wszystkich pinów podano na rysunku 1.1. 


Rys. 1.1. Opis wyprowadzeń Nucleo F411RE


Jeśli chodzi o samo programowanie i inicjalizację portów to jest ona taka sama jak w przypadku discovery. Nie mniej jednak przedstawię tutaj jeszcze raz dopuszczalne możliwości, tak dla przypomnienia.

W pierwszej kolejności podaje się komendę GPIO_InitTypeDef. Po niej następujące parametry:

  • GPIO_Pin – Wybranie pinu bądź pinów dla którego zostaną ustawione wybrane parametry.
  • GPIO_Mode – Wybranie sposobu działania pinu.
  • GPIO_OType – Ustawienie trybu wyjściowego.
  • GPIO_PuPd – Wybranie rezystora podciągającego.
  • GPIO_Speed – Wybranie częstotliwości danego pinu.

Dla GPIO_Mode można wybrać następujące parametry:
  • GPIO_Mode_IN – ustawienie pinu jako wejście,
  • GPIO_Mode_OUT – ustawienie pinu jako wyjście,
  • GPIO_Mode_AF – ustawienie pinu (ang. Alterating function) np. dla SPI, USART, I2C,
  • GPIO_Mode_AN – ustawienie pinu jako analogowy, dla ADC lub DAC,

GPIO_OType natomiast ma możliwość wybrania takich parametrów jak:

  • GPIO_OType_PP – wyjście jako push-pull,
  • GPIO_OType_OD – wyjście jako open drain,

GPIO_PuPd:

  • GPIO_PuPd_UP – Wlączenie rezystora podciągającego do zasilania (ang. Pull up resistor).
  • GPIO_PuPd_DOWN – Wlączenie resytora podciągającego do masy (ang. Pull down resistor).
  • GPIO_PuPd_NOPULL – Wyłączenie resystora podciągającego.

Ostatnim parametrem jest częstotliwość linii GPIO_Speed:

  • GPIO_Speed_100MHz
  • GPIO_Speed_50MHz
  • GPIO_Speed_25MHz
  • GPIO_Speed_2MHz

Program


Dioda podłączona jest pod pin PA5, natomiast przycisk podłączono pod PC13. Działanie programu jest, można powiedzieć, standardowe. Po kliknięciu przycisku następuje zapalenie diody.

#include "stm32f4xx.h"
 
void DiodeOn(uint16_t led);
void DiodeOff(uint16_t led);
void DiodeConfig(void);
void ButtonConfig(void);
 
int main(void)
{
 SystemInit();
 DiodeConfig();
 ButtonConfig();
 
    while (1) {
        //Gdy przycisk włączony to zapal diode
     if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13) == 0)
      DiodeOn(GPIO_Pin_5); // zapalenie diody
     else
      DiodeOff(GPIO_Pin_5); // zgaszenie diody
    }
}
 
//Konfiguracja diody wbudowanej PA5
void DiodeConfig(void)
{
    // obiekt gpio z konfiguracja portow GPIO
    GPIO_InitTypeDef gpio; 
 
    // uruchomienie zegara modulu GPIO
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); 
 
    GPIO_StructInit(&gpio); //domyslna konfiguracja
    gpio.GPIO_Pin = GPIO_Pin_5; //konfigurujemy pin 5
    gpio.GPIO_Mode = GPIO_Mode_OUT; //jako wyjscie
    gpio.GPIO_OType = GPIO_OType_PP;
    gpio.GPIO_PuPd = GPIO_PuPd_NOPULL;
    gpio.GPIO_Speed = GPIO_Speed_25MHz;
 
    // inicjalizacja modulu GPIOA
    GPIO_Init(GPIOA, &gpio); 
}
 
//Konfiguracja przycisku
void ButtonConfig(void)
{
    // obiekt gpio z konfiguracja portow GPIO
    GPIO_InitTypeDef gpio; 
    // uruchomienie zegara modulu GPIO
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
 
    GPIO_StructInit(&gpio); //domyslna konfiguracja
    gpio.GPIO_Pin = GPIO_Pin_13; //konfigurujemy pin 13
    gpio.GPIO_Mode = GPIO_Mode_IN; //jako wejscie
    gpio.GPIO_OType = GPIO_OType_PP;
    gpio.GPIO_PuPd = GPIO_PuPd_NOPULL;
    gpio.GPIO_Speed = GPIO_Speed_25MHz;
 
    // inicjalizacja modulu GPIOA
    GPIO_Init(GPIOC, &gpio); 
}
 
//Funkcja odpowiedzialna za zapalenie diody
void DiodeOn(uint16_t led)
{
 GPIO_SetBits(GPIOA, led);
}
 
//Funkcja odpowiedzialna za zgaszenie diody
void DiodeOff(uint16_t led)
{
 GPIO_ResetBits(GPIOA, led);
}
 

W przypadku użycia komendy:

if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13))
    DiodeOn(GPIO_Pin_5); // zapalenie diody

dioda zgaśnie w momencie kliknięcia przycisku.

Bibliografia

[1]            UM1724 User manual - STM32 Nucleo boards