CPSC 359

Raspberry PI GPIO

PhD Student

Fall 2018

Today

What is GPIO?

Pins on your Raspberry PI (or more generally, a microcontroller) that have no specific function, but are programmable as either input or output

Today

GPIO

You can either configure them as outputs HIGH (3.3v) or LOW (0v).  

You can either configure them as inputs (reads in voltage, returns true if ~3.3v on the pin, false if ~0v on the pin.

How do we interface with GPIO?

Memory Mapped IO!

GPIO

// From GPIO.h
#define MMIO_BASE       0x3F000000
#define GPFSEL0         ((volatile unsigned int *)(MMIO_BASE + 0x00200000))
#define GPFSEL1         ((volatile unsigned int *)(MMIO_BASE + 0x00200004))
#define GPFSEL2         ((volatile unsigned int *)(MMIO_BASE + 0x00200008))
#define GPFSEL3         ((volatile unsigned int *)(MMIO_BASE + 0x0020000C))
#define GPFSEL4         ((volatile unsigned int *)(MMIO_BASE + 0x00200010))
#define GPFSEL5         ((volatile unsigned int *)(MMIO_BASE + 0x00200014))
#define GPSET0          ((volatile unsigned int *)(MMIO_BASE + 0x0020001C))
#define GPSET1          ((volatile unsigned int *)(MMIO_BASE + 0x00200020))
#define GPCLR0          ((volatile unsigned int *)(MMIO_BASE + 0x00200028))
#define GPCLR1          ((volatile unsigned int *)(MMIO_BASE + 0x0020002C))
#define GPLEV0          ((volatile unsigned int *)(MMIO_BASE + 0x00200034))
#define GPLEV1          ((volatile unsigned int *)(MMIO_BASE + 0x00200038))
#define GPEDS0          ((volatile unsigned int *)(MMIO_BASE + 0x00200040))
#define GPEDS1          ((volatile unsigned int *)(MMIO_BASE + 0x00200044))
#define GPREN0          ((volatile unsigned int *)(MMIO_BASE + 0x0020004C))
#define GPREN1          ((volatile unsigned int *)(MMIO_BASE + 0x00200050))
#define GPFEN0          ((volatile unsigned int *)(MMIO_BASE + 0x00200058))
#define GPFEN1          ((volatile unsigned int *)(MMIO_BASE + 0x0020005C))
#define GPHEN0          ((volatile unsigned int *)(MMIO_BASE + 0x00200064))
#define GPHEN1          ((volatile unsigned int *)(MMIO_BASE + 0x00200068))
#define GPLEN0          ((volatile unsigned int *)(MMIO_BASE + 0x00200070))
#define GPLEN1          ((volatile unsigned int *)(MMIO_BASE + 0x00200074))
#define GPAREN0         ((volatile unsigned int *)(MMIO_BASE + 0x0020007C))
#define GPAREN1         ((volatile unsigned int *)(MMIO_BASE + 0x00200080))
#define GPAFEN0         ((volatile unsigned int *)(MMIO_BASE + 0x00200088))
#define GPAFEN1         ((volatile unsigned int *)(MMIO_BASE + 0x0020008C))
#define GPPUD           ((volatile unsigned int *)(MMIO_BASE + 0x00200094))
#define GPPUDCLK0       ((volatile unsigned int *)(MMIO_BASE + 0x00200098))
#define GPPUDCLK1       ((volatile unsigned int *)(MMIO_BASE + 0x0020009C))

These are all registers that control certain aspects of the GPIO pins. You modify them by reading and writing to them.

GPIO

A few important registers:

  • GPFSEL0-GPFSEL5: Specifies the functions of a GPIO pin. 
  • GPSET0-GPSET1: Sets a high value on a GPIO pin
  • GPCLR0-GPCLR1: Sets a low value on a GPIO pin
  • GPLEV0-GPLEV1: Reads a value from a GPIO pin

GPFSEL0 specifies the function of pins 0-9, GPFSEL1 specifies the function of pins 10-19,

GPFSEL0:

GPIO

GPSET0-GPSET1: Sets a high value on a GPIO pin GPSET0 controls GPIO pins 0-31 , GPSET1 controls 32 and above

GPSET0: Bit 0 sets pin 0, Bit 1 sets pin 1

GPSET1: Bit 0 sets pin 32, Bit 1 sets pin 33

GPIO

GPIO

*GPFSEL0 &= ~(0x07 << 21); // Clear out bits 21-23
*GPFSEL0 |= (0x01 << 21); // set bits 21-23 to 0b001

For example, set GPIO 7 as output

*GPCLR0 = (0x1<<7);

For example, set GPIO 7 as low

*GPSET0 = (0x1<<7);

For example, set GPIO 7 as high

Demo

Demo

How to use a breadboard

Demo

How to use a breadboard

How breadboards work: link

How to connect our breadboard: video 

CPSC 359: Pi GPIO

By Joshua Horacsek

CPSC 359: Pi GPIO

  • 1,641