Skip to content

Commit 2bc2a93

Browse files
mgottschlagMathias Gottschlag
authored andcommitted
Add support for the USARTS/UARTS/LPUART.
Most of this code has been taken from the stm32g0xx HAL. Changes include: - The types contain the pins. It is possible to destroy Serial objects to reinitialize them with different a different configuration or with different pins at runtime. - The DMA code has been adapted to the different API provided by this HAL.
1 parent 4d6620e commit 2bc2a93

File tree

8 files changed

+1266
-2
lines changed

8 files changed

+1266
-2
lines changed

examples/uart-dma.rs

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
#![deny(warnings)]
2+
#![deny(unsafe_code)]
3+
#![no_main]
4+
#![no_std]
5+
6+
extern crate cortex_m_rt as rt;
7+
8+
use core::fmt::Write;
9+
10+
use hal::dma::{config::DmaConfig, stream::DMAExt, TransferExt};
11+
use hal::prelude::*;
12+
use hal::serial::*;
13+
use hal::{rcc, stm32};
14+
use stm32g4xx_hal as hal;
15+
16+
use cortex_m_rt::entry;
17+
use log::info;
18+
19+
#[macro_use]
20+
mod utils;
21+
22+
#[entry]
23+
fn main() -> ! {
24+
utils::logger::init();
25+
26+
let dp = stm32::Peripherals::take().expect("cannot take peripherals");
27+
28+
let rcc = dp.RCC.constrain();
29+
let mut rcc = rcc.freeze(rcc::Config::hsi());
30+
31+
let streams = dp.DMA1.split(&rcc);
32+
let config = DmaConfig::default()
33+
.transfer_complete_interrupt(false)
34+
.circular_buffer(false)
35+
.memory_increment(true);
36+
37+
info!("Init UART");
38+
let gpioa = dp.GPIOA.split(&mut rcc);
39+
let tx = gpioa.pa2.into_alternate();
40+
let rx = gpioa.pa3.into_alternate();
41+
let mut usart = dp
42+
.USART2
43+
.usart(
44+
tx,
45+
rx,
46+
FullConfig::default().baudrate(115200.bps()),
47+
&mut rcc,
48+
)
49+
.unwrap();
50+
51+
let mut led = gpioa.pa5.into_push_pull_output();
52+
53+
info!("Start writing");
54+
55+
writeln!(usart, "Hello without DMA\r\n").unwrap();
56+
57+
let tx_buffer = cortex_m::singleton!(: [u8; 16] = *b"Hello with DMA!\n").unwrap();
58+
59+
let (tx, _rx) = usart.split();
60+
61+
// Setup DMA for USART1 TX with dma channel 1.
62+
let mut transfer =
63+
streams
64+
.0
65+
.into_memory_to_peripheral_transfer(tx.enable_dma(), &mut tx_buffer[..], config);
66+
67+
loop {
68+
transfer.start(|_tx| {});
69+
while !transfer.get_transfer_complete_flag() {}
70+
71+
led.toggle().unwrap();
72+
}
73+
}

examples/uart-fifo.rs

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
#![deny(warnings)]
2+
#![deny(unsafe_code)]
3+
#![no_main]
4+
#![no_std]
5+
6+
extern crate cortex_m_rt as rt;
7+
8+
use core::fmt::Write;
9+
10+
use hal::prelude::*;
11+
use hal::serial::*;
12+
use hal::{rcc, stm32};
13+
use stm32g4xx_hal as hal;
14+
15+
use cortex_m_rt::entry;
16+
use log::info;
17+
18+
#[macro_use]
19+
mod utils;
20+
21+
#[entry]
22+
fn main() -> ! {
23+
utils::logger::init();
24+
25+
info!("start");
26+
let dp = stm32::Peripherals::take().expect("cannot take peripherals");
27+
let mut rcc = dp.RCC.freeze(rcc::Config::hsi());
28+
29+
info!("Init UART");
30+
let gpioa = dp.GPIOA.split(&mut rcc);
31+
let tx = gpioa.pa2.into_alternate();
32+
let rx = gpioa.pa3.into_alternate();
33+
let mut usart = dp
34+
.USART2
35+
.usart(
36+
tx,
37+
rx,
38+
FullConfig::default()
39+
.baudrate(115200.bps())
40+
.fifo_enable()
41+
.rx_fifo_enable_interrupt()
42+
.rx_fifo_threshold(FifoThreshold::FIFO_4_BYTES),
43+
&mut rcc,
44+
)
45+
.unwrap();
46+
47+
writeln!(usart, "Hello USART2\r\n").unwrap();
48+
49+
let (mut tx1, mut rx1) = usart.split();
50+
51+
let mut cnt = 0;
52+
loop {
53+
if rx1.fifo_threshold_reached() {
54+
loop {
55+
match rx1.read() {
56+
Err(nb::Error::WouldBlock) => {
57+
// no more data available in fifo
58+
break;
59+
}
60+
Err(nb::Error::Other(_err)) => {
61+
// Handle other error Overrun, Framing, Noise or Parity
62+
}
63+
Ok(byte) => {
64+
writeln!(tx1, "{}: {}\n", cnt, byte).unwrap();
65+
cnt += 1;
66+
}
67+
}
68+
}
69+
}
70+
}
71+
}

examples/uart.rs

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
#![deny(warnings)]
2+
#![deny(unsafe_code)]
3+
#![no_main]
4+
#![no_std]
5+
6+
use core::fmt::Write;
7+
8+
use hal::prelude::*;
9+
use hal::serial::FullConfig;
10+
use hal::{rcc, stm32};
11+
use stm32g4xx_hal as hal;
12+
13+
use cortex_m_rt::entry;
14+
use log::info;
15+
use nb::block;
16+
17+
#[macro_use]
18+
mod utils;
19+
20+
#[entry]
21+
fn main() -> ! {
22+
utils::logger::init();
23+
24+
info!("start");
25+
let dp = stm32::Peripherals::take().expect("cannot take peripherals");
26+
let mut rcc = dp.RCC.freeze(rcc::Config::hsi());
27+
28+
info!("Init UART");
29+
let gpioa = dp.GPIOA.split(&mut rcc);
30+
let tx = gpioa.pa2.into_alternate();
31+
let rx = gpioa.pa3.into_alternate();
32+
let mut usart = dp
33+
.USART2
34+
.usart(tx, rx, FullConfig::default(), &mut rcc)
35+
.unwrap();
36+
/*let gpioc = dp.GPIOC.split(&mut rcc);
37+
let tx = gpioc.pc4.into_alternate();
38+
let rx = gpioc.pc5.into_alternate();
39+
let mut usart = dp
40+
.USART1
41+
.usart(tx, rx, FullConfig::default(), &mut rcc)
42+
.unwrap();*/
43+
44+
writeln!(usart, "Hello USART2\r\n").unwrap();
45+
46+
let mut cnt = 0;
47+
loop {
48+
let byte = block!(usart.read()).unwrap();
49+
writeln!(usart, "{}: {}\r", cnt, byte).unwrap();
50+
cnt += 1;
51+
}
52+
}

src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ pub mod prelude;
7575
// pub mod qei;
7676
pub mod rcc;
7777
// pub mod rng;
78-
// pub mod serial;
78+
pub mod serial;
7979
pub mod signature;
8080
// pub mod spi;
8181
// pub mod stopwatch;

src/prelude.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ pub use crate::rcc::MCOExt as _;
3131
pub use crate::rcc::RccExt as _;
3232
// pub use crate::rng::RngCore as _;
3333
// pub use crate::rng::RngExt as _;
34-
// pub use crate::serial::SerialExt as _;
34+
pub use crate::serial::SerialExt as _;
3535
// pub use crate::spi::SpiExt as _;
3636
pub use crate::time::U32Ext as _;
3737
// pub use crate::timer::opm::OpmExt as _;

0 commit comments

Comments
 (0)