STM32F030:GPIO

Z kiwiki
Prejsť na: navigácia, hľadanie

Obsah

General Purpose Input Output

Mikrokontrolér STMF030C4 má k dispozícii 13 GPIO pinov, ktoré možno použiť ako štandardné V/V porty, alebo ako alternatívne funkcie. Funkcie priradené k pinom sú v nasledujúcej tabuľke:

Pin AF0 AF1 AF2 AF3 AF4 AF5 AF6
PA0 - USART_1_CTS - - - - -
PA1 EVENTOUT USART1_RTS - - - - -
PA2 - USART1_TX - - - - -
PA3 - USART1_RX - - - - -
PA4 SPI1_NSS USART1_CK - - TIM14_CH1 - -
PA5 SPI1_SCK - - - - - -
PA6 SPI1_MISO TIM3_CH1 TIM1_BKIN - - TIM16_CH1 EVENTOUT
PA7 SPI1_MOSI TIM3_CH2 TIM1_CH1N - TIM14_CH1 TIM17_CH1 EVENTOUT
PA8 MCO USART1_CK TIM1_CH1 EVENTOUT - - -
PA9 - USART1_TX TIM1_CH2 - I2C1_SCL - -
PA10 TIM17_BKIN USART1_RX TIM1_CH3 - I2C1_SDA - -
PA11 EVENTOUT USART1_CTS TIM1_CH4 - - - -
PA12 EVENTOUT USART1_RTS TIM1_ETR - - - -
PA13 SWDIO IR_OUT - - - - -
PA14 SWCLK USART1_TX - - - - -
PA15 SPI1_NSS USART1_RX - EVENTOUT - - -
PB1 TIM14_CH1 TIM3_CH4 TIM1_CH3N - N.A. N.A. N.A


Ako pracovať s GPIO[1]

  1. Pomocou funkcie RCC_AHBPeriphClockCmd() je potrebné povoliť signál časovača AHB, pre konkrétnu bránu (GPIOA, GPIOB)
  2. Pomocou funkcie GPIO_Init() nakonfigurovať GPIO piny. Pre každý pin sú k dispozícii tieto možnosti:
    • Input: Floating, Pull-up, Pull-down.
    • Output: Push-Pull (Pull-up, Pull-down alebo No_Pull), Open Drain (Pull-up, Pull-down alebo No_Pull).
    • Pre výstupné porty je k dispozícii konfigurácia rýchlosti: Low, Medium, Fast alebo High.
    • Alternatívna funkcia: Push-Pull, Open Drain
    • Analog: len v prípade, ak je pin použitý ako vstup pre ADC, DAC prevodník, alebo komparačný vstup.
  3. Alternatívne funkcie
    • Pre ADC, DAC a komparátory je treba požadovaný pin nakonfigurovať pomocou funkcie GPIO_InitStruct->GPIO_Mode = GPIO_Mode_AN
    • Pre ostatné periférne zariadenia:
      • Pomocou funkcie GPIO_PinAFConfig() pripojiť požadovaný pin k alternatívnej funkcii.
      • Pomocou zápisu GPIO_InitStruct->GPIO_Mode = GPIO_Mode_AF nakonfigurovať konkrétny pin ako alternatívnu funkciu.
      • Vybrať typ pripojenia pinu: pull-up/pull-down a rýchlosť zmeny hodnoty pomocou výrazov GPIO_PuPd, GPIO_OType a GPIO_Speed
      • Zavolať funkciu GPIO_Init()
  4. Pre piny nakonfigurované ako vstupy sa hodnota prečíta pomocou funkcie GPIO_ReadInputDataBit()
  5. Pre nastavenie výstupného pinu treba použiť funkcie GPIO_SetBits()/GPIO_ResetBits()
  6. Počas a krátko po resete, alternatícne funkcie nie sú aktívne a GPIO piny sú nakonfigurované ako vstupné v režime "floating"
  7. Piny OSC_IN/OSC_OUT určené pre HSE oscilátor (High Speed External), m§žu byť použité ako GPIO piny PD0 a PD1 ak je HSE vypnutý. Prioritu má ale HSE.

Často používané štruktúry a funkcie

GPIO_InitTypeDef
štruktúra pre nastavenie portu.
typedef struct
{ 
  /** Pin, ktorý sa konfiguruje. Hodnoty: GPIO_Pin_0, GPIO_Pin_1, ... GPIO_Pin_15, GPIO_Pin_All */
  uint32_t GPIO_Pin;          
  /** Špecifikuje režim pinu. Hodnoty: GPIO_Mode_IN (vstup), GPIO_Mode_OUT (výstup), GPIO_Mode_AF (alternatívna funkcia), GPIO_Mode_AN (Analog) */
  GPIOMode_TypeDef GPIO_Mode; 
  /** Definuje rýchlosť zmeny hodnôt na pine. Hodnoty: GPIO_Speed_Level_1 (I/O rýchlosť 2 MHz), GPIO_Speed_Level_2 (10 MHz), GPIO_Speed_Level_3, (50MHz) */
  GPIOSpeed_TypeDef GPIO_Speed;
  /** Úroveň výstupu, resp. správanie sa výstupu. Hodnoty: GPIO_OType_PP (Push-Pull), GPIO_OType_OD (Open Drain - Otvorený kolektor) */
  GPIOOType_TypeDef GPIO_OType;
  /** Definuje správanie sa pinu v režimu Push-Pull. Hodnoty: GPIO_PuPd_NOPULL, GPIO_PuPd_UP (výstup bude držaný na vysokej úrovni), GPIO_PuPd_DOWN (nízka úroveň) */
  GPIOPuPd_TypeDef GPIO_PuPd;
}GPIO_InitTypeDef;
GPIO_Init
funkcia zabezpečujúca nastavenie paramaterov definovaných pomocou štruktúry GPIO_InitTypeDef.
/**
  *         Inicializuje špecifikovanú bránu GPIOx podľa špecifikácie 
  *         defiovanej parametrom GPIO_InitStruct.
  * @param  GPIOx:  x môže byť (A, B, C, D, E or F). Určuje konkrétnu bránu,
  * @param  GPIO_InitStruct: ukazovateľ na štruktúru GPIO_InitTypeDef ktorá obsajuje
  *         konfiguráciu brány.
  */
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
GPIO_PinAFConfig
Konfigurácia alternatícnej funkcie pre piny
/**
  * @param  GPIOx:  x môže byť (A, B, C, D, E or F). Určuje konkrétnu bránu,
  * @pozn.  GPIOC, GPIOD, GPIOE a GPIOF  sú dostupné len pre STM32F072. 
  * @param  GPIO_PinSource: špecifikuje pin pre alternatívnu funkciu
  *         Hodnota tohto parametra: GPIO_PinSourceX, kde X môže byť od 0 do 15 (pre GPIOA, GPIOB, GPIOD, GPIOE)
  *         a (0..12) pre GPIOC a (0, 2..5, 9..10) pre GPIOF.    
  * @param  GPIO_AF: vyberie alternatívnu funkciu. Parameter môže mať hodnoty:
  *            @arg GPIO_AF_0:  WKUP, EVENTOUT, TIM15, SPI1, TIM17, MCO, SWDAT, SWCLK,
  *                             TIM14, BOOT, USART1, CEC, IR_OUT, SPI2, TIM3, USART4,
  *                             CAN, USART2, CRS, TIM16, TIM1, TS 
  *            @arg GPIO_AF_1: USART2, CEC, TIM3, USART1, USART2, EVENTOUT, I2C1,
  *                            I2C2, TIM15, SPI2, USART3, TS, SPI1 
  *            @arg GPIO_AF_2: TIM2, TIM1, EVENTOUT, TIM16, TIM17, USB
  *            @arg GPIO_AF_3: TS, I2C1, TIM15, EVENTOUT 
  *            @arg GPIO_AF_4: TIM14, USART4, USART3, CRS, CAN
  *            @arg GPIO_AF_5: TIM16, TIM17, TIM15, SPI2, I2C2
  *            @arg GPIO_AF_6: EVENTOUT
  *            @arg GPIO_AF_7: COMP1 OUT, COMP2 OUT 
  * @pozn   Pin môže byť rovnako konfigurvaný pomocou zápinu GPIO_InitStruct->GPIO_Mode = GPIO_Mode_AF
  */
  void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF)
GPIO_SetBits/GPIO_ResetBits
ovládanie úrovne pinov
/**
  *         Nastaví požadovaný pin na logickú hodnotu 1
  * @param  GPIOx:  x môže byť (A, B, C, D, E or F). Určuje konkrétnu bránu,
  * @param  GPIO_Pin: špecifikuje požadovaný pin
  *         Hodnota môže byť: GPIO_Pin_x kde x je: 0 - 15
  */
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
GPIO_ReadInputDataBit
načítanie hodnoty zo vstupného pinu
/**
  *         Zo špecifikovaného vstupného pinu prečíta hodnotu
  * @param  GPIOx:  x môže byť (A, B, C, D, E or F). Určuje konkrétnu bránu,
  * @param  GPIO_Pin: špecifikuje vstupný pin, z ktorého sa bude čítať hodnota
  * @retval Načítaná hodnota: 0/1, resp. Bit_RESET/Bit_SET
  */
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pi

Príklady

Digitálne výstupy

Zadanie: Vytvoriť jednoduché preblikávanie 2 diód.

Riešenie: Pre riešenie budeme potrebovať 2 porty ako výstupy, na ktorých bude cez rezistor (R = 100..300 Ohm) pripojená LED dióda. V samotnom riešení stačí len nastavovať výstupné piny striedavo na 0 alebo 1. Aby bol výsledok vidieť, spomalíme ho. Definujme si funkciu delay(n), ktorá bude n krát robiť "nič". To zaberie procesoru určitý čas a pre nás to bude fungovať ako pauza.

Poznámka: Po štarte beží procesor na interných hodinách 8MHz. Od tento frekvencie závisí, aká bude pauza.

#include "stm32f0xx.h"
 
#define LED1 GPIO_Pin_1
#define LED2 GPIO_Pin_14
 
void delay (int a);
void system_init(void);
 
int main(void)
{
    system_init();
    while (1)
    {
        GPIO_SetBits(GPIOA, LED1);
        GPIO_ResetBits(GPIOA, LED2);
        delay(200000);
        GPIO_ResetBits(GPIOA, LED1);
        GPIO_SetBits(GPIOA, LED2);
        delay(200000);
    }
}
 
void system_init(void)
{
    // pustim hodiny na GPIOA
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
    GPIO_InitTypeDef   GPIO_InitStructure;
    // Digitalne vystupy - mozem definovat viac naraz.
    GPIO_InitStructure.GPIO_Pin = LED1|LED2;
    // port budu vystupne
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    // Push-Pull
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    // vystup bude prednastaveny na nizku uroven
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
    // inicializacia portu
    GPIO_Init(GPIOA, &GPIO_InitStructure);
}
 
void delay (int a)
{
    volatile int i,j=0;
    for (i=0 ; i < a ; i++)
    {
        j++;
    }
    return;
}

Digitálne vstupy

Zadanie: Zmodifikuje predchádzajúci príklad tak, že rýchlosť blikania sa zdvojnásobí, ak bude na vstupnom porte jednotkový signál.

Riešenie: Pridáme ďalší port, tentokrát vstupný. Ostatný kód je rovnaký. V hlavnej funkcii pribudol jeden riadok.

#include "stm32f0xx.h"
 
#define LED1 GPIO_Pin_1
#define LED2 GPIO_Pin_14
#define VSTUP GPIO_Pin_2
 
void delay (int a);
void system_init(void);
 
int main(void)
{
    system_init();
    uint8_t k;
    while (1)
    {
        // k bude 0 alebo 1
        k=GPIO_ReadInputDataBit(GPIOA,VSTUP);
        GPIO_SetBits(GPIOA, LED1);
        GPIO_ResetBits(GPIOA, LED2);
        delay(200000/(k+1));
        GPIO_ResetBits(GPIOA, LED1);
        GPIO_SetBits(GPIOA, LED2);
        delay(200000/(k+1));
    }
}
 
void system_init(void)
{
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
 
    GPIO_InitTypeDef   GPIO_InitStructure;
 
    GPIO_InitStructure.GPIO_Pin = LED1|LED2;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
 
    GPIO_InitStructure.GPIO_Pin = VSTUP;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;    // pin bude vstupny
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; // prednastavena hodnota - 0
    GPIO_Init(GPIOA, &GPIO_InitStructure);
}
 
void delay (int a)
{
    volatile int i,j=0;
    for (i=0 ; i < a ; i++)
    {
        j++;
    }
    return;
}

Alternatívne funkcie

Príklad k alternatícnym funkciém bude v ďalších kapitolách: USART, TIM a ďaľšie.

Zdoje a odkazy

  1. STM32F0xx_StdPeriph_Lib_V1.3.1
Osobné nástroje
Menné priestory

Varianty
Operácie
Navigácia
Rýchle linky
Nástroje
Tlačiť/exportovať