Opis
W pierwszej kolejności należy wybrać odpowiednie opcje dla GPIO_InitTypeDef. Biblioteka oferuje użytkownikowi 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
Przykład 1
W przykładzie opisze inicjalizację diod wbudowanych. Diody się zapalą po prowizorycznej funkcji delay diody zgasną. Wszystkie dodatkowe informację napisane w komentarzach w programie.
#include "stm32f4xx.h" #include "stm32f4xx_gpio.h" void Delay(void); void LedInit(void); int main(void) { SystemInit(); LedInit(); while(1) { //Zapalenie GPIO_SetBits(GPIOD, GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15); //Opoznienie Delay(); //Zgaszenie GPIO_ResetBits(GPIOD, GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15); //Opoznienie Delay(); } } void LedInit(void) { GPIO_InitTypeDef GPIO_InitDef; //Wlaczenie zegara RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); //Wybranie pinów GPIO_InitDef.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; //Wyjscie jako push-pull GPIO_InitDef.GPIO_OType = GPIO_OType_PP; //Ustawienie pinu jako wyjscie GPIO_InitDef.GPIO_Mode = GPIO_Mode_OUT; //Bez rezystora podciagajacego GPIO_InitDef.GPIO_PuPd = GPIO_PuPd_NOPULL; //Ustawienie czestotliwosci GPIO_InitDef.GPIO_Speed = GPIO_Speed_100MHz; //Wlaczenie lini GPIOD GPIO_Init(GPIOD, &GPIO_InitDef); } void Delay(void) { volatile uint32_t i; for (i = 0; i != 0xFFFFF; i++); }
Przykład 2
Drugi przykład zawiera dodatkowo definicję przycisku i w zależności od jego stanu diody zapalają się lub gasną.
#include "stm32f4xx.h" #include "stm32f4xx_gpio.h" void ButtonInit(void); void LedInit(void); void LedOn(uint16_t led); void LedOff(uint16_t led); int main(void) { SystemInit(); LedInit(); ButtonInit(); while(1) { if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)) { LedOn(GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15); } else { LedOff(GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15); } } } void LedInit(void) { GPIO_InitTypeDef GPIO_InitDef; //Wlaczenie zegara RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); //Wybranie pinów GPIO_InitDef.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; //Wyjscie jako push-pull GPIO_InitDef.GPIO_OType = GPIO_OType_PP; //Ustawienie pinu jako wyjscie GPIO_InitDef.GPIO_Mode = GPIO_Mode_OUT; //Bez rezystora podciagajacego GPIO_InitDef.GPIO_PuPd = GPIO_PuPd_NOPULL; //Ustawienie czestotliwosci GPIO_InitDef.GPIO_Speed = GPIO_Speed_100MHz; //Wlaczenie lini GPIOD GPIO_Init(GPIOD, &GPIO_InitDef); } void ButtonInit(void) { GPIO_InitTypeDef GPIO_InitDef; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); GPIO_InitDef.GPIO_Pin = GPIO_Pin_0; GPIO_InitDef.GPIO_OType = GPIO_OType_PP; //Ustawienie jako wejście GPIO_InitDef.GPIO_Mode = GPIO_Mode_IN; GPIO_InitDef.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitDef.GPIO_Speed = GPIO_Speed_100MHz; GPIO_Init(GPIOA, &GPIO_InitDef); } void LedOn(uint16_t led) { GPIO_SetBits(GPIOD, led); } void LedOff(uint16_t led) { GPIO_ResetBits(GPIOD, led); }