Skip to content

Commit

Permalink
gpio: add PinGroup::set_u32 to allow setting each pin to a differen…
Browse files Browse the repository at this point in the history
…t state
  • Loading branch information
ithinuel committed Jun 30, 2024
1 parent 1da07a0 commit a12a508
Showing 1 changed file with 28 additions and 0 deletions.
28 changes: 28 additions & 0 deletions rp2040-hal/src/gpio/pin_group.rs
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,34 @@ where
}
}

/// Set this set of pins to the state given in a single operation.
///
/// The state passed in must be a mask where each bit corresponds to a gpio.
///
/// For example, if the group contains Gpio1 and Gpio3, a read may yield:
/// ```text
/// 0b0000_0000__0000_0000__0000_0000__0000_1010
/// This is Gpio3 ↑↑↑
/// Gpio2 is not used ||
/// This is Gpio1 |
/// ```
///
/// State corresponding to bins not in this group are ignored.
pub fn set_u32(&mut self, state: u32) {
use super::pin::pin_sealed::PinIdOps;
let mask = self.0.write_mask();
let state_masked = mask & state;
let head_id = self.0.head.borrow().id();
// UNSAFE: this register is 32bit wide and all bits are valid.
// The value set is masked
head_id.sio_out().modify(|r, w| unsafe {
// clear all bit part of this group
let cleared = r.bits() & !mask;
// set bits according to state
w.bits(cleared | state_masked)
});
}

/// Toggles this set of pins all at the same time.
///
/// This only affects output pins. Input pins in the
Expand Down

0 comments on commit a12a508

Please sign in to comment.