# Maple Reference Documentation: GPIO

In addition to any special features or peripheral functions, all of the numbered Maple header pins can function as programmable digital input/output.

The current and voltage limitations have not been copied over from the stm32 datasheet; see that reference linked at the bottom. In particular a number of GPIO pins are 5v tolerant (which means that applying 5v to a pin and reading it as input or allowing it to drain to ground will not damage that pin), while some are not.

- Pin Mapping Mega Table
- GPIO Modes
- Function Reference
- Recommended Reading

## Pin Mapping Mega Table

This huge reference table shows the available functionality on every GPIO pin, by peripheral type. The STM32 pin is the port and number that the header is connected to on the microcontroller.

Pin | STM32 Pin | ADC | Timer | I2C | UART | SPI | 5v OK?
--- | --- | --- | --- | --- | --- | --- | ---
D0 | PA3 | ADC3 | TIM2_CH4 | - | USART2_RX | - | No
D1 | PA2 | ADC2 | TIM2_CH3 | - | USART2_TX | - | No
D2 | PA0 | ADC0 | TIM2_CH1_ETR | - | USART2_CTS | - | No
D3 | PA1 | ADC1 | TIM2_CH2 | - | USART2_RTS | - | No
D4 | PB5 | - | - | ISC1_SMBA | - | - | No
D5 | PB6 | - | TIM4_CH1 | I2C1_SCL | - | - | Yes
D6 | PA8 | - | TIM1_CH1 | - | USART1_CK | - | Yes
D7 | PA9 | - | TIM1_CH2 | - | USART1_TX | - | Yes
D8 | PA10 | - | TIM1_CH3 | - | USART1_RX | - | Yes
D9 | PB7 | - | TIM4_CH2 | I2C1_SDA | - | - | Yes
D10 | PA4 | ADC4 | - | - | USART2_CK | SPI1_NSS | No
D11 | PA7 | ADC7 | TIM3_CH2 | - | - | SPI1_MOSI | No
D12 | PA6 | ADC6 | TIM3_CH1 | - | - | SPI1_MISO | No
D13 | PA5 | ADC5 | - | - | - | SPI1_SCK | No
D14 | PB8 | - | TIM4_CH3 | - | - | - | Yes
Analog header
D15 | PC0 | ADC10 | - | - | - | - | No
D16 | PC1 | ADC11 | - | - | - | - | No
D17 | PC2 | ADC12 | - | - | - | - | No
D18 | PC3 | ADC13 | - | - | - | - | No
D19 | PC4 | ADC14 | - | - | - | - | No
D20 | PC5 | ADC15 | - | - | - | - | No
External header
D21 | PC13 | - | - | - | - | - | No
D22 | PC14 | - | - | - | - | - | No
D23 | PC15 | - | - | - | - | - | No
D24 | PB9 | - | TIM4_CH4 | - | - | - | Yes
D25 | PD2 | - | TIM3_ETR | - | - | - | Yes
D26 | PC10 | - | - | - | - | - | Yes
D27 | PB0 | ADC8 | TIM3_CH3 | - | - | - | No
D28 | PB1 | ADC9 | TIM3_CH4 | - | - | - | No
D29 | PB10 | - | - | I2C2_SCL | USART3_TX | - | Yes
D30 | PB11 | - | - | I2C2_SDA | USART3_RX | - | Yes
D31 | PB12 | - | TIM1_BKIN | I2C2_SMBAL | USART3_CK | SPI2_NSS | Yes
D32 | PB13 | - | TIM1_CH1N | - | USART3_CTS | SPI2_SCK | Yes
D33 | PB14 | - | TIM1_CH2N | - | USART3_RTS | SPI2_MISO | Yes
D34 | PB15 | - | TIM1_CH3N | - | - | SPI2_MOSI | Yes
D35 | PC6 | - | - | - | - | - | Yes
D36 | PC7 | - | - | - | - | - | Yes
D37 | PC8 | - | - | - | - | - | Yes

## GPIO Modes

OUTPUT
  Basic digital output: when the pin set high the voltage is held at +3.3v (Vcc) and when set low it is pulled down to ground.
OUTPUT_OPEN_DRAIN
  In open drain mode, the pin indicates "low" by accepting current flow to ground and "high" by providing increased impedance. An example use would be to connect a pin to a bus line (which is pulled up to a positive voltage by a separate supply through a large resistor). When the pin is high, not much current flows through to ground and the line stays at positive voltage; when the pin is low the bus "drains" to ground with a small amount of current constantly flowing through the large resistor from the external supply. In this mode no current is ever actually /sourced/ from the pin.
INPUT (or INPUT_FLOATING)
  Basic digital input. The pin voltage is sampled; when it is closer to 3.3v (Vcc) the pin status is high, and when it is closer to 0v (ground) it is low. If no external circuit is pulling the pin voltage to high or low, it will tend to randomly oscillate and be very sensitive to noise (eg a breath of air across the pin will cause the state to flip).
INPUT_PULLUP
  The state of the pin in this mode is reported the same way as with INPUT, but the pin voltage is gently "pulled up" towards +3.3v. This means the state will be high unless an external device is specifically pulling the pin down to ground, in which case the "gentle" pull up will not effect the state of the input.
INPUT_PULLDOWN
  The state of the pin in this mode is reported the same way as with INPUT, but the pin voltage is gently "pulled down" towards 0v. This means the state will be low unless an external device is specifically pulling the pin up to 3.3v, in which case the "gentle" pull down will not effect the state of the input.
INPUT_ANALOG
  This is a special mode for when the pin will be used for analog (not digital) reads. See the ADC page.
PWM
  This is a special mode for when the pin will be used for PWM output (a special case of digital output). See the PWM page.

## Function Reference

`pinMode(pin_number, MODE)`
  Usually called from within `setup()` to configure the pin. `MODE` is one of the set listed above.
`digitalRead(pin_number)`
  Returns 0 (low) or 1 (high).
`digitalWrite(pin_number, value))`
  Sets the pin to high (1) or low (0).

## Recommended Reading

- STMicro documentation for STM32F103RB microcontroller:
  - All
  - Datasheet (pdf)
  - Reference Manual (pdf)

### About this Document

A more recent version of this document may be available from the LeafLabs website. Our documentation is versioned on github; you can track changes to the master branch at this link.

This documentation is released under a Creative Commons Attribution-Share Alike 3.0 license.

Translations are welcomed; give us a ping to make sure we aren't in the process of revising or editing first.