Arduino-GPIO
General Purpose Input/Output (GPIO) library for Arduino
GPIO.h
Go to the documentation of this file.
1 
19 #ifndef HARDWARE_SAM_GPIO_H
20 #define HARDWARE_SAM_GPIO_H
21 
22 #include "Hardware/SAM/Board.h"
23 
30 template<BOARD::pin_t PIN>
31 class GPIO {
32 public:
36  GPIO()
37  {
38  pmc_enable_periph_clk(ID_PIO());
39  SFR()->PIO_PER = MASK;
40  }
41 
46  __attribute__((always_inline))
47  {
48  SFR()->PIO_ODR = MASK;
49  return (*this);
50  }
51 
56  void pullup()
57  __attribute__((always_inline))
58  {
59  SFR()->PIO_PUER = MASK;
60  }
61 
65  void output()
66  __attribute__((always_inline))
67  {
68  SFR()->PIO_OER = MASK;
69  }
70 
74  void open_drain()
75  __attribute__((always_inline))
76  {
77  SFR()->PIO_CODR = MASK;
78  SFR()->PIO_MDER = MASK;
79  }
80 
85  bool read()
86  __attribute__((always_inline))
87  {
88  return ((SFR()->PIO_PDSR & MASK) != 0);
89  }
90 
95  operator bool()
96  __attribute__((always_inline))
97  {
98  return (read());
99  }
100 
104  void low()
105  __attribute__((always_inline))
106  {
107  SFR()->PIO_CODR = MASK;
108  }
109 
113  void high()
114  __attribute__((always_inline))
115  {
116  SFR()->PIO_SODR = MASK;
117  }
118 
122  void toggle()
123  __attribute__((always_inline))
124  {
125  write(!read());
126  }
127 
133  void write(int value)
134  __attribute__((always_inline))
135  {
136  if (value) high(); else low();
137  }
138 
144  void operator=(int value)
145  __attribute__((always_inline))
146  {
147  write(value);
148  }
149 
155  void pulse(uint16_t width)
156  {
157  if (width == 0) return;
158  toggle();
159  delayMicroseconds(width);
160  toggle();
161  }
162 
167  int pulse()
168  {
169  bool s0 = read();
170  while (read() == s0);
171  uint16_t t0 = micros();
172  while (read() != s0);
173  return (micros() - t0);
174  }
175 
176 protected:
178  static const uint32_t MASK = GPIO_MASK(PIN);
179 
184  Pio* SFR()
185  __attribute__((always_inline))
186  {
187  switch (GPIO_REG(PIN)) {
188  case 0: return (PIOA);
189  case 1: return (PIOB);
190  case 2: return (PIOC);
191  default:
192  return (PIOD);
193  }
194  }
195 
200  uint32_t ID_PIO()
201  __attribute__((always_inline))
202  {
203  switch (GPIO_REG(PIN)) {
204  case 0: return (ID_PIOA);
205  case 1: return (ID_PIOB);
206  case 2: return (ID_PIOC);
207  default:
208  return (ID_PIOD);
209  }
210  }
211 };
212 #endif
void pullup()
Definition: GPIO.h:56
uint32_t ID_PIO()
Definition: GPIO.h:200
void high()
Definition: GPIO.h:113
GPIO< PIN > & input()
Definition: GPIO.h:45
void operator=(int value)
Definition: GPIO.h:144
void toggle()
Definition: GPIO.h:122
void open_drain()
Definition: GPIO.h:74
void write(int value)
Definition: GPIO.h:124
#define GPIO_MASK(pin)
Definition: Board.h:40
static const uint8_t MASK
Definition: GPIO.h:191
#define GPIO_REG(pin)
Definition: Board.h:34
int pulse()
Definition: GPIO.h:167
void output()
Definition: GPIO.h:65
bool read()
Definition: GPIO.h:85
Definition: GPIO.h:31
GPIO()
Definition: GPIO.h:36
void low()
Definition: GPIO.h:104
gpio_reg_t * SFR()
Definition: GPIO.h:184
Pio * SFR()
Definition: GPIO.h:184
void pulse(uint16_t width)
Definition: GPIO.h:155