diff --git a/examples/bare7.rs b/examples/bare7.rs index 97f5d21d973ca174fc2f19d9dc40a3623006661b..3abdf49c061b211ed603d8f5bc33d57d713880d4 100644 --- a/examples/bare7.rs +++ b/examples/bare7.rs @@ -1,39 +1,55 @@ //! Serial interface loopback #![deny(unsafe_code)] -#![deny(warnings)] +//#![deny(warnings)] #![feature(proc_macro)] #![no_std] extern crate cortex_m_rtfm as rtfm; extern crate f4; +extern crate heapless; + +#[macro_use(block)] +extern crate nb; + +#[macro_use] +extern crate cortex_m_debug; use f4::prelude::*; use f4::Serial; -use f4::serial::Event; use f4::time::Hertz; +use heapless::Vec; use rtfm::{app, Threshold}; // CONFIGURATION const BAUD_RATE: Hertz = Hertz(115_200); -// TASKS & RESOURCES +// RTFM FRAMEWORK app! { device: f4::stm32f40x, - - tasks: { - USART2: { - path: loopback, - resources: [USART2], - }, - } } +// static BUFFER: Vec<u8, [u8; 8]> = Vec::new(); -// INITIALIZATION PHASE +// Init executes with interrupts disabled +// Hence its safe to access all peripherals (no race-conditions) +// +// In this case init will never return +// This is not the typical use-case as we will see later fn init(p: init::Peripherals) { + ipln!("init"); let serial = Serial(p.USART2); serial.init(BAUD_RATE.invert(), None, p.GPIOA, p.RCC); - serial.listen(Event::Rxne); + + let mut buffer: Vec<u8, [u8; 4]> = Vec::new(); + loop { + if let Ok(byte) = block!(serial.read()) { + buffer.push(byte); + ipln!("Ok {:?}", buffer); + block!(serial.write(byte)).ok(); + } else { + ipln!("Error"); + } + } } // IDLE LOOP @@ -44,15 +60,6 @@ fn idle() -> ! { } } -// TASKS -// Send back the received byte -fn loopback(_t: &mut Threshold, r: USART2::Resources) { - let serial = Serial(&**r.USART2); - - let byte = serial.read().unwrap(); - serial.write(byte).unwrap(); -} - // 1. compile and run the project at 16MHz // make sure its running (not paused) // start a terminal program, e.g., `moserial`