Replacement for regular GPIO (DigitalIn, DigitalOut, DigitalInOut) classes which has superior speed. (modified for use opendrain in stm32)

Dependents:   hctl2032_encoder

Fork of FastIO by Erik -

Committer:
Sissors
Date:
Wed Jul 16 19:31:35 2014 +0000
Revision:
4:6ebbf25b9167
Parent:
3:3dd9466e73fc
Child:
6:da3730030c07
First Nucleo, first version added: F401RE

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Sissors 0:d394ebd01052 1 #ifndef __FAST_IO_H
Sissors 0:d394ebd01052 2 #define __FAST_IO_H
Sissors 0:d394ebd01052 3
Sissors 0:d394ebd01052 4 #include "FastIO_LPC1768.h"
Sissors 0:d394ebd01052 5 #include "FastIO_LPC11UXX.h"
Sissors 1:85a4a54f15e3 6 #include "FastIO_LPC81X.h"
Sissors 0:d394ebd01052 7 #include "FastIO_KLXX.h"
Sissors 3:3dd9466e73fc 8 #include "FastIO_K20D50M.h"
Sissors 4:6ebbf25b9167 9 #include "FastIO_NUCLEO_F401.h"
Sissors 0:d394ebd01052 10
Sissors 0:d394ebd01052 11 #ifndef INIT_PIN
Sissors 2:1a6ed4b84590 12 #warning Target is not supported by FastIO
Sissors 2:1a6ed4b84590 13 #warning Reverting to regular DigitalInOut
Sissors 2:1a6ed4b84590 14 #include "FastIO_Unsupported.h"
Sissors 0:d394ebd01052 15 #endif
Sissors 0:d394ebd01052 16
Sissors 0:d394ebd01052 17 #include "mbed.h"
Sissors 0:d394ebd01052 18
Sissors 0:d394ebd01052 19 /**
Sissors 0:d394ebd01052 20 * Faster alternative compared to regular DigitalInOut
Sissors 0:d394ebd01052 21 *
Sissors 0:d394ebd01052 22 * Except the constructor it is compatible with regular DigitalInOut.
Sissors 0:d394ebd01052 23 * Code is based on Igor Skochinsky's code (http://mbed.org/users/igorsk/code/FastIO/)
Sissors 0:d394ebd01052 24 */
Sissors 0:d394ebd01052 25 template <PinName pin> class FastInOut
Sissors 0:d394ebd01052 26 {
Sissors 0:d394ebd01052 27 public:
Sissors 0:d394ebd01052 28 /**
Sissors 0:d394ebd01052 29 * Construct new FastInOut object
Sissors 0:d394ebd01052 30 *
Sissors 0:d394ebd01052 31 * @code
Sissors 0:d394ebd01052 32 * FastInOut<LED1> led1;
Sissors 0:d394ebd01052 33 * @endcode
Sissors 0:d394ebd01052 34 *
Sissors 0:d394ebd01052 35 * No initialization is done regarding input/output mode,
Sissors 0:d394ebd01052 36 * FastIn/FastOut can be used if that is required
Sissors 0:d394ebd01052 37 *
Sissors 0:d394ebd01052 38 * @param pin pin the FastOut object should be used for
Sissors 0:d394ebd01052 39 */
Sissors 0:d394ebd01052 40 FastInOut() {
Sissors 0:d394ebd01052 41 INIT_PIN;
Sissors 0:d394ebd01052 42 }
Sissors 2:1a6ed4b84590 43
Sissors 2:1a6ed4b84590 44 ~FastInOut() {
Sissors 2:1a6ed4b84590 45 DESTROY_PIN;
Sissors 2:1a6ed4b84590 46 }
Sissors 0:d394ebd01052 47
Sissors 0:d394ebd01052 48 void write(int value) {
Sissors 0:d394ebd01052 49 if ( value )
Sissors 0:d394ebd01052 50 WRITE_PIN_SET;
Sissors 0:d394ebd01052 51 else
Sissors 0:d394ebd01052 52 WRITE_PIN_CLR;
Sissors 0:d394ebd01052 53 }
Sissors 0:d394ebd01052 54 int read() {
Sissors 0:d394ebd01052 55 return READ_PIN;
Sissors 0:d394ebd01052 56 }
Sissors 0:d394ebd01052 57
Sissors 0:d394ebd01052 58 void mode(PinMode pull) {
Sissors 0:d394ebd01052 59 SET_MODE(pull);
Sissors 0:d394ebd01052 60 }
Sissors 0:d394ebd01052 61
Sissors 0:d394ebd01052 62 void output() {
Sissors 0:d394ebd01052 63 SET_DIR_OUTPUT;
Sissors 0:d394ebd01052 64 }
Sissors 0:d394ebd01052 65
Sissors 0:d394ebd01052 66 void input() {
Sissors 0:d394ebd01052 67 SET_DIR_INPUT;
Sissors 0:d394ebd01052 68 }
Sissors 0:d394ebd01052 69
Sissors 0:d394ebd01052 70 FastInOut& operator= (int value) {
Sissors 0:d394ebd01052 71 write(value);
Sissors 0:d394ebd01052 72 return *this;
Sissors 0:d394ebd01052 73 };
Sissors 0:d394ebd01052 74 FastInOut& operator= (FastInOut& rhs) {
Sissors 0:d394ebd01052 75 return write(rhs.read());
Sissors 0:d394ebd01052 76 };
Sissors 0:d394ebd01052 77 operator int() {
Sissors 0:d394ebd01052 78 return read();
Sissors 0:d394ebd01052 79 };
Sissors 0:d394ebd01052 80
Sissors 0:d394ebd01052 81 private:
Sissors 0:d394ebd01052 82 fastio_vars container;
Sissors 0:d394ebd01052 83 };
Sissors 0:d394ebd01052 84
Sissors 0:d394ebd01052 85 /**
Sissors 0:d394ebd01052 86 * Faster alternative compared to regular DigitalOut
Sissors 0:d394ebd01052 87 *
Sissors 0:d394ebd01052 88 * Except the constructor it is compatible with regular DigitalOut. Aditionally all
Sissors 0:d394ebd01052 89 * functions from DigitalInOut are also available (only initialization is different)
Sissors 0:d394ebd01052 90 * Code is based on Igor Skochinsky's code (http://mbed.org/users/igorsk/code/FastIO/)
Sissors 0:d394ebd01052 91 */
Sissors 0:d394ebd01052 92 template <PinName pin, int initial = 0> class FastOut : public FastInOut<pin>
Sissors 0:d394ebd01052 93 {
Sissors 0:d394ebd01052 94 public:
Sissors 0:d394ebd01052 95 /**
Sissors 0:d394ebd01052 96 * Construct new FastOut object
Sissors 0:d394ebd01052 97 *
Sissors 0:d394ebd01052 98 * @code
Sissors 0:d394ebd01052 99 * FastOut<LED1> led1;
Sissors 0:d394ebd01052 100 * @endcode
Sissors 0:d394ebd01052 101 *
Sissors 0:d394ebd01052 102 * @param pin pin the FastOut object should be used for
Sissors 0:d394ebd01052 103 * @param initial (optional) initial state of the pin after construction: default is 0 (low)
Sissors 0:d394ebd01052 104 */
Sissors 0:d394ebd01052 105 FastOut() {
Sissors 0:d394ebd01052 106 FastInOut<pin>::FastInOut();
Sissors 0:d394ebd01052 107 write(initial);
Sissors 0:d394ebd01052 108 SET_DIR_OUTPUT;
Sissors 0:d394ebd01052 109 }
Sissors 0:d394ebd01052 110
Sissors 0:d394ebd01052 111 FastOut& operator= (int value) {
Sissors 0:d394ebd01052 112 this->write(value);
Sissors 0:d394ebd01052 113 return *this;
Sissors 0:d394ebd01052 114 };
Sissors 0:d394ebd01052 115 FastOut& operator= (FastOut& rhs) {
Sissors 0:d394ebd01052 116 return this->write(rhs.read());
Sissors 0:d394ebd01052 117 };
Sissors 0:d394ebd01052 118 operator int() {
Sissors 0:d394ebd01052 119 return this->read();
Sissors 0:d394ebd01052 120 };
Sissors 0:d394ebd01052 121 };
Sissors 0:d394ebd01052 122
Sissors 0:d394ebd01052 123 /**
Sissors 0:d394ebd01052 124 * Faster alternative compared to regular DigitalIn
Sissors 0:d394ebd01052 125 *
Sissors 0:d394ebd01052 126 * Except the constructor it is compatible with regular DigitalIn. Aditionally all
Sissors 0:d394ebd01052 127 * functions from DigitalInOut are also available (only initialization is different)
Sissors 0:d394ebd01052 128 * Code is based on Igor Skochinsky's code (http://mbed.org/users/igorsk/code/FastIO/)
Sissors 0:d394ebd01052 129 */
Sissors 0:d394ebd01052 130 template <PinName pin, PinMode mode = PullDefault> class FastIn : public FastInOut<pin>
Sissors 0:d394ebd01052 131 {
Sissors 0:d394ebd01052 132 public:
Sissors 0:d394ebd01052 133 /**
Sissors 0:d394ebd01052 134 * Construct new FastIn object
Sissors 0:d394ebd01052 135 *
Sissors 0:d394ebd01052 136 * @code
Sissors 0:d394ebd01052 137 * FastIn<LED1> led1;
Sissors 0:d394ebd01052 138 * @endcode
Sissors 0:d394ebd01052 139 *
Sissors 0:d394ebd01052 140 * @param pin pin the FastIn object should be used for
Sissors 0:d394ebd01052 141 * @param mode (optional) initial mode of the pin after construction: default is PullDefault
Sissors 0:d394ebd01052 142 */
Sissors 0:d394ebd01052 143 FastIn() {
Sissors 0:d394ebd01052 144 FastInOut::FastInOut();
Sissors 0:d394ebd01052 145 SET_MODE(mode);
Sissors 0:d394ebd01052 146 SET_DIR_INPUT;
Sissors 0:d394ebd01052 147 }
Sissors 0:d394ebd01052 148
Sissors 0:d394ebd01052 149 FastIn& operator= (int value) {
Sissors 0:d394ebd01052 150 this->write(value);
Sissors 0:d394ebd01052 151 return *this;
Sissors 0:d394ebd01052 152 };
Sissors 0:d394ebd01052 153 FastIn& operator= (FastIn& rhs) {
Sissors 0:d394ebd01052 154 return this->write(rhs.read());
Sissors 0:d394ebd01052 155 };
Sissors 0:d394ebd01052 156 operator int() {
Sissors 0:d394ebd01052 157 return this->read();
Sissors 0:d394ebd01052 158 };
Sissors 0:d394ebd01052 159 };
Sissors 0:d394ebd01052 160
Sissors 0:d394ebd01052 161 #endif