From c7755c4f8bd4649a0b2a05593c0bd4616edad596 Mon Sep 17 00:00:00 2001 From: Michael Droogleever Date: Thu, 22 Nov 2018 20:51:52 +0100 Subject: [PATCH 1/2] demo use of PR#12 in nrf51-hal --- examples/gpio_hal_blinky.rs | 4 +- examples/led_blocking.rs | 5 +- examples/test_countdown.rs | 153 ++++++++++++++++++++++ examples/test_delay.rs | 80 ++++++++++++ examples/test_timer.rs | 246 ++++++++++++++++++++++++++++++++++++ src/led.rs | 11 +- 6 files changed, 491 insertions(+), 8 deletions(-) create mode 100644 examples/test_countdown.rs create mode 100644 examples/test_delay.rs create mode 100644 examples/test_timer.rs diff --git a/examples/gpio_hal_blinky.rs b/examples/gpio_hal_blinky.rs index a7f0aa1..958faf9 100644 --- a/examples/gpio_hal_blinky.rs +++ b/examples/gpio_hal_blinky.rs @@ -5,7 +5,7 @@ extern crate cortex_m_rt; extern crate microbit; extern crate panic_halt; -use microbit::hal::delay::Delay; +use microbit::hal::delay::{Timer, Generic, TIMER0}; use microbit::hal::prelude::*; use cortex_m_rt::entry; @@ -14,7 +14,7 @@ use cortex_m_rt::entry; fn main() -> ! { if let Some(p) = microbit::Peripherals::take() { let mut gpio = p.GPIO.split(); - let mut delay = Delay::new(p.TIMER0); + let mut delay = Timer::::new(p.TIMER0, 4).into_delay(); let mut led = gpio.pin13.into_push_pull_output(); let _ = gpio.pin4.into_push_pull_output(); diff --git a/examples/led_blocking.rs b/examples/led_blocking.rs index 67522e2..dac80d9 100644 --- a/examples/led_blocking.rs +++ b/examples/led_blocking.rs @@ -9,10 +9,11 @@ use core::fmt::Write; use cortex_m_rt::entry; -use microbit::hal::delay::Delay; +use microbit::hal::timer::{Timer, Generic}; use microbit::hal::prelude::*; use microbit::hal::serial; use microbit::hal::serial::BAUD115200; +use microbit::nrf51::TIMER0; use microbit::led; @@ -20,7 +21,7 @@ use microbit::led; fn main() -> ! { if let Some(p) = microbit::Peripherals::take() { let mut gpio = p.GPIO.split(); - let mut delay = Delay::new(p.TIMER0); + let mut delay = Timer::::new(p.TIMER0, 4).into_delay(); // Display let row1 = gpio.pin13.into_push_pull_output(); diff --git a/examples/test_countdown.rs b/examples/test_countdown.rs new file mode 100644 index 0000000..9c8e22a --- /dev/null +++ b/examples/test_countdown.rs @@ -0,0 +1,153 @@ +#![no_main] +#![no_std] + +extern crate cortex_m_rt; +extern crate microbit; +extern crate panic_halt; + +use core::time::Duration; +use cortex_m_rt::entry; +use microbit::hal::prelude::*; +use microbit::hal::timer::{Timer, Generic}; +use microbit::hal::hal::timer::CountDown; +use microbit::nrf51::{TIMER0, TIMER1, TIMER2, RTC0, RTC1}; +use microbit::nb::block; + +/* +@startuml + +scale 500 as 60 pixels +skinparam monochrome reverse + +robust "LED light" as LED +concise "Timer 2" as TIMER2 +concise "Timer 1" as TIMER1 +concise "Timer 0" as TIMER0 +concise "RTC 1" as RTC1 +concise "RTC 0" as RTC0 + +LED is Off + +@0 +TIMER2 is 500ms +TIMER1 is 1000ms +TIMER0 is 1500ms +RTC1 is 4000ms +RTC0 is 5000ms + +@+500 +LED is On +TIMER2 is " " +TIMER2 -> LED + +@+500 +LED is Off +TIMER2 is " " +TIMER1 is 1000ms +TIMER1 -> LED + +@+500 +LED is On +TIMER2 is " " +TIMER0 is 1500ms +TIMER0 -> LED + +@+500 +LED is Off +TIMER2 is 500ms +TIMER1 is " " +TIMER1 -> LED + +@+500 +LED is On +TIMER2 is " " +TIMER2 -> LED + +@+500 +LED is Off +TIMER2 is " " +TIMER1 is " " +TIMER0 is " " +TIMER0 -> LED + +@4000 +LED is On +RTC1 is " " +RTC1 -> LED + +@5000 +LED is Off +RTC0 is " " +RTC0 -> LED + +@enduml +*/ + +#[entry] +fn main() -> ! { + if let Some(p) = microbit::Peripherals::take() { + + // Start the LFCLK + p.CLOCK.tasks_lfclkstart.write(|w| unsafe { w.bits(1) }); + + let mut gpio = p.GPIO.split(); + + let mut pin = gpio.pin14.into_push_pull_output(); + let _ = gpio.pin6.into_push_pull_output(); + + // 32bits @ 1MHz = ~72 minutes + let mut timer0 = Timer::::new(p.TIMER0, 4).into_countdown(); + // 16bits @ 31.25kHz = ~2 seconds + let mut timer1 = Timer::::new(p.TIMER1, 9).into_countdown(); + // 16bits @ 31.25kHz = ~2 seconds + let mut timer2 = Timer::::new(p.TIMER2, 9).into_countdown(); + + // 24bits @ 32.768kHz = 512 seconds + let mut rtc0 = Timer::::new(p.RTC0, 0).into_countdown(); + // 24bits @ 32.768kHz = 512 seconds + let mut rtc1 = Timer::::new(p.RTC1, 0).into_countdown(); + + CountDown::start(&mut rtc0, Duration::from_millis(5_000)); + CountDown::start(&mut rtc1, Duration::from_millis(4_000)); + + CountDown::start(&mut timer0, Duration::from_millis(1_500)); + CountDown::start(&mut timer1, Duration::from_millis(1_000)); + CountDown::start(&mut timer2, Duration::from_millis(500)); + + // @+500 + block!(timer2.wait()); + pin.set_high(); + + // @+500 + block!(timer1.wait()); + pin.set_low(); + + // @+500 + block!(timer0.wait()); + pin.set_high(); + + // @+500 + block!(timer1.wait()); + pin.set_low(); + CountDown::start(&mut timer2, Duration::from_millis(500)); + + // @+500 + block!(timer2.wait()); + pin.set_high(); + + // @+500 + block!(timer0.wait()); + pin.set_low(); + + // @4000 + block!(rtc1.wait()); + pin.set_high(); + + // @5000 + block!(rtc0.wait()); + pin.set_low(); + + } + + panic!("FIN"); +} diff --git a/examples/test_delay.rs b/examples/test_delay.rs new file mode 100644 index 0000000..7c6feaa --- /dev/null +++ b/examples/test_delay.rs @@ -0,0 +1,80 @@ +#![no_main] +#![no_std] + +extern crate cortex_m_rt; +extern crate microbit; +extern crate panic_halt; + +use cortex_m_rt::entry; +use microbit::hal::prelude::*; +use microbit::hal::delay::{Timer, Generic}; +use microbit::nrf51::{TIMER0, TIMER1, TIMER2, RTC0, RTC1}; + +#[entry] +fn main() -> ! { + if let Some(p) = microbit::Peripherals::take() { + + // Start the LFCLK + p.CLOCK.tasks_lfclkstart.write(|w| unsafe { w.bits(1) }); + + let mut gpio = p.GPIO.split(); + + let mut pin = gpio.pin14.into_push_pull_output(); + let _ = gpio.pin6.into_push_pull_output(); + + // 32bits @ 1MHz = ~72 minutes + let mut delay_timer0 = Timer::::new(p.TIMER0, 4).into_delay(); + // 16bits @ 31.25kHz = ~2 seconds + let mut delay_timer1 = Timer::::new(p.TIMER1, 9).into_delay(); + // 16bits @ 31.25kHz = ~2 seconds + let mut delay_timer2 = Timer::::new(p.TIMER2, 9).into_delay(); + + // 24bits @ 32.768kHz = 512 seconds + let mut delay_rtc3 = Timer::::new(p.RTC0, 0).into_delay(); + // 24bits @ 32.768kHz = 512 seconds + let mut delay_rtc4 = Timer::::new(p.RTC1, 0).into_delay(); + + const LONG: u16 = 800; + const SHORT: u16 = 400; + + for _ in 0..2 { + + for _ in 0..2 { + pin.set_high(); + delay_timer0.delay_ms(LONG); + pin.set_low(); + delay_timer0.delay_ms(SHORT); + } + + for _ in 0..2 { + pin.set_high(); + delay_timer1.delay_ms(LONG); + pin.set_low(); + delay_timer1.delay_ms(SHORT); + } + + for _ in 0..2 { + pin.set_high(); + delay_timer2.delay_ms(LONG); + pin.set_low(); + delay_timer2.delay_ms(SHORT); + } + + for _ in 0..2 { + pin.set_high(); + delay_rtc3.delay_ms(LONG); + pin.set_low(); + delay_rtc3.delay_ms(SHORT); + } + + for _ in 0..2 { + pin.set_high(); + delay_rtc4.delay_ms(LONG); + pin.set_low(); + delay_rtc4.delay_ms(SHORT); + } + } + } + + panic!("FIN"); +} diff --git a/examples/test_timer.rs b/examples/test_timer.rs new file mode 100644 index 0000000..ec3dad1 --- /dev/null +++ b/examples/test_timer.rs @@ -0,0 +1,246 @@ +#![no_main] +#![no_std] + +extern crate cortex_m_rt; +extern crate microbit; +extern crate panic_halt; + +use core::time::Duration; +use cortex_m_rt::entry; +use microbit::hal::prelude::*; +use microbit::hal::timer_counter::{Timer, TimerCounter, Generic, Hfticks, Lfticks}; +use microbit::nrf51::{TIMER0, TIMER1, TIMER2, RTC0, RTC1}; +use microbit::nb::block; + +/* +@startuml + +scale 500 as 60 pixels +skinparam monochrome reverse + +robust "LED light" as LED +concise "Timer 2" as TIMER2 +concise "Timer 1" as TIMER1 +concise "Timer 0" as TIMER0 +concise "RTC 1" as RTC1 +concise "RTC 0" as RTC0 + +LED is Off + +@0 +TIMER2 is 500ms +TIMER1 is " " +TIMER0 is 4000ms +RTC1 is 7.5s +RTC0 is 8.0s + +@500 +LED is On +TIMER2 is " " +TIMER2 -> LED +TIMER2 -> TIMER1@+100: clear +TIMER1 is 800ms + +@+800 +LED is Off +TIMER1 is " " +TIMER1 -> LED + +@2000 + +@2097 +TIMER2 is 500ms + +@+500 +LED is On +TIMER2 is " " +TIMER2 -> LED +TIMER1 is 800ms + +@+800 +LED is Off +TIMER1 is " " +TIMER1 -> LED + +@4000 +TIMER2 is 500ms +TIMER1 is 800ms +TIMER0 is " " +TIMER0 -> TIMER2 : clear +TIMER0 -> TIMER1 : clear + +@4500 +LED is On +TIMER2 is 500ms +TIMER2 -> LED + +@4800 +TIMER1 is "stop" + +@5000 +LED is Off +TIMER2 is 500ms +TIMER2 -> LED + +@5500 +LED is On +TIMER2 is 500ms + +@+20 +LED is Off +TIMER1 -> LED : compare +LED -> TIMER1 + +@6000 +LED is On +TIMER2 is 500ms + +@6320 +TIMER1 -> LED +LED -> TIMER1 : compare \n not set + +@6500 +LED is Off +TIMER2 is 500ms + +@7500 +LED is On +RTC1 is " " +RTC1 -> LED + +@8000 +LED is Off +RTC0 is " " +RTC0 -> LED + +TIMER2@0 <-> @+2097 : Overflow +TIMER1@500 <-> @+2097 : Overflow + +LED@4999 <-> @+500 +LED@5500 <-> @+500: 500ms +LED@6000 <-> @+500 +TIMER1@5520 <-> @+800: 800ms + +@enduml +*/ + +#[entry] +fn main() -> ! { + if let Some(p) = microbit::Peripherals::take() { + + // Start the LFCLK + p.CLOCK.tasks_lfclkstart.write(|w| unsafe { w.bits(1) }); + + let mut gpio = p.GPIO.split(); + + let mut pin = gpio.pin14.into_push_pull_output(); + let _ = gpio.pin6.into_push_pull_output(); + + // 32bits @ 1MHz = ~72 minutes + let mut timer0 = Timer::::new(p.TIMER0, 4); + // 16bits @ 31.25kHz = ~2 seconds + let mut timer1 = Timer::::new(p.TIMER1, 9); + // 16bits @ 31.25kHz = ~2 seconds + let mut timer2 = Timer::::new(p.TIMER2, 9); + + // 24bits @ 32.768kHz = 512 seconds + let mut rtc0 = Timer::::new(p.RTC0, 0); + // 24bits @ 32.768kHz = 512 seconds + let mut rtc1 = Timer::::new(p.RTC1, 0); + + let compare0 = Hfticks::from(Duration::from_millis(4_000)) + .checked_mul(timer0.frequency()) + .expect("ticks to compare value overflow"); + timer0.set_compare_start(0, compare0).unwrap(); + + let compare1 = Hfticks::from(Duration::from_millis(800)) + .checked_mul(timer1.frequency()) + .expect("ticks to compare value overflow"); + timer1.set_compare_start(0, compare1).unwrap(); + + let compare2 = Hfticks::from(Duration::from_millis(500)) + .checked_mul(timer2.frequency()) + .expect("ticks to compare value overflow"); + timer2.set_compare_start(0, compare2).unwrap(); + + let compare0 = Lfticks::from(Duration::from_millis(8_000)) + .checked_mul(rtc0.frequency()) + .expect("ticks to compare value overflow"); + rtc0.set_compare_start(0, compare0).unwrap(); + + let compare0 = Lfticks::from(Duration::from_millis(7_500)) + .checked_mul(rtc1.frequency()) + .expect("ticks to compare value overflow"); + rtc1.set_compare_start(0, compare0).unwrap(); + + // @500 + block!(timer2.nb_wait(0)); + pin.set_high(); + timer1.task_clear(); + + // @800 + block!(timer1.nb_wait(0)); + pin.set_low(); + + // @2097 + // Counter rolls over + + // @+500 + block!(timer2.nb_wait(0)); + pin.set_high(); + + // @+800 + block!(timer1.nb_wait(0)); + pin.set_low(); + + // @4000 + block!(timer0.nb_wait(0)); + // Setup to test stop and clear on interrupt + timer1.set_compare_int_stop(0); + timer2.set_compare_int_clear(0); + timer1.task_clear(); + timer2.task_clear(); + + // @+500 + block!(timer2.nb_wait(0)); + pin.set_high(); + + // @+500 + block!(timer2.nb_wait(0)); + pin.set_low(); + // timer1 interrupt and stops + + // @+500 + block!(timer2.nb_wait(0)); + pin.set_high(); + + // @+Δ + // timer1 is waiting with the compare event set + // this clears the event, but not the counter + block!(timer1.nb_wait(0)); + pin.set_low(); + + // @+Δ + // timer1 is stopped, compare event does not fire again + assert!(timer1.nb_wait(0) == Err(nb::Error::WouldBlock)); + + // @+500 + block!(timer2.nb_wait(0)); + pin.set_high(); + + // @+500 + block!(timer2.nb_wait(0)); + pin.set_low(); + + // @8000 + block!(rtc0.nb_wait(0)); + pin.set_high(); + + // @8500 + block!(rtc1.nb_wait(0)); + pin.set_low(); + + } + + panic!("FIN"); +} diff --git a/src/led.rs b/src/led.rs index 59e5110..bc618f5 100644 --- a/src/led.rs +++ b/src/led.rs @@ -1,12 +1,13 @@ //! On-board user LEDs -use hal::delay::Delay; +use hal::delay::{Timer, Delay}; +use hal::gpio::{Output, PushPull}; use hal::gpio::gpio::PIN; use hal::gpio::gpio::{ PIN10, PIN11, PIN12, PIN13, PIN14, PIN15, PIN4, PIN5, PIN6, PIN7, PIN8, PIN9, }; -use hal::gpio::{Output, PushPull}; use hal::prelude::*; +use nrf51::TIMER0; type LED = PIN>; @@ -94,13 +95,15 @@ impl Display { } /// Display 5x5 display image for a given duration - pub fn display(&mut self, delay: &mut Delay, led_display: [[u8; 5]; 5], duration_ms: u32) { + pub fn display(&mut self, delay: &mut Timer, led_display: [[u8; 5]; 5], duration_ms: u32) + { let led_matrix = Display::display2matrix(led_display); self.display_pre(delay, led_matrix, duration_ms); } /// Display 3x9 matrix image for a given duration - pub fn display_pre(&mut self, delay: &mut Delay, led_matrix: [[u8; 9]; 3], duration_ms: u32) { + pub fn display_pre(&mut self, delay: &mut Timer, led_matrix: [[u8; 9]; 3], duration_ms: u32) + { // TODO: something more intelligent with timers let loops = duration_ms / (self.rows.len() as u32 * self.delay_ms); for _ in 0..loops { From 007767ed52638d7c31ee58a9ea862cd6d24ef816 Mon Sep 17 00:00:00 2001 From: Michael Droogleever Date: Thu, 22 Nov 2018 20:59:11 +0100 Subject: [PATCH 2/2] add timing diagrams for examples --- examples/test_countdown.png | Bin 0 -> 14147 bytes examples/test_timer.png | Bin 0 -> 27520 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 examples/test_countdown.png create mode 100644 examples/test_timer.png diff --git a/examples/test_countdown.png b/examples/test_countdown.png new file mode 100644 index 0000000000000000000000000000000000000000..a0909ff747b2c1ca7e913be5a89581becb248c4e GIT binary patch literal 14147 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 literal 0 HcmV?d00001 diff --git a/examples/test_timer.png b/examples/test_timer.png new file mode 100644 index 0000000000000000000000000000000000000000..cd47170c49ab137d1cdfee81faad636e9831ef5a GIT binary patch literal 27520 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 Nzs_du)z#aB{{{E3HF*F4 literal 0 HcmV?d00001