1.. _module-pw_digital_io_mcuxpresso: 2 3======================== 4pw_digital_io_mcuxpresso 5======================== 6.. pigweed-module:: 7 :name: pw_digital_io_mcuxpresso 8 9``pw_digital_io_mcuxpresso`` implements the :ref:`module-pw_digital_io` interface using 10the NXP MCUXpresso SDK. 11 12-------- 13Overview 14-------- 15 16This module consists of these main classes: 17 18- `McuxpressoDigitalIn`_ - Provides only input support. 19- `McuxpressoDigitalOut`_ - Provides only output support. 20- `McuxpressoDigitalInOutInterrupt`_ - Provides support for input, output, and GPIO interrupts. 21- `McuxpressoPintController`_ - Controller class for use with ``McuxpressoPintInterrupt``. 22- `McuxpressoPintInterrupt`_ - Provides only interrupt support for a PINT interrupt. 23 24----- 25Setup 26----- 27Use of this module requires setting up the MCUXpresso SDK for use with Pigweed. Follow 28the steps in :ref:`module-pw_build_mcuxpresso` to create a ``pw_source_set`` for an 29MCUXpresso SDK. Include the GPIO and PINT driver components in this SDK definition. 30 31-------- 32Examples 33-------- 34 35Digital input 36============= 37Use `McuxpressoDigitalIn`_ to read the state of an input. 38 39Example code to use GPIO pins from an NXP SDK board definition: 40 41.. code-block:: cpp 42 43 #include "board/pin_mux.h" 44 #include "pw_digital_io_mcuxpresso/digital_io.h" 45 46 McuxpressoDigitalIn input(BOARD_INITPINS_D9_GPIO, 47 BOARD_INITPINS_D9_PORT, 48 BOARD_INITPINS_D9_PIN); 49 50 Status Init() { 51 return input.Enable(); 52 } 53 54 Status InputExample() { 55 PW_TRY_ASSIGN(const DigitalIo::State state, input.GetState()); 56 // ... 57 } 58 59Digital output 60============== 61Use `McuxpressoDigitalOut`_ to set the state of an output. 62 63Example code to use GPIO pins from an NXP SDK board definition: 64 65.. code-block:: cpp 66 67 #include "board/pin_mux.h" 68 #include "pw_digital_io_mcuxpresso/digital_io.h" 69 #include "pw_status/status.h" 70 71 McuxpressoDigitalOut output(BOARD_INITPINS_D8_GPIO, 72 BOARD_INITPINS_D8_PORT, 73 BOARD_INITPINS_D8_PIN, 74 pw::digital_io::State::kActive); 75 76 Status Init() { 77 return output.Enable(); 78 } 79 80 Status OutputExample() { 81 return output.SetState(pw::digital_io::State::kInactive); 82 } 83 84GPIO interrupt 85============== 86Use `McuxpressoDigitalInOutInterrupt`_ to handle interrupts via the GPIO 87module. 88 89Example code to use GPIO pins from an NXP SDK board definition: 90 91.. code-block:: cpp 92 93 #include "board/pin_mux.h" 94 #include "pw_digital_io_mcuxpresso/digital_io.h" 95 #include "pw_status/status.h" 96 97 McuxpressoDigitalInOutInterrupt irq_pin(BOARD_INITPINS_D9_GPIO, 98 BOARD_INITPINS_D9_PORT, 99 BOARD_INITPINS_D9_PIN, 100 /* output= */ false); 101 102 Status Init() { 103 PW_TRY(irq_pin.Enable()); 104 PW_TRY(irq_pin.SetInterruptHandler( 105 pw::digital_io::InterruptTrigger::kDeactivatingEdge, 106 [](State /* state */) { 107 irq_count++; 108 })); 109 PW_TRY(irq_pin.EnableInterruptHandler()); 110 return OkStatus(); 111 } 112 113PINT interrupt 114============== 115`McuxpressoPintInterrupt`_ can also be used to handle interrupts, via the PINT 116module. It must be used with an instance of `McuxpressoPintController`_. 117 118.. code-block:: cpp 119 120 #include "pw_digital_io_mcuxpresso/pint.h" 121 #include "pw_sync/interrupt_spin_lock.h" 122 123 McuxpressoPintController raw_pint_controller(PINT); 124 125 pw::sync::VirtualInterruptSpinLock controller_lock; 126 127 pw::sync::Borrowable<McuxpressoPintController> 128 pint_controller(raw_pint_controller, controller_lock); 129 130 McuxpressoPintInterrupt irq_line0(pint_controller, kPINT_PinInt0); 131 132 Status Init() { 133 // Attach pin PIO0_4 to PINT interrupt 0. 134 INPUTMUX_AttachSignal(INPUTMUX, kPINT_PinInt0, kINPUTMUX_GpioPort0Pin4ToPintsel); 135 136 PW_TRY(irq_line0.Enable()); 137 PW_TRY(irq_line0.SetInterruptHandler( 138 pw::digital_io::InterruptTrigger::kBothEdges, 139 [](State /* state */) { 140 irq_count++; 141 })); 142 PW_TRY(irq_line0.EnableInterruptHandler()); 143 return OkStatus(); 144 } 145 146------------- 147API reference 148------------- 149 150McuxpressoDigitalIn 151=================== 152.. doxygenclass:: pw::digital_io::McuxpressoDigitalIn 153 :members: 154 155McuxpressoDigitalOut 156==================== 157.. doxygenclass:: pw::digital_io::McuxpressoDigitalOut 158 :members: 159 160McuxpressoDigitalInOutInterrupt 161=============================== 162.. doxygenclass:: pw::digital_io::McuxpressoDigitalInOutInterrupt 163 :members: 164 165McuxpressoPintInterrupt 166======================= 167``pw::digital_io::McuxpressoPintInterrupt`` can also be used to handle 168interrupts, via the PINT module, which supports other features: 169 170* Dedicated (non-shared) IRQs for each interrupt 171* Double edge detection (``InterruptTrigger::kBothEdges``) 172* Waking from deep sleep with edge detection 173* Pattern matching support (currently unsupported here) 174* Triggering interrupts on pins configured for a non-GPIO function 175 176.. doxygenclass:: pw::digital_io::McuxpressoPintInterrupt 177 :members: 178 179McuxpressoPintController 180======================== 181.. doxygenclass:: pw::digital_io::McuxpressoPintController 182 :members: 183