diff --git a/.gitignore b/.gitignore index ea8c4bf..7bb72ee 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ /target +/cross/target +SDL2.dll \ No newline at end of file diff --git a/cross/Cargo.lock b/cross/Cargo.lock index 76be8ae..02cec6b 100644 --- a/cross/Cargo.lock +++ b/cross/Cargo.lock @@ -115,12 +115,6 @@ version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" -[[package]] -name = "cast" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" - [[package]] name = "cfg-if" version = "1.0.0" @@ -228,9 +222,9 @@ dependencies = [ [[package]] name = "embedded-dma" -version = "0.1.2" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46c8c02e4347a0267ca60813c952017f4c5948c232474c6010a381a337f1bda4" +checksum = "994f7e5b5cb23521c22304927195f236813053eb9c065dd2226a32ba64695446" dependencies = [ "stable_deref_trait", ] @@ -277,6 +271,34 @@ dependencies = [ "num-traits", ] +[[package]] +name = "fugit" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6d8595783d5ca52f0e9830036b3d24f359fae0fcc6bb5fde41f2dd82997cb58" +dependencies = [ + "gcd", +] + +[[package]] +name = "fugit-timer" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9607bfc4c388f9d629704f56ede4a007546cad417b3bcd6fc7c87dc7edce04a" +dependencies = [ + "fugit", + "nb 1.0.0", +] + +[[package]] +name = "gcd" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f37978dab2ca789938a83b2f8bc1ef32db6633af9051a6cd409eff72cbaaa79a" +dependencies = [ + "paste", +] + [[package]] name = "hash32" version = "0.2.1" @@ -375,6 +397,12 @@ dependencies = [ "rtt-target", ] +[[package]] +name = "paste" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0744126afe1a6dd7f394cb50a716dbe086cb06e255e53d8d0185d82828358fb5" + [[package]] name = "proc-macro-error" version = "1.0.4" @@ -572,16 +600,18 @@ dependencies = [ [[package]] name = "stm32f1xx-hal" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e7c0b74aaa4f324fc561619296ada501d064dcaa176ba4ddeacd03795ad72ed" +checksum = "1232c561785bdbc59a5ab2b28c5c9429cb9ee9b04687133e59d1a34a39426943" dependencies = [ + "bitflags", "bxcan", - "cast", "cortex-m", "cortex-m-rt", "embedded-dma", "embedded-hal", + "fugit", + "fugit-timer", "nb 1.0.0", "stm32-usbd", "stm32f1", diff --git a/cross/Cargo.toml b/cross/Cargo.toml index 409abbc..9f81742 100644 --- a/cross/Cargo.toml +++ b/cross/Cargo.toml @@ -10,7 +10,7 @@ edition = "2021" cortex-m-rtic = "1.0.0" panic-rtt-target = { version = "0.1.2", features = ["cortex-m"] } rtt-target = { version = "0.3.1", features = ["cortex-m"] } -stm32f1xx-hal = { version = "0.8.0", features = ["rt", "stm32f103", "medium"] } +stm32f1xx-hal = { version = "0.9.0", features = ["rt", "stm32f103", "medium"] } ssd1306 = "0.7.0" switch-hal = "0.4.0" bbqueue = "0.5.1" diff --git a/cross/src/bin/ui_example.rs b/cross/src/bin/ui_example.rs index e99713c..9e2b6b8 100644 --- a/cross/src/bin/ui_example.rs +++ b/cross/src/bin/ui_example.rs @@ -22,7 +22,7 @@ mod app { use rtt_target::{rprintln, rtt_init_print}; use stm32f1xx_hal::prelude::*; - use blue_pill_ui::board::{self, Board, CountDownTimer, TIM2, TIM3, Event}; + use blue_pill_ui::board::{self, Board, CounterHz, TIM2, TIM3, Event}; // Defining this struct makes shared resources available to tasks; // they will be initialized by the values returned from `init` and @@ -46,8 +46,8 @@ mod app { led: board::UserLed, encoder: board::Encoder, display: board::Display, - poll_timer: CountDownTimer, - blink_timer: CountDownTimer, + poll_timer: CounterHz, + blink_timer: CounterHz, } // This task does startup config; the peripherals are passed in thanks to @@ -59,7 +59,10 @@ mod app { rprintln!("init begin"); let Board { encoder, display, led, mut poll_timer, mut blink_timer } = Board::init(cx.device); + + poll_timer.start(30.Hz()).unwrap(); poll_timer.listen(Event::Update); + blink_timer.start(2.Hz()).unwrap(); blink_timer.listen(Event::Update); let delta = 0; @@ -99,6 +102,10 @@ mod app { // Since `count` is a local, we can have it initialized with a const expr. #[task(local = [count: u16 = 0, encoder], shared = [update])] fn count_update(mut cx: count_update::Context) { + // Skip update if the idle thread hasn't consumed it yet + if cx.shared.update.lock(|upd| upd.is_some()) { + return; + } let delta = cx.local.encoder.poll_count_delta(); let button_up = cx.local.encoder.poll_button_up(); if button_up { @@ -114,15 +121,15 @@ mod app { count_update::spawn().unwrap(); // Restart the timer and clear the interrupt flag - cx.local.poll_timer.start(60.hz()); - cx.local.poll_timer.clear_update_interrupt_flag(); + cx.local.poll_timer.start(30.Hz()).unwrap(); + cx.local.poll_timer.clear_interrupt(Event::Update); } // Interrupt task for TIM3, the LED blink timer #[task(binds = TIM3, priority = 1, local = [led, blink_timer])] fn tim3(cx: tim3::Context) { cx.local.led.toggle(); - cx.local.blink_timer.start(2.hz()); - cx.local.blink_timer.clear_update_interrupt_flag(); + cx.local.blink_timer.start(2.Hz()).unwrap(); + cx.local.blink_timer.clear_interrupt(Event::Update); } } diff --git a/cross/src/board.rs b/cross/src/board.rs index 030d067..3d31d82 100644 --- a/cross/src/board.rs +++ b/cross/src/board.rs @@ -10,7 +10,7 @@ use hal::{ }; // re-export some of the types from the HAL we're not wrapping -pub use hal::timer::{Event, CountDownTimer}; +pub use hal::timer::{Event, CounterHz}; pub use stm32::{TIM2, TIM3}; use ssd1306::{prelude::*, I2CDisplayInterface, Ssd1306, mode::BufferedGraphicsMode}; @@ -29,8 +29,8 @@ pub struct Board { pub encoder: Encoder, pub display: Display, pub led: UserLed, - pub poll_timer: CountDownTimer, - pub blink_timer: CountDownTimer, + pub poll_timer: CounterHz, + pub blink_timer: CounterHz, } impl Board { @@ -44,12 +44,12 @@ impl Board { let rcc = periphs.RCC.constrain(); let clocks = rcc .cfgr - .use_hse(8.mhz()) - .sysclk(72.mhz()) - .hclk(72.mhz()) - .pclk1(36.mhz()) - .pclk2(72.mhz()) - .adcclk(12.mhz()) + .use_hse(8.MHz()) + .sysclk(72.MHz()) + .hclk(72.MHz()) + .pclk1(36.MHz()) + .pclk2(72.MHz()) + .adcclk(12.MHz()) .freeze(&mut flash.acr); // LED is on pin C13, configure it for output @@ -74,10 +74,9 @@ impl Board { ); // Use TIM2 for the control polling task - let poll_timer = Timer::tim2(periphs.TIM2, &clocks).start_count_down(1.hz()); - + let poll_timer = Timer::new(periphs.TIM2, &clocks).counter_hz(); // Use TIM3 for the LED blinker task - let blink_timer = Timer::tim3(periphs.TIM3, &clocks).start_count_down(2.hz()); + let blink_timer = Timer::new(periphs.TIM3, &clocks).counter_hz(); // I2C for display is on gpiob B10 and B11 let scl = gpiob.pb10.into_alternate_open_drain(&mut gpiob.crh); let sda = gpiob.pb11.into_alternate_open_drain(&mut gpiob.crh); @@ -86,7 +85,7 @@ impl Board { periphs.I2C2, (scl, sda), Mode::Fast { - frequency: 400_000.hz(), + frequency: 400_000.Hz(), duty_cycle: DutyCycle::Ratio2to1, }, clocks, @@ -171,7 +170,7 @@ impl Encoder { mapr: &mut hal::afio::MAPR, &clocks: &hal::rcc::Clocks, ) -> Self { - let qei = Timer::tim4(timer, &clocks) + let qei = Timer::new(timer, &clocks) .qei((clk_pin, dt_pin), mapr, QeiOptions::default()); let button = button_pin.into_active_low_switch();