Skip to content

Commit a785c2a

Browse files
authored
Merge pull request #24 from mgottschlag/serial
Support for USART/UART/LPUART
2 parents 5203be7 + 8954107 commit a785c2a

File tree

9 files changed

+1328
-2
lines changed

9 files changed

+1328
-2
lines changed

examples/uart-dma.rs

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
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+
let cp = cortex_m::Peripherals::take().expect("cannot take core peripherals");
28+
29+
let rcc = dp.RCC.constrain();
30+
let mut rcc = rcc.freeze(rcc::Config::hsi());
31+
32+
let streams = dp.DMA1.split(&rcc);
33+
let config = DmaConfig::default()
34+
.transfer_complete_interrupt(false)
35+
.circular_buffer(false)
36+
.memory_increment(true);
37+
38+
info!("Init UART");
39+
let gpioa = dp.GPIOA.split(&mut rcc);
40+
let tx = gpioa.pa2.into_alternate();
41+
let rx = gpioa.pa3.into_alternate();
42+
let mut usart = dp
43+
.USART2
44+
.usart(
45+
tx,
46+
rx,
47+
FullConfig::default().baudrate(115200.bps()),
48+
&mut rcc,
49+
)
50+
.unwrap();
51+
52+
let mut delay_syst = cp.SYST.delay(&rcc.clocks);
53+
let mut led = gpioa.pa5.into_push_pull_output();
54+
55+
info!("Start writing");
56+
57+
writeln!(usart, "Hello without DMA\r").unwrap();
58+
59+
let tx_buffer = cortex_m::singleton!(: [u8; 17] = *b"Hello with DMA!\r\n").unwrap();
60+
61+
let (tx, _rx) = usart.split();
62+
63+
// Setup DMA for USART2 TX with dma channel 1.
64+
let mut transfer =
65+
streams
66+
.0
67+
.into_memory_to_peripheral_transfer(tx.enable_dma(), &mut tx_buffer[..], config);
68+
69+
transfer.start(|_tx| {});
70+
loop {
71+
while !transfer.get_transfer_complete_flag() {}
72+
73+
delay_syst.delay(1000.ms());
74+
led.toggle().unwrap();
75+
transfer.restart(|_tx| {});
76+
}
77+
}

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, "{}: {}\r", cnt, byte).unwrap();
65+
cnt += 1;
66+
}
67+
}
68+
}
69+
}
70+
}
71+
}

examples/uart.rs

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
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+
// on Nucleo-G474, the pins marked TX/RX are connected to USART1 by default, whereas USART2 is
30+
// connected to the ST-Link's UART.
31+
let gpioa = dp.GPIOA.split(&mut rcc);
32+
let tx = gpioa.pa2.into_alternate();
33+
let rx = gpioa.pa3.into_alternate();
34+
let mut usart = dp
35+
.USART2
36+
.usart(tx, rx, FullConfig::default(), &mut rcc)
37+
.unwrap();
38+
/*let gpioc = dp.GPIOC.split(&mut rcc);
39+
let tx = gpioc.pc4.into_alternate();
40+
let rx = gpioc.pc5.into_alternate();
41+
let mut usart = dp
42+
.USART1
43+
.usart(tx, rx, FullConfig::default(), &mut rcc)
44+
.unwrap();*/
45+
46+
writeln!(usart, "Hello USART1\r\n").unwrap();
47+
48+
let mut cnt = 0;
49+
loop {
50+
match block!(usart.read()) {
51+
Ok(byte) => writeln!(usart, "{}: {}\r", cnt, byte).unwrap(),
52+
Err(e) => writeln!(usart, "E: {:?}\r", e).unwrap(),
53+
};
54+
cnt += 1;
55+
}
56+
}

src/gpio.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,14 @@ pub const AF4: u8 = 4;
7272
pub const AF5: u8 = 5;
7373
pub const AF6: u8 = 6;
7474
pub const AF7: u8 = 7;
75+
pub const AF8: u8 = 8;
76+
pub const AF9: u8 = 9;
77+
pub const AF10: u8 = 10;
78+
pub const AF11: u8 = 11;
79+
pub const AF12: u8 = 12;
80+
pub const AF13: u8 = 13;
81+
pub const AF14: u8 = 14;
82+
pub const AF15: u8 = 15;
7583

7684
/// External Interrupt Pin
7785
pub trait ExtiPin {

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)