• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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