blob: b171bfcf5b47106dd5e38ceebdc44f2ab6030218 [file] [log] [blame]
.. _module-pw_digital_io_rp2040:
--------------------
pw_digital_io_rp2040
--------------------
``pw_digital_io_rp2040`` implements the :ref:`module-pw_digital_io` interface using
the `Raspberry Pi Pico SDK <https://github.com/raspberrypi/pico-sdk/>`_.
Setup
=====
Use of this module requires setting up the Pico SDK for use with Pigweed. Follow
the steps in :ref:`target-rp2040` to get setup.
Examples
========
Use ``pw::digital_io::Rp2040DigitalIn`` and
``pw::digital_io::Rp2040DigitalInOut`` classes to control GPIO pins.
Example code to use GPIO pins:
.. code-block:: cpp
#include "pw_digital_io/polarity.h"
#include "pw_digital_io_rp2040/digital_io.h"
using pw::digital_io::Polarity;
using pw::digital_io::Rp2040Config;
using pw::digital_io::Rp2040DigitalIn;
using pw::digital_io::Rp2040DigitalInOut;
using pw::digital_io::State;
constexpr Rp2040Config output_pin_config{
.pin = 15,
.polarity = Polarity::kActiveLow,
};
constexpr Rp2040Config input_pin_config{
.pin = 16,
.polarity = Polarity::kActiveHigh,
};
constexpr Rp2040Config button_connected_to_ground_config{
.pin = 12,
.polarity = Polarity::kActiveLow,
.enable_pull_up = true,
};
// Config output pin:
Rp2040DigitalInOut out(output_pin_config);
out.Enable();
// Set the output pin active.
// This pulls pin to ground since the polarity is kActiveLow.
out.SetState(State::kActive);
// Config input pins:
Rp2040DigitalIn in(input_pin_config);
in.Enable();
Rp2040DigitalIn button(button_connected_to_ground_config);
button.Enable();
// Get the pin state. Since the polarity is kActiveHigh this will return
// State::kActive if the pin is high or and State::kInactive if the pin is
// low (grounded).
State pin_state = in.GetState();
auto button_result = button.GetState();
if (button_result.ok()) {
if (button_result.value() == State::kActive) {
PW_LOG_INFO("Button is pressed.");
}
if (button_result.value() == State::kInactive) {
PW_LOG_INFO("Button is released.");
}
}