Skip to content

Commit

Permalink
Merge branch 'master' into adc
Browse files Browse the repository at this point in the history
  • Loading branch information
teskje authored Jul 18, 2020
2 parents 628a2bb + b0aaa37 commit 76280b6
Show file tree
Hide file tree
Showing 7 changed files with 957 additions and 63 deletions.
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,9 @@ and this project adheres to [Semantic Versioning](http://semver.org/).

- Implement `InputPin` for `Output<OpenDrain>` pins ([#114](https://github.com/stm32-rs/stm32f3xx-hal/pull/114))
- ADC support for `stm32f303` devices.
- Support for safe one-shot DMA transfers ([#86](https://github.com/stm32-rs/stm32f3xx-hal/pull/86))
- DMA support for serial reception and transmission ([#86](https://github.com/stm32-rs/stm32f3xx-hal/pull/86))
- ADC support for `stm32f303` devices.

### Fixed

Expand Down
14 changes: 11 additions & 3 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -30,17 +30,21 @@ version = "0.2"
features = ["const-fn"]

[dependencies.cast]
default-features = false
version = "0.2"

[dependencies.void]
default-features = false

[dependencies.stable_deref_trait]
version = "1"
default-features = false

[dependencies.stm32-usbd]
version = "0.5"
optional = true

[dependencies.void]
version = "1"
default-features = false

[dev-dependencies]
panic-semihosting = "0.5"
usb-device = "0.2"
Expand Down Expand Up @@ -104,6 +108,10 @@ required-features = ["rt", "stm32f303xc", "stm32-usbd"]
name = "spi"
required-features = ["stm32f303"]

[[example]]
name = "serial_dma"
required-features = ["stm32f303"]

[[example]]
name = "adc"
required-features = ["stm32f303"]
68 changes: 68 additions & 0 deletions examples/serial_dma.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
//! Example of transmitting data over serial interface using DMA.
//! For this to work, the PA9 and PA10 pins must be connected.
//! Target board: STM32F3DISCOVERY

#![no_std]
#![no_main]

use panic_semihosting as _;

use cortex_m::singleton;
use cortex_m_rt::entry;
use stm32f3xx_hal::{pac, prelude::*, serial::Serial};

#[entry]
fn main() -> ! {
let dp = pac::Peripherals::take().unwrap();

let mut flash = dp.FLASH.constrain();
let mut rcc = dp.RCC.constrain();
let clocks = rcc.cfgr.freeze(&mut flash.acr);

let mut gpioa = dp.GPIOA.split(&mut rcc.ahb);

let pins = (
gpioa.pa9.into_af7(&mut gpioa.moder, &mut gpioa.afrh),
gpioa.pa10.into_af7(&mut gpioa.moder, &mut gpioa.afrh),
);
let serial = Serial::usart1(dp.USART1, pins, 9600.bps(), clocks, &mut rcc.apb2);
let (tx, rx) = serial.split();

let dma1 = dp.DMA1.split(&mut rcc.ahb);

// the data we are going to send over serial
let tx_buf = singleton!(: [u8; 9] = *b"hello DMA").unwrap();
// the buffer we are going to receive the transmitted data in
let rx_buf = singleton!(: [u8; 9] = [0; 9]).unwrap();

// DMA channel selection depends on the peripheral:
// - USART1: TX = 4, RX = 5
// - USART2: TX = 6, RX = 7
// - USART3: TX = 3, RX = 2
let (tx_channel, rx_channel) = (dma1.ch4, dma1.ch5);

// start separate DMAs for sending and receiving the data
let sending = tx.write_all(tx_buf, tx_channel);
let receiving = rx.read_exact(rx_buf, rx_channel);

// block until all data was transmitted and received
let (tx_buf, tx_channel, tx) = sending.wait();
let (rx_buf, rx_channel, rx) = receiving.wait();

assert_eq!(tx_buf, rx_buf);

// After a transfer is finished its parts can be re-used for another one.
tx_buf.copy_from_slice(b"hi again!");

let sending = tx.write_all(tx_buf, tx_channel);
let receiving = rx.read_exact(rx_buf, rx_channel);

let (tx_buf, ..) = sending.wait();
let (rx_buf, ..) = receiving.wait();

assert_eq!(tx_buf, rx_buf);

loop {
continue;
}
}
Loading

0 comments on commit 76280b6

Please sign in to comment.