aboutsummaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
authorhuntc <[email protected]>2022-01-30 16:21:23 +1100
committerhuntc <[email protected]>2022-01-30 16:21:23 +1100
commit1c67bd46433734d9280e976da33975cf5beb773e (patch)
treea832657ca21a0446769a6c39faedce33045ce9ee /examples
parent482389a6911d8d3505872e6ad03d5b0af565eaf9 (diff)
Revert "Own the sequence buffer"
This reverts commit 482389a6911d8d3505872e6ad03d5b0af565eaf9.
Diffstat (limited to 'examples')
-rw-r--r--examples/nrf/src/bin/pwm_sequence.rs22
-rw-r--r--examples/nrf/src/bin/pwm_sequence_ppi.rs13
-rw-r--r--examples/nrf/src/bin/pwm_sequence_ws2812b.rs33
3 files changed, 36 insertions, 32 deletions
diff --git a/examples/nrf/src/bin/pwm_sequence.rs b/examples/nrf/src/bin/pwm_sequence.rs
index 6fe957d24..6fb861e8f 100644
--- a/examples/nrf/src/bin/pwm_sequence.rs
+++ b/examples/nrf/src/bin/pwm_sequence.rs
@@ -8,13 +8,14 @@ use defmt::*;
8use embassy::executor::Spawner; 8use embassy::executor::Spawner;
9use embassy::time::{Duration, Timer}; 9use embassy::time::{Duration, Timer};
10use embassy_nrf::gpio::NoPin; 10use embassy_nrf::gpio::NoPin;
11use embassy_nrf::pwm::{ 11use embassy_nrf::pwm::{Config, Prescaler, Sequence, SequenceConfig, SequenceMode, SequencePwm};
12 Config, Prescaler, Sequence, SequenceConfig, SequenceMode, SequencePwm, EMPTY_SEQ,
13};
14use embassy_nrf::Peripherals; 12use embassy_nrf::Peripherals;
15 13
16#[embassy::main] 14#[embassy::main]
17async fn main(_spawner: Spawner, p: Peripherals) { 15async fn main(_spawner: Spawner, p: Peripherals) {
16 let mut seq_words_1: [u16; 5] = [1000, 250, 100, 50, 0];
17 let mut seq_words_2: [u16; 5] = [0, 50, 100, 250, 1000];
18
18 let mut config = Config::default(); 19 let mut config = Config::default();
19 config.prescaler = Prescaler::Div128; 20 config.prescaler = Prescaler::Div128;
20 // 1 period is 1000 * (128/16mhz = 0.000008s = 0.008ms) = 8us 21 // 1 period is 1000 * (128/16mhz = 0.000008s = 0.008ms) = 8us
@@ -25,20 +26,25 @@ async fn main(_spawner: Spawner, p: Peripherals) {
25 seq_config.refresh = 624; 26 seq_config.refresh = 624;
26 // thus our sequence takes 5 * 5000ms or 25 seconds 27 // thus our sequence takes 5 * 5000ms or 25 seconds
27 28
28 let seq_1 = Sequence::new([1000, 250, 100, 50, 0], seq_config.clone());
29 let seq_2 = Sequence::new([0, 50, 100, 250, 1000], seq_config);
30
31 let mut pwm = unwrap!(SequencePwm::new( 29 let mut pwm = unwrap!(SequencePwm::new(
32 p.PWM0, p.P0_13, NoPin, NoPin, NoPin, config, 30 p.PWM0, p.P0_13, NoPin, NoPin, NoPin, config,
33 )); 31 ));
34 unwrap!(pwm.start(seq_1, EMPTY_SEQ, SequenceMode::Times(1))); 32 let _ = pwm.start(
33 Sequence::new(&mut seq_words_1, seq_config.clone()),
34 None,
35 SequenceMode::Infinite,
36 );
35 37
36 info!("pwm started!"); 38 info!("pwm started!");
37 39
38 Timer::after(Duration::from_millis(20000)).await; 40 Timer::after(Duration::from_millis(20000)).await;
39 info!("pwm starting with another sequence!"); 41 info!("pwm starting with another sequence!");
40 42
41 unwrap!(pwm.start(seq_2, EMPTY_SEQ, SequenceMode::Times(1))); 43 let _ = pwm.start(
44 Sequence::new(&mut seq_words_2, seq_config),
45 None,
46 SequenceMode::Infinite,
47 );
42 48
43 // we can abort a sequence if we need to before its complete with pwm.stop() 49 // we can abort a sequence if we need to before its complete with pwm.stop()
44 // or stop is also implicitly called when the pwm peripheral is dropped 50 // or stop is also implicitly called when the pwm peripheral is dropped
diff --git a/examples/nrf/src/bin/pwm_sequence_ppi.rs b/examples/nrf/src/bin/pwm_sequence_ppi.rs
index 4883222a8..f5d734bb1 100644
--- a/examples/nrf/src/bin/pwm_sequence_ppi.rs
+++ b/examples/nrf/src/bin/pwm_sequence_ppi.rs
@@ -16,7 +16,7 @@ use embassy_nrf::Peripherals;
16 16
17#[embassy::main] 17#[embassy::main]
18async fn main(_spawner: Spawner, p: Peripherals) { 18async fn main(_spawner: Spawner, p: Peripherals) {
19 let seq_words: [u16; 5] = [1000, 250, 100, 50, 0]; 19 let mut seq_words: [u16; 5] = [1000, 250, 100, 50, 0];
20 20
21 let mut config = Config::default(); 21 let mut config = Config::default();
22 config.prescaler = Prescaler::Div128; 22 config.prescaler = Prescaler::Div128;
@@ -31,12 +31,11 @@ async fn main(_spawner: Spawner, p: Peripherals) {
31 p.PWM0, p.P0_13, NoPin, NoPin, NoPin, config, 31 p.PWM0, p.P0_13, NoPin, NoPin, NoPin, config,
32 )); 32 ));
33 33
34 // If we loop in any way i.e. not Times(1), then we must provide 34 let _ = pwm.start(
35 // the PWM peripheral with two sequences. 35 Sequence::new(&mut seq_words, seq_config),
36 let seq_0 = Sequence::new(seq_words, seq_config); 36 None,
37 let seq_1 = seq_0.clone(); 37 SequenceMode::Infinite,
38 38 );
39 unwrap!(pwm.start(seq_0, seq_1, SequenceMode::Infinite));
40 // pwm.stop() deconfigures pins, and then the task_start_seq0 task cant work 39 // pwm.stop() deconfigures pins, and then the task_start_seq0 task cant work
41 // so its going to have to start running in order load the configuration 40 // so its going to have to start running in order load the configuration
42 41
diff --git a/examples/nrf/src/bin/pwm_sequence_ws2812b.rs b/examples/nrf/src/bin/pwm_sequence_ws2812b.rs
index 8acb209cc..0ce79cbe0 100644
--- a/examples/nrf/src/bin/pwm_sequence_ws2812b.rs
+++ b/examples/nrf/src/bin/pwm_sequence_ws2812b.rs
@@ -30,6 +30,19 @@ const RES: u16 = 0x8000;
30// line is assumed to be P1_05. 30// line is assumed to be P1_05.
31#[embassy::main] 31#[embassy::main]
32async fn main(_spawner: Spawner, p: Peripherals) { 32async fn main(_spawner: Spawner, p: Peripherals) {
33 // Declare the bits of 24 bits
34 let mut color_seq_words = [
35 T0H, T0H, T0H, T0H, T0H, T0H, T0H, T0H, // G
36 T0H, T0H, T0H, T0H, T0H, T0H, T0H, T0H, // R
37 T1H, T1H, T1H, T1H, T1H, T1H, T1H, T1H, // B
38 ];
39 let color_seq = Sequence::new(&mut color_seq_words, SequenceConfig::default());
40
41 let mut reset_seq_words = [RES; 1];
42 let mut reset_seq_config = SequenceConfig::default();
43 reset_seq_config.end_delay = 799; // 50us (20 ticks * 40) - 1 tick because we've already got one RES;
44 let reset_seq = Sequence::new(&mut reset_seq_words, reset_seq_config);
45
33 let mut config = Config::default(); 46 let mut config = Config::default();
34 config.sequence_load = SequenceLoad::Common; 47 config.sequence_load = SequenceLoad::Common;
35 config.prescaler = Prescaler::Div1; 48 config.prescaler = Prescaler::Div1;
@@ -38,21 +51,7 @@ async fn main(_spawner: Spawner, p: Peripherals) {
38 p.PWM0, p.P1_05, NoPin, NoPin, NoPin, config, 51 p.PWM0, p.P1_05, NoPin, NoPin, NoPin, config,
39 )); 52 ));
40 53
41 // Declare the bits of 24 bits 54 unwrap!(pwm.start(color_seq, Some(reset_seq), SequenceMode::Times(2)));
42 let color_seq = Sequence::new(
43 [
44 T0H, T0H, T0H, T0H, T0H, T0H, T0H, T0H, // G
45 T0H, T0H, T0H, T0H, T0H, T0H, T0H, T0H, // R
46 T1H, T1H, T1H, T1H, T1H, T1H, T1H, T1H, // B
47 ],
48 SequenceConfig::default(),
49 );
50
51 let mut reset_seq_config = SequenceConfig::default();
52 reset_seq_config.end_delay = 799; // 50us (20 ticks * 40) - 1 tick because we've already got one RES;
53 let reset_seq = Sequence::new([RES], reset_seq_config);
54
55 unwrap!(pwm.start(color_seq, reset_seq, SequenceMode::Times(2)));
56 55
57 Timer::after(Duration::from_millis(1000)).await; 56 Timer::after(Duration::from_millis(1000)).await;
58 57
@@ -60,9 +59,9 @@ async fn main(_spawner: Spawner, p: Peripherals) {
60 let mut bit_value = T0H; 59 let mut bit_value = T0H;
61 60
62 loop { 61 loop {
63 if let (Some(mut color_seq), Some(reset_seq)) = pwm.stop() { 62 if let (Some(color_seq), Some(reset_seq)) = pwm.stop() {
64 color_seq.words[color_bit] = bit_value; 63 color_seq.words[color_bit] = bit_value;
65 unwrap!(pwm.start(color_seq, reset_seq, SequenceMode::Times(2))); 64 unwrap!(pwm.start(color_seq, Some(reset_seq), SequenceMode::Times(2)));
66 } 65 }
67 66
68 Timer::after(Duration::from_millis(50)).await; 67 Timer::after(Duration::from_millis(50)).await;