GPIO

General Purpose Input Output (GPIO)

Device Compatibility

Overview

The GPIO interface supports:

  • Pin I/O input
  • Pin I/O output
  • Pin PWM output

Device Pinouts:

References

Below is the overview of the GPIO implementation. Code examples can be found here.

These header files are required to use GPIO.

// Interfaces with GPIO
#include "matrix_hal/gpio_control.h"
// Communicates with MATRIX device
#include "matrix_hal/matrixio_bus.h"
GPIOControl

GPIOControl is a required object that contains functions to interface with GPIO.

// Create GPIOControl object
matrix_hal::GPIOControl gpio;

The functions below are part of GPIOControl.

.Setup

Setup is a function that takes a MatrixIOBus object as a parameter and sets that object as the bus to use for communicating with MATRIX device.

// Function declaration in header file
void Setup(MatrixIOBus *bus);
// Set gpio to use MatrixIOBus bus
gpio.Setup(&bus);
.Banks

Banks is a function that returns a banks_ array of GPIOBank objects.

// Function declaration in header file
GPIOBank &Bank(uint16_t bank) { return banks_[bank]; }
// Returns banks_[index]
gpio.Banks(index);
.SetMode

SetMode is a function that sets GPIO pin(s) to output or input. SetMode is overloaded, and there are two definitions for the function.

For setting single GPIO pin.

// Function declaration in header file
// For setting single GPIO pin
bool SetMode(uint16_t pin, uint16_t mode);
// Sets pin 0 to output
gpio.SetMode(0, 1);
// Sets pin 0 to input
gpio.SetMode(0, 0);

For setting multiple GPIO pins.

// Function declaration in header file
// For setting multiple pins
bool SetMode(unsigned char *pinList, int length, uint16_t mode);
unsigned char inputPinList[8] = {0, 2, 4, 6, 8, 10, 12, 14};
unsigned char outputPinList[8] = {1, 3, 5, 7, 9, 11, 13, 15};

// Sets pins in inputPinList to input
gpio.SetMode(inputPinList, sizeof(inputPinList), 0);
// Sets pins in outputPinList to output
gpio.SetMode(outputPinList, sizeof(outputPinList), 1);
.SetFunction

SetFunction is a function that sets a single GPIO pin to I/O or PWM mode.

// Function declaration in header file
bool SetFunction(uint16_t pin, uint16_t function);
// Sets pin 0 to I/O mode
gpio.SetFunction(0, 0);
// Sets pin 0 to PWM mode
gpio.SetFunction(0, 1);
.GetGPIOValue

GetGPIOValue is a function that returns a GPIO value.

// Function declaration in header file
uint16_t GetGPIOValue(uint16_t pin);
// Gets value of pin 0
bool value = gpio.GetGPIOValue(0);
.GetGPIOValues

GetGPIOValues is a function that returns all GPIO values, each bit of the returned 16bit integer represents a pin.

// Function declaration in header file
uint16_t GetGPIOValues();
// Gets all pin values
uint16_t values = gpio.GetGPIOValues();
.SetGPIOValue

SetGPIOValue is a function that sets a GPIO value.

// Function declaration in header file
bool SetGPIOValue(uint16_t pin, uint16_t value);
// Sets pin 0 to on
gpio.SetGPIOValue(0, 1);
// Sets pin 0 to off
gpio.SetGPIOValue(0, 0);
.SetGPIOValues

SetGPIOValues is a function that sets multiple GPIO values.

// Function declaration in header file
bool SetGPIOValues(unsigned char *pinList, int length, uint16_t value);
unsigned char onPinList[8] = {0, 2, 4, 6, 8, 10, 12, 14};
unsigned char offPinList[8] = {1, 3, 5, 7, 9, 11, 13, 15};

// Sets pins in onPinList to on
gpio.SetGPIOValues(onPinList, sizeof(onPinList), 1);
// Sets pins in offPinList to off
gpio.SetGPIOValues(offPinList, sizeof(offPinList), 0);
.SetPrescaler

SetPrescaler is a function that sets the prescaler for the FPGA clock.

// Function declaration in header file
bool SetPrescaler(uint16_t bank, uint16_t prescaler);
// Set prescaler for bank 0 to 32
// 2^5 = 32
gpio.SetPrescaler(0, 5);
.Set9GServoAngle

Set9GServoAngle is a function that sets a servo angle. It is based on SG90 servo calibration.

// Function declaration in header file
bool Set9GServoAngle(float angle, uint16_t pin);
// Set servo angle to 70 degrees on pin 0
gpio.SetPrescaler(70, 0);
.SetServoAngle

SetServoAngle is a function that sets a servo angle. It is based on the min_pulse_ms entered.

// Function declaration in header file
bool SetServoAngle(float angle, float min_pulse_ms, uint16_t pin);
// Set servo angle to 70 degrees on pin 0
// For a servo that accepts a minimum pulse of 0.8ms
gpio.SetServoAngle(70, 0.8, 0);
.SetPWM

SetPWM is a function that sets a PWM output.

// Function declaration in header file
bool SetPWM(float frequency, float percentage, uint16_t pin);
// Set PWM output to 50Hz, with a 25% duty cycle on pin 0
gpio.SetPWM(50, 25, 0);
GPIOBank

GPIOBank is an object that contains functions to interface with GPIO PWM. GPIOControl contains an array of GPIOBank objects, called banks_

PWM Frequency is set by bank. A bank is a set of 4 pins, starting from pin 0 and going in order. Bank 0 is pin 0-3, Bank 1 is pin 4-7 etc.

The functions below are part of GPIOBank.

.SetPeriod

SetPeriod is a function that sets the PWM period.

// Function declaration in header file
bool SetPeriod(uint16_t period);
// Set PWM period for bank 0 to 50000 FPGA clock ticks
gpio.Banks(0).SetPeriod(50000);
.SetDuty

SetDuty is a function that sets the PWM duty.

// Function declaration in header file
bool SetDuty(uint16_t channel, uint16_t duty);
// Set PWM duty for channel 0 of bank 0 to 10000 FPGA clock ticks
gpio.Banks(0).SetDuty(0, 10000);
.SetupTimer

Under Maintenance

SetupTimer is a function that sets up the timer.

// Function declaration in header file
bool SetupTimer(uint16_t channel, uint16_t init_event, uint16_t final_event);
.GetTimerCounter

Under Maintenance

GetTimerCounter is a function that returns the timer counter.

// Function declaration in header file
uint16_t GetTimerCounter(uint16_t channel);