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.