wtorek, 25 sierpnia 2015

[1] STM32F4 - Discovery - Inicjalizacja GPIO

Podstawowym elementem w mikrokontrolerach jest poprawna inicjalizacja portów GPIO, W tym poście pokażę jakie są możliwości oraz co można ustawić.

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);
}