APM:Libraries
GPIO.h
Go to the documentation of this file.
1 
2 #pragma once
3 
4 #include <AP_HAL/AP_HAL.h>
6 #include "handler.h"
7 #include <boards.h>
8 #include <exti.h>
9 
10 #ifndef HIGH
11  #define HIGH 0x1
12 #endif
13 
14 #ifndef LOW
15  #define LOW 0x0
16 #endif
17 
18 
19 #ifndef HAL_GPIO_LED_ON
20  # define HAL_GPIO_LED_ON LOW
21  # define HAL_GPIO_LED_OFF HIGH
22 #endif
23 
24 
25 
26 typedef enum HALPinMode {
35  OUTPUT = GPIO_OUTPUT_PP, /* Basic digital output: when the pin is HIGH, the
36  voltage is held at +3.3v (Vcc) and when it is LOW, it
37  is pulled down to ground. */
38 
39  OUTPUT_ALT = GPIO_AF_OUTPUT_PP, /* basic alternate function mode */
40 
41 // more complex modes
42 
43 // INPUT_FLOATING = GPIO_INPUT_FLOATING, /**< Synonym for INPUT. */
44 
94 } HAL_PinMode;
95 
96 
97 // HAL_GPIO_INTERRUPT_ not used anywhere
98 
99 typedef enum ExtIntTriggerMode {
100  RISING = (uint8_t)EXTI_RISING,
101  FALLING = (uint8_t)EXTI_FALLING,
104 
105 
107 public:
108  DigitalSource(const gpio_dev *device, uint8_t bit): _device(device), _bit(bit){ }
109 
110  void mode(uint8_t output);
111 
112  uint8_t read() { return _read(); }
113  void write(uint8_t value) { _write(value); }
114 
115  inline uint8_t _read() { return gpio_read_bit(_device, _bit) ? HIGH : LOW; }
116  inline void _write(uint8_t value) { gpio_write_bit(_device, _bit, value); }
117 
118  inline void toggle() { gpio_toggle_bit(_device, _bit); }
119 
120 private:
122  uint8_t _bit;
123 };
124 
125 
126 class F4Light::GPIO : public AP_HAL::GPIO {
127 public:
128  GPIO() {};
129  void init() override { gpio_init_all(); }
130  void pinMode(uint8_t pin, uint8_t output) override;
131  uint8_t read(uint8_t pin) override;
132  void write(uint8_t pin, uint8_t value) override;
133  void toggle(uint8_t pin) override;
134 
135  /* Alternative interface: */
136  AP_HAL::DigitalSource* channel(uint16_t n);
137 
138  /* Interrupt interface: */
139  static bool _attach_interrupt(uint8_t pin, Handler h, uint8_t mode, uint8_t priority);
140 
141  inline bool attach_interrupt(uint8_t pin, AP_HAL::MemberProc p, uint8_t mode) {
142  Revo_handler h = { .mp = p };
143  return _attach_interrupt(pin, h.h, mode, GPIO_INT_PRIORITY);
144  }
145 
146  inline bool attach_interrupt(uint8_t pin, AP_HAL::Proc p, uint8_t mode) {
147  Revo_handler h = { .hp = p };
148  return _attach_interrupt(pin, h.h, mode, GPIO_INT_PRIORITY);
149  }
150 
151  void detach_interrupt(uint8_t pin);
152  static inline void enable_interrupt(uint8_t pin, bool e) { exti_enable_interrupt((afio_exti_num)(PIN_MAP[pin].gpio_bit), e); }
153 
154  /* return true if USB cable is connected */
155  inline bool usb_connected(void) override {
156  return gpio_read_bit(PIN_MAP[BOARD_USB_SENSE].gpio_device,PIN_MAP[BOARD_USB_SENSE].gpio_bit);
157  }
158 
159  inline int8_t analogPinToDigitalPin(uint8_t pin) override { return pin; }
160  static inline uint8_t analogPinToDigital(uint8_t pin){ return pin; }
161 
162 // internal usage static versions
163  static void _pinMode(uint8_t pin, uint8_t output);
164  static inline uint8_t _read(uint8_t pin) { const stm32_pin_info &pp = PIN_MAP[pin]; return gpio_read_bit( pp.gpio_device, pp.gpio_bit) ? HIGH : LOW; }
165  static inline void _write(uint8_t pin, uint8_t value) { const stm32_pin_info &pp = PIN_MAP[pin]; gpio_write_bit(pp.gpio_device, pp.gpio_bit, value); }
166  static inline void _toggle(uint8_t pin) { const stm32_pin_info &p = PIN_MAP[pin]; gpio_toggle_bit(p.gpio_device, p.gpio_bit); }
167 
168  static inline void _setSpeed(uint8_t pin, GPIOSpeed_t gpio_speed) { const stm32_pin_info &pp = PIN_MAP[pin]; gpio_set_speed(pp.gpio_device, pp.gpio_bit, gpio_speed);}
169 
170  static inline DigitalSource* get_channel(uint16_t pin) { const stm32_pin_info &pp = PIN_MAP[pin]; return new DigitalSource(pp.gpio_device, pp.gpio_bit); }
171 };
172 
173 
175  return (exti_trigger_mode)mode;
176 }
177 
178 extern "C" {
179  void digitalWrite(uint8_t pin, uint8_t value);
180  uint8_t digitalRead(uint8_t pin);
181  void digitalToggle(uint8_t pin);
182 }
183 
184 
Definition: GPIO.h:27
void gpio_init_all(void)
Definition: gpio_hal.c:90
static void enable_interrupt(uint8_t pin, bool e)
Definition: GPIO.h:152
AP_HAL::MemberProc mp
Definition: handler.h:18
Handler h
Definition: handler.h:20
void write(uint8_t value)
Definition: GPIO.h:113
Definition: GPIO.h:102
void mode(uint8_t output)
Definition: GPIO.cpp:155
const gpio_dev * _device
Definition: GPIO.h:121
static void _write(uint8_t pin, uint8_t value)
Definition: GPIO.h:165
const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS]
#define BOARD_USB_SENSE
Definition: board.h:75
Definition: GPIO.h:35
void(* Proc)(void)
Definition: GPIO.h:100
ExtIntTriggerMode
Definition: GPIO.h:99
Definition: GPIO.h:101
#define LOW
Definition: GPIO.h:15
uint8_t _read()
Definition: GPIO.h:115
bool usb_connected(void) override
Definition: GPIO.h:155
static void gpio_toggle_bit(const gpio_dev *const dev, uint8_t pin)
Definition: gpio_hal.h:145
static void _setSpeed(uint8_t pin, GPIOSpeed_t gpio_speed)
Definition: GPIO.h:168
exti_trigger_mode
Definition: exti.h:51
HALPinMode
Definition: GPIO.h:26
uint8_t digitalRead(uint8_t pin)
Definition: GPIO.cpp:181
uint8_t read()
Definition: GPIO.h:112
static uint8_t _read(uint8_t pin)
Definition: GPIO.h:164
afio_exti_num
Definition: exti.h:15
int8_t analogPinToDigitalPin(uint8_t pin) override
Definition: GPIO.h:159
void digitalToggle(uint8_t pin)
Definition: GPIO.cpp:183
Definition: GPIO.h:87
Board-specific pin information.
bool attach_interrupt(uint8_t pin, AP_HAL::MemberProc p, uint8_t mode)
Definition: GPIO.h:141
static void _toggle(uint8_t pin)
Definition: GPIO.h:166
#define GPIO_INT_PRIORITY
Definition: Config.h:47
DigitalSource(const gpio_dev *device, uint8_t bit)
Definition: GPIO.h:108
static INLINE uint8_t gpio_read_bit(const gpio_dev *const dev, uint8_t pin)
Definition: gpio_hal.h:130
enum HALPinMode HAL_PinMode
void _write(uint8_t value)
Definition: GPIO.h:116
static void gpio_set_speed(const gpio_dev *const dev, uint8_t pin, GPIOSpeed_t gpio_speed)
Definition: gpio_hal.h:161
#define HIGH
Definition: GPIO.h:11
float value
void exti_enable_interrupt(afio_exti_num num, bool e)
Definition: exti.c:164
uint64_t Handler
Definition: hal_types.h:19
static int8_t pin
Definition: AnalogIn.cpp:15
static DigitalSource * get_channel(uint16_t pin)
Definition: GPIO.h:170
static uint8_t analogPinToDigital(uint8_t pin)
Definition: GPIO.h:160
uint8_t gpio_bit
Definition: boards.h:92
void init() override
Definition: GPIO.h:129
AP_HAL::Proc hp
Definition: handler.h:16
Stores STM32-specific information related to a given Maple pin.
Definition: boards.h:88
const gpio_dev *const gpio_device
Definition: boards.h:89
static exti_trigger_mode exti_out_mode(ExtIntTriggerMode mode)
Definition: GPIO.h:174
void digitalWrite(uint8_t pin, uint8_t value)
Definition: GPIO.cpp:180
bool attach_interrupt(uint8_t pin, AP_HAL::Proc p, uint8_t mode)
Definition: GPIO.h:146
GPIOSpeed_t
Definition: gpio_hal.h:42
static INLINE void gpio_write_bit(const gpio_dev *const dev, uint8_t pin, uint8_t val)
Definition: gpio_hal.h:115