From 2eaa561a0a161ae4b43c7c3f14b98d90b4bcbb08 Mon Sep 17 00:00:00 2001 From: "henthe-5@student.ltu.se" <henthe-5@student.ltu.se> Date: Fri, 8 Mar 2019 13:48:08 +0100 Subject: [PATCH] bare10_3 --- examples/bare10.rs | 108 +++++++++++++++++++++++++++++++++++++++------ 1 file changed, 95 insertions(+), 13 deletions(-) diff --git a/examples/bare10.rs b/examples/bare10.rs index bcce5c6..353561a 100644 --- a/examples/bare10.rs +++ b/examples/bare10.rs @@ -14,10 +14,10 @@ use cortex_m::{asm, iprintln}; extern crate stm32f4xx_hal as hal; use crate::hal::prelude::*; use crate::hal::serial::{config::Config, Event, Rx, Serial, Tx}; -use hal::stm32::ITM; - +use hal::stm32::{ITM}; +use hal::gpio::{PushPull, Output, gpioa::PA5}; use nb::block; -use rtfm::app; +use rtfm::{app, Instant}; // Our error type #[derive(Debug)] @@ -33,9 +33,11 @@ const APP: () = { static mut TX: Tx<hal::stm32::USART2> = (); static mut RX: Rx<hal::stm32::USART2> = (); static mut ITM: ITM = (); - + static mut TIMEOFFSET: u32 = 1; + static mut PA5: PA5<Output<PushPull>> = (); + static mut IS_ON: bool = true; // init runs in an interrupt free section> - #[init] + #[init(schedule = [on])] fn init() { let stim = &mut core.ITM.stim[0]; iprintln!(stim, "bare10"); @@ -44,11 +46,12 @@ const APP: () = { // 16 MHz (default, all clocks) let clocks = rcc.cfgr.freeze(); - + let gpioa = device.GPIOA.split(); let tx = gpioa.pa2.into_alternate_af7(); let rx = gpioa.pa3.into_alternate_af7(); // try comment out + let pa5out = gpioa.pa5.into_push_pull_output(); let mut serial = Serial::usart2( device.USART2, @@ -63,16 +66,19 @@ const APP: () = { // Separate out the sender and receiver of the serial port let (tx, rx) = serial.split(); + schedule.on(Instant::now() + 8_000_000.cycles()).unwrap(); // Our split serial TX = tx; RX = rx; + PA5 = pa5out; + // For debugging ITM = core.ITM; } // idle may be interrupted by other interrupt/tasks in the system - #[idle] + #[idle(resources = [ITM])] fn idle() -> ! { loop { asm::wfi(); @@ -83,9 +89,9 @@ const APP: () = { fn trace_data(byte: u8) { let stim = &mut resources.ITM.stim[0]; iprintln!(stim, "data {}", byte); - for _ in 0..10000 { - asm::nop(); - } + // for _ in 0..10000 { + // asm::nop(); + // } } #[task(priority = 1, resources = [ITM])] @@ -94,6 +100,82 @@ const APP: () = { iprintln!(stim, "{:?}", error); } + #[task(priority = 1, capacity = 10, resources = [ITM], spawn = [on, off, set_frequency])] + fn line_interpretor(byte: u8) { + static mut B: [u8; 10] = [0u8; 10]; + static mut ITERATOR: usize = 0; + static mut IS_SET: bool = false; + B[*ITERATOR] = byte; + if *ITERATOR < B.len()-1 { + *ITERATOR += 1; + } else { + B.iter_mut().for_each(|x| *x = 0); + *ITERATOR = 0; + } + + if B.starts_with(&['o' as u8, 'n' as u8, 13]) || B.starts_with(&['o' as u8, 'n' as u8, 10]) { + spawn.on().unwrap(); + B.iter_mut().for_each(|x| *x = 0); + *ITERATOR = 0; + } else if B.starts_with(&['o' as u8, 'f' as u8, 'f' as u8, 13]) || B.starts_with(&['o' as u8, 'f' as u8, 'f' as u8, 10]) { + spawn.off().unwrap(); + B.iter_mut().for_each(|x| *x = 0); + *ITERATOR = 0; + } else if B.starts_with(&['s' as u8, 'e' as u8, 't' as u8, ' ' as u8]) { + *IS_SET = true; + } + + if B.contains(&13) || B.contains(&10) { + if *IS_SET { + let mut value: u32 = 0; + for i2 in &B[4..*ITERATOR-1] { + if i2.is_ascii_digit() { + value = value * 10; + value = value + (u32::from(*i2-48)); + } + if value != 0 { + spawn.set_frequency(value).unwrap(); + } + } + *IS_SET = false; + } + B.iter_mut().for_each(|x| *x = 0); + *ITERATOR = 0; + } + } + + #[task(priority = 4, schedule = [on], resources = [PA5, TIMEOFFSET, IS_ON])] + fn on() { + static mut TOGGLE: bool = false; + + if *TOGGLE { + resources.PA5.set_high(); + } else { + resources.PA5.set_low(); + } + *TOGGLE = !*TOGGLE; + + if *resources.IS_ON { + schedule.on(Instant::now() + (8_000_000 / *resources.TIMEOFFSET).cycles()).unwrap(); + } else { + resources.PA5.set_low(); + *TOGGLE = false; + } + *resources.IS_ON = true; + } + + #[task(priority = 4, schedule = [on], resources = [PA5, IS_ON, TIMEOFFSET], spawn = [set_frequency])] + fn off() { + *resources.IS_ON = false; + } + + #[task(priority = 2, resources = [TIMEOFFSET])] + fn set_frequency(freq: u32) { + resources.TIMEOFFSET.lock(|timeoffset| { + *timeoffset = freq; + }); + } + #[task(priority = 2, resources = [TX], spawn = [trace_error])] fn echo(byte: u8) { let tx = resources.TX; @@ -101,17 +183,16 @@ const APP: () = { if block!(tx.write(byte)).is_err() { let _ = spawn.trace_error(Error::UsartSendOverflow); } - } - #[interrupt(priority = 3, resources = [RX], spawn = [trace_data, trace_error, echo])] + #[interrupt(priority = 3, resources = [RX], spawn = [line_interpretor, trace_error, echo])] fn USART2() { let rx = resources.RX; match rx.read() { Ok(byte) => { let _ = spawn.echo(byte); - if spawn.trace_data(byte).is_err() { + if spawn.line_interpretor(byte).is_err() { let _ = spawn.trace_error(Error::RingBufferOverflow); } } @@ -126,6 +207,7 @@ const APP: () = { extern "C" { fn EXTI0(); fn EXTI1(); + fn EXTI2(); } }; -- GitLab