mirror of
https://github.com/embassy-rs/embassy.git
synced 2024-11-21 22:32:29 +00:00
Add parameter for enabling pull-up and pull-down in RP PWM input mode
This commit is contained in:
parent
9d0b682b2d
commit
143b288333
@ -6,7 +6,7 @@ use fixed::FixedU16;
|
|||||||
use pac::pwm::regs::{ChDiv, Intr};
|
use pac::pwm::regs::{ChDiv, Intr};
|
||||||
use pac::pwm::vals::Divmode;
|
use pac::pwm::vals::Divmode;
|
||||||
|
|
||||||
use crate::gpio::{AnyPin, Pin as GpioPin, SealedPin as _};
|
use crate::gpio::{AnyPin, Pin as GpioPin, Pull, SealedPin as _};
|
||||||
use crate::{pac, peripherals, RegExt};
|
use crate::{pac, peripherals, RegExt};
|
||||||
|
|
||||||
/// The configuration of a PWM slice.
|
/// The configuration of a PWM slice.
|
||||||
@ -92,6 +92,7 @@ impl<'d, T: Slice> Pwm<'d, T> {
|
|||||||
inner: impl Peripheral<P = T> + 'd,
|
inner: impl Peripheral<P = T> + 'd,
|
||||||
a: Option<PeripheralRef<'d, AnyPin>>,
|
a: Option<PeripheralRef<'d, AnyPin>>,
|
||||||
b: Option<PeripheralRef<'d, AnyPin>>,
|
b: Option<PeripheralRef<'d, AnyPin>>,
|
||||||
|
b_pull: Pull,
|
||||||
config: Config,
|
config: Config,
|
||||||
divmode: Divmode,
|
divmode: Divmode,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
@ -110,6 +111,10 @@ impl<'d, T: Slice> Pwm<'d, T> {
|
|||||||
}
|
}
|
||||||
if let Some(pin) = &b {
|
if let Some(pin) = &b {
|
||||||
pin.gpio().ctrl().write(|w| w.set_funcsel(4));
|
pin.gpio().ctrl().write(|w| w.set_funcsel(4));
|
||||||
|
pin.pad_ctrl().modify(|w| {
|
||||||
|
w.set_pue(b_pull == Pull::Up);
|
||||||
|
w.set_pde(b_pull == Pull::Down);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
Self {
|
Self {
|
||||||
inner,
|
inner,
|
||||||
@ -121,7 +126,7 @@ impl<'d, T: Slice> Pwm<'d, T> {
|
|||||||
/// Create PWM driver without any configured pins.
|
/// Create PWM driver without any configured pins.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn new_free(inner: impl Peripheral<P = T> + 'd, config: Config) -> Self {
|
pub fn new_free(inner: impl Peripheral<P = T> + 'd, config: Config) -> Self {
|
||||||
Self::new_inner(inner, None, None, config, Divmode::DIV)
|
Self::new_inner(inner, None, None, Pull::None, config, Divmode::DIV)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Create PWM driver with a single 'a' as output.
|
/// Create PWM driver with a single 'a' as output.
|
||||||
@ -132,7 +137,7 @@ impl<'d, T: Slice> Pwm<'d, T> {
|
|||||||
config: Config,
|
config: Config,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
into_ref!(a);
|
into_ref!(a);
|
||||||
Self::new_inner(inner, Some(a.map_into()), None, config, Divmode::DIV)
|
Self::new_inner(inner, Some(a.map_into()), None, Pull::None, config, Divmode::DIV)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Create PWM driver with a single 'b' pin as output.
|
/// Create PWM driver with a single 'b' pin as output.
|
||||||
@ -143,7 +148,7 @@ impl<'d, T: Slice> Pwm<'d, T> {
|
|||||||
config: Config,
|
config: Config,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
into_ref!(b);
|
into_ref!(b);
|
||||||
Self::new_inner(inner, None, Some(b.map_into()), config, Divmode::DIV)
|
Self::new_inner(inner, None, Some(b.map_into()), Pull::None, config, Divmode::DIV)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Create PWM driver with a 'a' and 'b' pins as output.
|
/// Create PWM driver with a 'a' and 'b' pins as output.
|
||||||
@ -155,7 +160,14 @@ impl<'d, T: Slice> Pwm<'d, T> {
|
|||||||
config: Config,
|
config: Config,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
into_ref!(a, b);
|
into_ref!(a, b);
|
||||||
Self::new_inner(inner, Some(a.map_into()), Some(b.map_into()), config, Divmode::DIV)
|
Self::new_inner(
|
||||||
|
inner,
|
||||||
|
Some(a.map_into()),
|
||||||
|
Some(b.map_into()),
|
||||||
|
Pull::None,
|
||||||
|
config,
|
||||||
|
Divmode::DIV,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Create PWM driver with a single 'b' as input pin.
|
/// Create PWM driver with a single 'b' as input pin.
|
||||||
@ -163,11 +175,12 @@ impl<'d, T: Slice> Pwm<'d, T> {
|
|||||||
pub fn new_input(
|
pub fn new_input(
|
||||||
inner: impl Peripheral<P = T> + 'd,
|
inner: impl Peripheral<P = T> + 'd,
|
||||||
b: impl Peripheral<P = impl ChannelBPin<T>> + 'd,
|
b: impl Peripheral<P = impl ChannelBPin<T>> + 'd,
|
||||||
|
b_pull: Pull,
|
||||||
mode: InputMode,
|
mode: InputMode,
|
||||||
config: Config,
|
config: Config,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
into_ref!(b);
|
into_ref!(b);
|
||||||
Self::new_inner(inner, None, Some(b.map_into()), config, mode.into())
|
Self::new_inner(inner, None, Some(b.map_into()), b_pull, config, mode.into())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Create PWM driver with a 'a' and 'b' pins in the desired input mode.
|
/// Create PWM driver with a 'a' and 'b' pins in the desired input mode.
|
||||||
@ -176,11 +189,19 @@ impl<'d, T: Slice> Pwm<'d, T> {
|
|||||||
inner: impl Peripheral<P = T> + 'd,
|
inner: impl Peripheral<P = T> + 'd,
|
||||||
a: impl Peripheral<P = impl ChannelAPin<T>> + 'd,
|
a: impl Peripheral<P = impl ChannelAPin<T>> + 'd,
|
||||||
b: impl Peripheral<P = impl ChannelBPin<T>> + 'd,
|
b: impl Peripheral<P = impl ChannelBPin<T>> + 'd,
|
||||||
|
b_pull: Pull,
|
||||||
mode: InputMode,
|
mode: InputMode,
|
||||||
config: Config,
|
config: Config,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
into_ref!(a, b);
|
into_ref!(a, b);
|
||||||
Self::new_inner(inner, Some(a.map_into()), Some(b.map_into()), config, mode.into())
|
Self::new_inner(
|
||||||
|
inner,
|
||||||
|
Some(a.map_into()),
|
||||||
|
Some(b.map_into()),
|
||||||
|
b_pull,
|
||||||
|
config,
|
||||||
|
mode.into(),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Set the PWM config.
|
/// Set the PWM config.
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
use defmt::*;
|
use defmt::*;
|
||||||
use embassy_executor::Spawner;
|
use embassy_executor::Spawner;
|
||||||
|
use embassy_rp::gpio::Pull;
|
||||||
use embassy_rp::pwm::{Config, InputMode, Pwm};
|
use embassy_rp::pwm::{Config, InputMode, Pwm};
|
||||||
use embassy_time::{Duration, Ticker};
|
use embassy_time::{Duration, Ticker};
|
||||||
use {defmt_rtt as _, panic_probe as _};
|
use {defmt_rtt as _, panic_probe as _};
|
||||||
@ -14,7 +15,7 @@ async fn main(_spawner: Spawner) {
|
|||||||
let p = embassy_rp::init(Default::default());
|
let p = embassy_rp::init(Default::default());
|
||||||
|
|
||||||
let cfg: Config = Default::default();
|
let cfg: Config = Default::default();
|
||||||
let pwm = Pwm::new_input(p.PWM_SLICE2, p.PIN_5, InputMode::RisingEdge, cfg);
|
let pwm = Pwm::new_input(p.PWM_SLICE2, p.PIN_5, Pull::None, InputMode::RisingEdge, cfg);
|
||||||
|
|
||||||
let mut ticker = Ticker::every(Duration::from_secs(1));
|
let mut ticker = Ticker::every(Duration::from_secs(1));
|
||||||
loop {
|
loop {
|
||||||
|
@ -94,7 +94,7 @@ async fn main(_spawner: Spawner) {
|
|||||||
// Test level-gated
|
// Test level-gated
|
||||||
{
|
{
|
||||||
let mut pin2 = Output::new(&mut p11, Level::Low);
|
let mut pin2 = Output::new(&mut p11, Level::Low);
|
||||||
let pwm = Pwm::new_input(&mut p.PWM_SLICE3, &mut p7, InputMode::Level, cfg.clone());
|
let pwm = Pwm::new_input(&mut p.PWM_SLICE3, &mut p7, Pull::None, InputMode::Level, cfg.clone());
|
||||||
assert_eq!(pwm.counter(), 0);
|
assert_eq!(pwm.counter(), 0);
|
||||||
Timer::after_millis(5).await;
|
Timer::after_millis(5).await;
|
||||||
assert_eq!(pwm.counter(), 0);
|
assert_eq!(pwm.counter(), 0);
|
||||||
@ -110,7 +110,13 @@ async fn main(_spawner: Spawner) {
|
|||||||
// Test rising-gated
|
// Test rising-gated
|
||||||
{
|
{
|
||||||
let mut pin2 = Output::new(&mut p11, Level::Low);
|
let mut pin2 = Output::new(&mut p11, Level::Low);
|
||||||
let pwm = Pwm::new_input(&mut p.PWM_SLICE3, &mut p7, InputMode::RisingEdge, cfg.clone());
|
let pwm = Pwm::new_input(
|
||||||
|
&mut p.PWM_SLICE3,
|
||||||
|
&mut p7,
|
||||||
|
Pull::None,
|
||||||
|
InputMode::RisingEdge,
|
||||||
|
cfg.clone(),
|
||||||
|
);
|
||||||
assert_eq!(pwm.counter(), 0);
|
assert_eq!(pwm.counter(), 0);
|
||||||
Timer::after_millis(5).await;
|
Timer::after_millis(5).await;
|
||||||
assert_eq!(pwm.counter(), 0);
|
assert_eq!(pwm.counter(), 0);
|
||||||
@ -125,7 +131,13 @@ async fn main(_spawner: Spawner) {
|
|||||||
// Test falling-gated
|
// Test falling-gated
|
||||||
{
|
{
|
||||||
let mut pin2 = Output::new(&mut p11, Level::High);
|
let mut pin2 = Output::new(&mut p11, Level::High);
|
||||||
let pwm = Pwm::new_input(&mut p.PWM_SLICE3, &mut p7, InputMode::FallingEdge, cfg.clone());
|
let pwm = Pwm::new_input(
|
||||||
|
&mut p.PWM_SLICE3,
|
||||||
|
&mut p7,
|
||||||
|
Pull::None,
|
||||||
|
InputMode::FallingEdge,
|
||||||
|
cfg.clone(),
|
||||||
|
);
|
||||||
assert_eq!(pwm.counter(), 0);
|
assert_eq!(pwm.counter(), 0);
|
||||||
Timer::after_millis(5).await;
|
Timer::after_millis(5).await;
|
||||||
assert_eq!(pwm.counter(), 0);
|
assert_eq!(pwm.counter(), 0);
|
||||||
@ -137,6 +149,34 @@ async fn main(_spawner: Spawner) {
|
|||||||
assert_eq!(pwm.counter(), 1);
|
assert_eq!(pwm.counter(), 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// pull-down
|
||||||
|
{
|
||||||
|
let pin2 = Input::new(&mut p11, Pull::None);
|
||||||
|
Pwm::new_input(
|
||||||
|
&mut p.PWM_SLICE3,
|
||||||
|
&mut p7,
|
||||||
|
Pull::Down,
|
||||||
|
InputMode::FallingEdge,
|
||||||
|
cfg.clone(),
|
||||||
|
);
|
||||||
|
Timer::after_millis(1).await;
|
||||||
|
assert!(pin2.is_low());
|
||||||
|
}
|
||||||
|
|
||||||
|
// pull-up
|
||||||
|
{
|
||||||
|
let pin2 = Input::new(&mut p11, Pull::None);
|
||||||
|
Pwm::new_input(
|
||||||
|
&mut p.PWM_SLICE3,
|
||||||
|
&mut p7,
|
||||||
|
Pull::Up,
|
||||||
|
InputMode::FallingEdge,
|
||||||
|
cfg.clone(),
|
||||||
|
);
|
||||||
|
Timer::after_millis(1).await;
|
||||||
|
assert!(pin2.is_high());
|
||||||
|
}
|
||||||
|
|
||||||
info!("Test OK");
|
info!("Test OK");
|
||||||
cortex_m::asm::bkpt();
|
cortex_m::asm::bkpt();
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user