diff options
Diffstat (limited to 'examples/rp/src/bin/pio_async.rs')
| -rw-r--r-- | examples/rp/src/bin/pio_async.rs | 34 |
1 files changed, 19 insertions, 15 deletions
diff --git a/examples/rp/src/bin/pio_async.rs b/examples/rp/src/bin/pio_async.rs index 1b075b8fd..5fea7034b 100644 --- a/examples/rp/src/bin/pio_async.rs +++ b/examples/rp/src/bin/pio_async.rs | |||
| @@ -4,15 +4,13 @@ | |||
| 4 | use defmt::info; | 4 | use defmt::info; |
| 5 | use embassy_executor::Spawner; | 5 | use embassy_executor::Spawner; |
| 6 | use embassy_rp::gpio::{AnyPin, Pin}; | 6 | use embassy_rp::gpio::{AnyPin, Pin}; |
| 7 | use embassy_rp::pio::{ | 7 | use embassy_rp::peripherals::PIO0; |
| 8 | Pio0, PioCommon, PioCommonInstance, PioPeripheral, PioStateMachine, PioStateMachineInstance, ShiftDirection, Sm0, | 8 | use embassy_rp::pio::{Pio, PioCommon, PioStateMachine, PioStateMachineInstance, ShiftDirection}; |
| 9 | Sm1, Sm2, | ||
| 10 | }; | ||
| 11 | use embassy_rp::pio_instr_util; | 9 | use embassy_rp::pio_instr_util; |
| 12 | use embassy_rp::relocate::RelocatedProgram; | 10 | use embassy_rp::relocate::RelocatedProgram; |
| 13 | use {defmt_rtt as _, panic_probe as _}; | 11 | use {defmt_rtt as _, panic_probe as _}; |
| 14 | 12 | ||
| 15 | fn setup_pio_task_sm0(pio: &mut PioCommonInstance<Pio0>, sm: &mut PioStateMachineInstance<Pio0, Sm0>, pin: AnyPin) { | 13 | fn setup_pio_task_sm0(pio: &mut PioCommon<PIO0>, sm: &mut PioStateMachineInstance<PIO0, 0>, pin: AnyPin) { |
| 16 | // Setup sm0 | 14 | // Setup sm0 |
| 17 | 15 | ||
| 18 | // Send data serially to pin | 16 | // Send data serially to pin |
| @@ -40,7 +38,7 @@ fn setup_pio_task_sm0(pio: &mut PioCommonInstance<Pio0>, sm: &mut PioStateMachin | |||
| 40 | } | 38 | } |
| 41 | 39 | ||
| 42 | #[embassy_executor::task] | 40 | #[embassy_executor::task] |
| 43 | async fn pio_task_sm0(mut sm: PioStateMachineInstance<Pio0, Sm0>) { | 41 | async fn pio_task_sm0(mut sm: PioStateMachineInstance<'static, PIO0, 0>) { |
| 44 | sm.set_enable(true); | 42 | sm.set_enable(true); |
| 45 | 43 | ||
| 46 | let mut v = 0x0f0caffa; | 44 | let mut v = 0x0f0caffa; |
| @@ -51,7 +49,7 @@ async fn pio_task_sm0(mut sm: PioStateMachineInstance<Pio0, Sm0>) { | |||
| 51 | } | 49 | } |
| 52 | } | 50 | } |
| 53 | 51 | ||
| 54 | fn setup_pio_task_sm1(pio: &mut PioCommonInstance<Pio0>, sm: &mut PioStateMachineInstance<Pio0, Sm1>) { | 52 | fn setup_pio_task_sm1(pio: &mut PioCommon<PIO0>, sm: &mut PioStateMachineInstance<PIO0, 1>) { |
| 55 | // Setupm sm1 | 53 | // Setupm sm1 |
| 56 | 54 | ||
| 57 | // Read 0b10101 repeatedly until ISR is full | 55 | // Read 0b10101 repeatedly until ISR is full |
| @@ -70,7 +68,7 @@ fn setup_pio_task_sm1(pio: &mut PioCommonInstance<Pio0>, sm: &mut PioStateMachin | |||
| 70 | } | 68 | } |
| 71 | 69 | ||
| 72 | #[embassy_executor::task] | 70 | #[embassy_executor::task] |
| 73 | async fn pio_task_sm1(mut sm: PioStateMachineInstance<Pio0, Sm1>) { | 71 | async fn pio_task_sm1(mut sm: PioStateMachineInstance<'static, PIO0, 1>) { |
| 74 | sm.set_enable(true); | 72 | sm.set_enable(true); |
| 75 | loop { | 73 | loop { |
| 76 | let rx = sm.wait_pull().await; | 74 | let rx = sm.wait_pull().await; |
| @@ -78,7 +76,7 @@ async fn pio_task_sm1(mut sm: PioStateMachineInstance<Pio0, Sm1>) { | |||
| 78 | } | 76 | } |
| 79 | } | 77 | } |
| 80 | 78 | ||
| 81 | fn setup_pio_task_sm2(pio: &mut PioCommonInstance<Pio0>, sm: &mut PioStateMachineInstance<Pio0, Sm2>) { | 79 | fn setup_pio_task_sm2(pio: &mut PioCommon<PIO0>, sm: &mut PioStateMachineInstance<PIO0, 2>) { |
| 82 | // Setup sm2 | 80 | // Setup sm2 |
| 83 | 81 | ||
| 84 | // Repeatedly trigger IRQ 3 | 82 | // Repeatedly trigger IRQ 3 |
| @@ -102,7 +100,7 @@ fn setup_pio_task_sm2(pio: &mut PioCommonInstance<Pio0>, sm: &mut PioStateMachin | |||
| 102 | } | 100 | } |
| 103 | 101 | ||
| 104 | #[embassy_executor::task] | 102 | #[embassy_executor::task] |
| 105 | async fn pio_task_sm2(mut sm: PioStateMachineInstance<Pio0, Sm2>) { | 103 | async fn pio_task_sm2(mut sm: PioStateMachineInstance<'static, PIO0, 2>) { |
| 106 | sm.set_enable(true); | 104 | sm.set_enable(true); |
| 107 | loop { | 105 | loop { |
| 108 | sm.wait_irq(3).await; | 106 | sm.wait_irq(3).await; |
| @@ -115,11 +113,17 @@ async fn main(spawner: Spawner) { | |||
| 115 | let p = embassy_rp::init(Default::default()); | 113 | let p = embassy_rp::init(Default::default()); |
| 116 | let pio = p.PIO0; | 114 | let pio = p.PIO0; |
| 117 | 115 | ||
| 118 | let (mut pio0, mut sm0, mut sm1, mut sm2, ..) = pio.split(); | 116 | let Pio { |
| 119 | 117 | mut common, | |
| 120 | setup_pio_task_sm0(&mut pio0, &mut sm0, p.PIN_0.degrade()); | 118 | mut sm0, |
| 121 | setup_pio_task_sm1(&mut pio0, &mut sm1); | 119 | mut sm1, |
| 122 | setup_pio_task_sm2(&mut pio0, &mut sm2); | 120 | mut sm2, |
| 121 | .. | ||
| 122 | } = Pio::new(pio); | ||
| 123 | |||
| 124 | setup_pio_task_sm0(&mut common, &mut sm0, p.PIN_0.degrade()); | ||
| 125 | setup_pio_task_sm1(&mut common, &mut sm1); | ||
| 126 | setup_pio_task_sm2(&mut common, &mut sm2); | ||
| 123 | spawner.spawn(pio_task_sm0(sm0)).unwrap(); | 127 | spawner.spawn(pio_task_sm0(sm0)).unwrap(); |
| 124 | spawner.spawn(pio_task_sm1(sm1)).unwrap(); | 128 | spawner.spawn(pio_task_sm1(sm1)).unwrap(); |
| 125 | spawner.spawn(pio_task_sm2(sm2)).unwrap(); | 129 | spawner.spawn(pio_task_sm2(sm2)).unwrap(); |
