MEAM.Design - MAEVARM - I/O Ports (GPIO)
There are 25 GPIO pins on the M2 board, spread across ports B, C, D, and F. All eight pins of ports B and D are available, while only a subset of C and F can be used. All of the pins are true read-modify-write, have selectable internal pull-up resistors, and include protection diodes to Vcc and ground (thankfully!).
To configure and use a port pin:
You'll need to read and/or modify three registers (replace the x with the appropriate port letter - B, C, D, or F):
- The "Data Direction Register" - clearing a bit will configure that pin to input, while setting a bit will configure the pin for output
- The "Data Register" - If the corresponding bit in DDRx
is set, then clearing the PORTx
bit will take the output low, while setting the PORTx
bit will take the output high. On the other hand, if the corresponding bit in DDRx
is cleared, then clearing the PORTx
bit will disable the internal pull-up resistor, while setting the PORTx
bit will enable the internal pull-up resistor.
PINx - The "Port Input Pins" - This register represents the state of pins configured as inputs, and can be read using the
Important Notes (Please Read!):
All of the I/O pins are multiplexed with other features
and the behavior could be overridden by one of a number of subsystems (timer, ADC, SPI, etc.) when they are enabled.
There are CURRENT LIMITS!
. It is important that you do not try to sink or source more than 40mA per pin
, no more than 100mA for a single port
, and no more than 200mA for the whole board
. If you're lucky, it will fry just the pin. If you're unlucky, it will fry the whole board. Check your circuit requirements, and use MOSFETs if you need to supply more current to your load!
All of the I/O register pointers are pre-defined, and a set of macros have been defined in m_general.h
(latest version available here
) for you to easily manipulate and check individual bits.