Skip to content

Commit dd23318

Browse files
authored
Merge pull request #583 from A-Young-Git/refactor-discovery-code
07-uart code refactor
2 parents c7b5256 + fec0e5b commit dd23318

File tree

4 files changed

+72
-30
lines changed

4 files changed

+72
-30
lines changed

microbit/src/07-uart/Cargo.toml

+9-7
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,24 @@ authors = ["Henrik Böving <[email protected]>"]
55
edition = "2018"
66

77
[dependencies.microbit-v2]
8-
version = "0.12.0"
8+
version = "0.15.1"
99
optional = true
1010

1111
[dependencies.microbit]
12-
version = "0.12.0"
12+
version = "0.15.1"
1313
optional = true
1414

1515
[dependencies]
16-
cortex-m = "0.7.3"
16+
cortex-m = { version = "0.7.7", features = ["critical-section-single-core"] }
1717
cortex-m-rt = "0.7.0"
18-
rtt-target = { version = "0.3.1", features = ["cortex-m"] }
18+
rtt-target = "0.5.0"
1919
panic-rtt-target = { version = "0.1.2", features = ["cortex-m"] }
2020
nb = "1.0.0"
21-
heapless = "0.7.10"
22-
embedded-hal = "0.2.6"
21+
heapless = "0.8.0"
22+
embedded-hal = "1.0.0"
23+
embedded-hal-nb = "1.0.0"
24+
embedded-io = "0.6.1"
2325

2426
[features]
2527
v2 = ["microbit-v2"]
26-
v1 = ["microbit"]
28+
v1 = ["microbit"]

microbit/src/07-uart/Embed.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
[default.general]
2-
# chip = "nrf52833_xxAA" # uncomment this line for micro:bit V2
2+
chip = "nrf52833_xxAA" # uncomment this line for micro:bit V2
33
# chip = "nrf51822_xxAA" # uncomment this line for micro:bit V1
44

55
[default.reset]

microbit/src/07-uart/src/main.rs

+21-5
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
#![no_std]
33

44
use cortex_m_rt::entry;
5-
use rtt_target::rtt_init_print;
65
use panic_rtt_target as _;
6+
use rtt_target::rtt_init_print;
77

88
#[cfg(feature = "v1")]
99
use microbit::{
@@ -19,6 +19,12 @@ use microbit::{
1919
hal::uarte::{Baudrate, Parity},
2020
};
2121

22+
#[cfg(feature = "v1")]
23+
use embedded_io::Write;
24+
25+
#[cfg(feature = "v2")]
26+
use embedded_hal_nb::serial::Write;
27+
2228
#[cfg(feature = "v2")]
2329
mod serial_setup;
2430
#[cfg(feature = "v2")]
@@ -31,16 +37,19 @@ fn main() -> ! {
3137

3238
#[cfg(feature = "v1")]
3339
let mut serial = {
34-
uart::Uart::new(
40+
// Set up UART for microbit v1
41+
let serial = uart::Uart::new(
3542
board.UART0,
3643
board.uart.into(),
3744
Parity::EXCLUDED,
3845
Baudrate::BAUD115200,
39-
)
46+
);
47+
serial
4048
};
4149

4250
#[cfg(feature = "v2")]
4351
let mut serial = {
52+
// Set up UARTE for microbit v2 using UartePort wrapper
4453
let serial = uarte::Uarte::new(
4554
board.UARTE0,
4655
board.uart.into(),
@@ -50,8 +59,15 @@ fn main() -> ! {
5059
UartePort::new(serial)
5160
};
5261

53-
nb::block!(serial.write(b'X')).unwrap();
54-
nb::block!(serial.flush()).unwrap();
62+
// Write a byte and flush
63+
#[cfg(feature = "v1")]
64+
serial.write(&[b'X']).unwrap(); // Adjusted for UART on v1, no need for nb::block!
65+
66+
#[cfg(feature = "v2")]
67+
{
68+
nb::block!(serial.write(b'X')).unwrap();
69+
nb::block!(serial.flush()).unwrap();
70+
}
5571

5672
loop {}
5773
}
+41-17
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
use core::fmt;
2-
use embedded_hal::blocking::serial as bserial;
3-
use embedded_hal::serial;
4-
use microbit::hal::uarte::{Error, Instance, Uarte, UarteRx, UarteTx};
2+
use core::ptr::addr_of_mut;
3+
use embedded_hal_nb::nb;
4+
use embedded_hal_nb::serial::{Error as SerialError, ErrorType, Read, Write};
5+
use embedded_io::{Read as EmbeddedIoRead, Write as EmbeddedIoWrite};
6+
use microbit::hal::uarte::{Instance, Uarte, UarteRx, UarteTx};
57

68
static mut TX_BUF: [u8; 1] = [0; 1];
79
static mut RX_BUF: [u8; 1] = [0; 1];
@@ -11,36 +13,58 @@ pub struct UartePort<T: Instance>(UarteTx<T>, UarteRx<T>);
1113
impl<T: Instance> UartePort<T> {
1214
pub fn new(serial: Uarte<T>) -> UartePort<T> {
1315
let (tx, rx) = serial
14-
.split(unsafe { &mut TX_BUF }, unsafe { &mut RX_BUF })
16+
.split(unsafe { &mut *addr_of_mut!(TX_BUF) }, unsafe {
17+
&mut *addr_of_mut!(RX_BUF)
18+
})
1519
.unwrap();
1620
UartePort(tx, rx)
1721
}
1822
}
1923

20-
impl<T: Instance> fmt::Write for UartePort<T> {
21-
fn write_str(&mut self, s: &str) -> fmt::Result {
22-
self.0.write_str(s)
24+
#[derive(Debug)]
25+
pub enum Error {
26+
Other,
27+
}
28+
29+
impl SerialError for Error {
30+
fn kind(&self) -> embedded_hal_nb::serial::ErrorKind {
31+
embedded_hal_nb::serial::ErrorKind::Other
2332
}
2433
}
2534

26-
impl<T: Instance> serial::Write<u8> for UartePort<T> {
35+
impl<T: Instance> ErrorType for UartePort<T> {
2736
type Error = Error;
37+
}
2838

29-
fn write(&mut self, b: u8) -> nb::Result<(), Self::Error> {
30-
self.0.write(b)
39+
impl<T: Instance> fmt::Write for UartePort<T> {
40+
fn write_str(&mut self, s: &str) -> fmt::Result {
41+
for byte in s.bytes() {
42+
nb::block!(self.write(byte)).map_err(|_| fmt::Error)?;
43+
}
44+
Ok(())
45+
}
46+
}
47+
48+
impl<T: Instance> Write<u8> for UartePort<T> {
49+
fn write(&mut self, word: u8) -> nb::Result<(), Self::Error> {
50+
self.0
51+
.write(&[word])
52+
.map_err(|_| nb::Error::Other(Error::Other))?;
53+
Ok(())
3154
}
3255

3356
fn flush(&mut self) -> nb::Result<(), Self::Error> {
34-
self.0.flush()
57+
self.0.flush().map_err(|_| nb::Error::Other(Error::Other))
3558
}
3659
}
3760

38-
impl<T: Instance> bserial::write::Default<u8> for UartePort<T> {}
39-
40-
impl<T: Instance> serial::Read<u8> for UartePort<T> {
41-
type Error = Error;
42-
61+
impl<T: Instance> Read<u8> for UartePort<T> {
4362
fn read(&mut self) -> nb::Result<u8, Self::Error> {
44-
self.1.read()
63+
let mut buffer = [0u8; 1];
64+
match self.1.read(&mut buffer) {
65+
Ok(1) => Ok(buffer[0]),
66+
Ok(_) => Err(nb::Error::WouldBlock),
67+
Err(_) => Err(nb::Error::Other(Error::Other)),
68+
}
4569
}
4670
}

0 commit comments

Comments
 (0)