IRQ fix

Committer:
burocketteam
Date:
Mon Apr 09 23:31:30 2012 +0000
Revision:
1:6fddb8411725

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
burocketteam 1:6fddb8411725 1 #ifndef __FAST_IO_H
burocketteam 1:6fddb8411725 2 #define __FAST_IO_H
burocketteam 1:6fddb8411725 3
burocketteam 1:6fddb8411725 4 #include "mbed.h"
burocketteam 1:6fddb8411725 5
burocketteam 1:6fddb8411725 6 // Super-fast DigitalOut-like class for mbed
burocketteam 1:6fddb8411725 7 // by Igor Skochinsky
burocketteam 1:6fddb8411725 8
burocketteam 1:6fddb8411725 9 // includes FastOut, FastPortOut and MaskedPortOut classes
burocketteam 1:6fddb8411725 10 // usage:
burocketteam 1:6fddb8411725 11 // FastOut<LED2> led2;
burocketteam 1:6fddb8411725 12 // FastPortOut<Port0, LED_MASK> ledport2;
burocketteam 1:6fddb8411725 13 // MaskedPortOut<Port0, LED_MASK> ledport3;
burocketteam 1:6fddb8411725 14 // led2 = 1;
burocketteam 1:6fddb8411725 15 // ledport2 = LED_MASK;
burocketteam 1:6fddb8411725 16 // ledport3 = LED_MASK;
burocketteam 1:6fddb8411725 17 // MaskedPortOut works the same way as FastPortOut, but it pre-sets the pin mask so that write can be done in one operation
burocketteam 1:6fddb8411725 18 // this makes things faster but you can't control other pins of the port, even with other classes
burocketteam 1:6fddb8411725 19
burocketteam 1:6fddb8411725 20
burocketteam 1:6fddb8411725 21 // pin definitions in PinNames.h start from LPC_GPIO0_BASE for P0_0 and there are 32 pins to a port (0 to 31)
burocketteam 1:6fddb8411725 22 // Thus:
burocketteam 1:6fddb8411725 23 // pin = LPC_GPIO0_BASE + port * 32 + bit
burocketteam 1:6fddb8411725 24 // port = (pin - LPC_GPIO0_BASE) / 32
burocketteam 1:6fddb8411725 25 // bit = (pin - LPC_GPIO0_BASE) % 32
burocketteam 1:6fddb8411725 26
burocketteam 1:6fddb8411725 27 #define PORTNO(pin) (((pin) - P0_0)/32)
burocketteam 1:6fddb8411725 28 #define BITNO(pin) (((pin) - P0_0)%32)
burocketteam 1:6fddb8411725 29
burocketteam 1:6fddb8411725 30 // calculate the GPIO port definition for the pin
burocketteam 1:6fddb8411725 31 // we rely on the fact that port structs are 0x20 bytes apart
burocketteam 1:6fddb8411725 32 #define PORTDEF(pin) ((LPC_GPIO_TypeDef*)(LPC_GPIO0_BASE + PORTNO(pin)*0x20))
burocketteam 1:6fddb8411725 33
burocketteam 1:6fddb8411725 34 #define PORTDEFPORT(port) ((LPC_GPIO_TypeDef*)(LPC_GPIO0_BASE + port*0x20))
burocketteam 1:6fddb8411725 35
burocketteam 1:6fddb8411725 36 // calculate the mask for the pin's bit in the port
burocketteam 1:6fddb8411725 37 #define PINMASK(pin) (1UL << BITNO(pin))
burocketteam 1:6fddb8411725 38
burocketteam 1:6fddb8411725 39 // each port takes two PINSEL registers (8 bytes or 64 bits)
burocketteam 1:6fddb8411725 40 // so there are 16 pins per PINSEL
burocketteam 1:6fddb8411725 41 #define PINSELREG(pin) (*(volatile uint32_t*)(LPC_PINCON_BASE + 4*(((pin) - P0_0)/16)))
burocketteam 1:6fddb8411725 42 #define PINSELMASK(pin, v) (v << (((pin - P0_0)%16)*2) )
burocketteam 1:6fddb8411725 43
burocketteam 1:6fddb8411725 44 // usage: FastOut<LED2> led2;
burocketteam 1:6fddb8411725 45 // then use the same assignment operators as with DigitalOut
burocketteam 1:6fddb8411725 46 template <PinName pin> class FastOut
burocketteam 1:6fddb8411725 47 {
burocketteam 1:6fddb8411725 48 public:
burocketteam 1:6fddb8411725 49 FastOut()
burocketteam 1:6fddb8411725 50 {
burocketteam 1:6fddb8411725 51 // set PINSEL bits to 0b00 (GPIO)
burocketteam 1:6fddb8411725 52 PINSELREG(pin) &= ~PINSELMASK(pin, 3);
burocketteam 1:6fddb8411725 53 // set FIODIR bit to 1 (output)
burocketteam 1:6fddb8411725 54 PORTDEF(pin)->FIODIR |= PINMASK(pin);
burocketteam 1:6fddb8411725 55 }
burocketteam 1:6fddb8411725 56 void write(int value)
burocketteam 1:6fddb8411725 57 {
burocketteam 1:6fddb8411725 58 if ( value )
burocketteam 1:6fddb8411725 59 PORTDEF(pin)->FIOSET = PINMASK(pin);
burocketteam 1:6fddb8411725 60 else
burocketteam 1:6fddb8411725 61 PORTDEF(pin)->FIOCLR = PINMASK(pin);
burocketteam 1:6fddb8411725 62 }
burocketteam 1:6fddb8411725 63 int read()
burocketteam 1:6fddb8411725 64 {
burocketteam 1:6fddb8411725 65 return PORTDEF(pin)->FIOPIN & PINMASK(pin) != 0;
burocketteam 1:6fddb8411725 66 }
burocketteam 1:6fddb8411725 67 FastOut& operator= (int value) { write(value); return *this; };
burocketteam 1:6fddb8411725 68 FastOut& operator= (FastOut& rhs) { return write(rhs.read()); };
burocketteam 1:6fddb8411725 69 operator int() { return read(); };
burocketteam 1:6fddb8411725 70 };
burocketteam 1:6fddb8411725 71
burocketteam 1:6fddb8411725 72 #define PINSELREG(pin) (*(volatile uint32_t*)(LPC_PINCON_BASE + 4*(((pin) - P0_0)/16)))
burocketteam 1:6fddb8411725 73 #define PINSELMASK(pin, v) (v << (((pin - P0_0)%16)*2) )
burocketteam 1:6fddb8411725 74
burocketteam 1:6fddb8411725 75 // usage: FastPortOut<Port0, mask> led2;
burocketteam 1:6fddb8411725 76 // then use the same assignment operators as with DigitalOut
burocketteam 1:6fddb8411725 77 template <enum PortName port, uint32_t mask = 0xFFFFFFFF> class FastPortOut
burocketteam 1:6fddb8411725 78 {
burocketteam 1:6fddb8411725 79 public:
burocketteam 1:6fddb8411725 80 FastPortOut()
burocketteam 1:6fddb8411725 81 {
burocketteam 1:6fddb8411725 82 // init pins selected by the mask
burocketteam 1:6fddb8411725 83 uint32_t pin = LPC_GPIO0_BASE + port * 32;
burocketteam 1:6fddb8411725 84 for ( uint32_t pinmask = mask; pinmask !=0; pinmask >>= 1 )
burocketteam 1:6fddb8411725 85 {
burocketteam 1:6fddb8411725 86 if ( pinmask & 1 )
burocketteam 1:6fddb8411725 87 {
burocketteam 1:6fddb8411725 88 // set PINSEL bits to 0b00 (GPIO)
burocketteam 1:6fddb8411725 89 PINSELREG(pin) &= ~PINSELMASK(pin, 3);
burocketteam 1:6fddb8411725 90 // set FIODIR bit to 1 (output)
burocketteam 1:6fddb8411725 91 PORTDEF(pin)->FIODIR |= PINMASK(pin);
burocketteam 1:6fddb8411725 92 }
burocketteam 1:6fddb8411725 93 pin++;
burocketteam 1:6fddb8411725 94 }
burocketteam 1:6fddb8411725 95 }
burocketteam 1:6fddb8411725 96 void write(int value)
burocketteam 1:6fddb8411725 97 {
burocketteam 1:6fddb8411725 98 PORTDEFPORT(port)->FIOSET = value & mask;
burocketteam 1:6fddb8411725 99 PORTDEFPORT(port)->FIOCLR = ~value & mask;
burocketteam 1:6fddb8411725 100 }
burocketteam 1:6fddb8411725 101 int read()
burocketteam 1:6fddb8411725 102 {
burocketteam 1:6fddb8411725 103 return PORTDEFPORT(port)->FIOPIN & mask;
burocketteam 1:6fddb8411725 104 }
burocketteam 1:6fddb8411725 105 FastPortOut& operator= (int value) { write(value); return *this; };
burocketteam 1:6fddb8411725 106 FastPortOut& operator= (FastPortOut& rhs) { return write(rhs.read()); };
burocketteam 1:6fddb8411725 107 operator int() { return read(); };
burocketteam 1:6fddb8411725 108 };
burocketteam 1:6fddb8411725 109
burocketteam 1:6fddb8411725 110 // usage: MaskedPortOut<Port0, mask> led2;
burocketteam 1:6fddb8411725 111 // then use the same assignment operators as with DigitalOut
burocketteam 1:6fddb8411725 112 template <enum PortName port, uint32_t mask = 0xFFFFFFFF> class MaskedPortOut
burocketteam 1:6fddb8411725 113 {
burocketteam 1:6fddb8411725 114 public:
burocketteam 1:6fddb8411725 115 MaskedPortOut()
burocketteam 1:6fddb8411725 116 {
burocketteam 1:6fddb8411725 117 // init pins selected by the mask
burocketteam 1:6fddb8411725 118 uint32_t pin = LPC_GPIO0_BASE + port * 32;
burocketteam 1:6fddb8411725 119 for ( uint32_t pinmask = mask; pinmask !=0; pinmask >>= 1 )
burocketteam 1:6fddb8411725 120 {
burocketteam 1:6fddb8411725 121 if ( pinmask & 1 )
burocketteam 1:6fddb8411725 122 {
burocketteam 1:6fddb8411725 123 // set PINSEL bits to 0b00 (GPIO)
burocketteam 1:6fddb8411725 124 PINSELREG(pin) &= ~PINSELMASK(pin, 3);
burocketteam 1:6fddb8411725 125 // set FIODIR bit to 1 (output)
burocketteam 1:6fddb8411725 126 PORTDEF(pin)->FIODIR |= PINMASK(pin);
burocketteam 1:6fddb8411725 127 }
burocketteam 1:6fddb8411725 128 pin++;
burocketteam 1:6fddb8411725 129 }
burocketteam 1:6fddb8411725 130 // set mask
burocketteam 1:6fddb8411725 131 PORTDEFPORT(port)->FIOMASK = mask;
burocketteam 1:6fddb8411725 132 }
burocketteam 1:6fddb8411725 133 void write(int value)
burocketteam 1:6fddb8411725 134 {
burocketteam 1:6fddb8411725 135 PORTDEFPORT(port)->FIOPIN = value;
burocketteam 1:6fddb8411725 136 }
burocketteam 1:6fddb8411725 137 int read()
burocketteam 1:6fddb8411725 138 {
burocketteam 1:6fddb8411725 139 return PORTDEFPORT(port)->FIOPIN;
burocketteam 1:6fddb8411725 140 }
burocketteam 1:6fddb8411725 141 MaskedPortOut& operator= (int value) { write(value); return *this; };
burocketteam 1:6fddb8411725 142 MaskedPortOut& operator= (MaskedPortOut& rhs) { return write(rhs.read()); };
burocketteam 1:6fddb8411725 143 operator int() { return read(); };
burocketteam 1:6fddb8411725 144 };
burocketteam 1:6fddb8411725 145
burocketteam 1:6fddb8411725 146 #endif