aboutsummaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
authorDario Nieuwenhuis <[email protected]>2021-07-24 09:24:11 +0200
committerGitHub <[email protected]>2021-07-24 09:24:11 +0200
commit9c503a92564aa5fb16ba1c0ffb15d8e3a721b742 (patch)
treec3453fcd15f82b88d2576ea0860f0bdd52cf4a18 /examples
parent372884422aab45f9fd09890c85e317cadd71c0d0 (diff)
parent83f63890e59715596093c907c50998d2f1033adb (diff)
Merge pull request #305 from bobmcwhirter/spi_dma_take3
Spi dma take3
Diffstat (limited to 'examples')
-rw-r--r--examples/stm32f4/src/bin/spi.rs3
-rw-r--r--examples/stm32f4/src/bin/spi_dma.rs85
-rw-r--r--examples/stm32h7/src/bin/spi.rs112
-rw-r--r--examples/stm32h7/src/bin/spi_dma.rs109
-rw-r--r--examples/stm32l0/src/bin/spi.rs5
-rw-r--r--examples/stm32l4/src/bin/spi.rs3
-rw-r--r--examples/stm32l4/src/bin/spi_dma.rs116
7 files changed, 432 insertions, 1 deletions
diff --git a/examples/stm32f4/src/bin/spi.rs b/examples/stm32f4/src/bin/spi.rs
index 88fc84bc0..604283877 100644
--- a/examples/stm32f4/src/bin/spi.rs
+++ b/examples/stm32f4/src/bin/spi.rs
@@ -18,6 +18,7 @@ use embassy_stm32::dbgmcu::Dbgmcu;
18use embassy_stm32::spi::{Config, Spi}; 18use embassy_stm32::spi::{Config, Spi};
19use embassy_stm32::time::Hertz; 19use embassy_stm32::time::Hertz;
20use embedded_hal::blocking::spi::Transfer; 20use embedded_hal::blocking::spi::Transfer;
21use embassy_stm32::dma::NoDma;
21 22
22#[entry] 23#[entry]
23fn main() -> ! { 24fn main() -> ! {
@@ -34,6 +35,8 @@ fn main() -> ! {
34 p.PC10, 35 p.PC10,
35 p.PC12, 36 p.PC12,
36 p.PC11, 37 p.PC11,
38 NoDma,
39 NoDma,
37 Hertz(1_000_000), 40 Hertz(1_000_000),
38 Config::default(), 41 Config::default(),
39 ); 42 );
diff --git a/examples/stm32f4/src/bin/spi_dma.rs b/examples/stm32f4/src/bin/spi_dma.rs
new file mode 100644
index 000000000..10a419fda
--- /dev/null
+++ b/examples/stm32f4/src/bin/spi_dma.rs
@@ -0,0 +1,85 @@
1#![no_std]
2#![no_main]
3#![feature(trait_alias)]
4#![feature(min_type_alias_impl_trait)]
5#![feature(impl_trait_in_bindings)]
6#![feature(type_alias_impl_trait)]
7#![allow(incomplete_features)]
8
9#[path = "../example_common.rs"]
10mod example_common;
11use core::fmt::Write;
12use cortex_m_rt::entry;
13use embassy::executor::Executor;
14use embassy::time::Clock;
15use embassy::util::Forever;
16use example_common::*;
17use embassy_traits::spi::FullDuplex;
18use heapless::String;
19use embassy_stm32::spi::{Spi, Config};
20use embassy_stm32::pac;
21use embassy_stm32::time::Hertz;
22use core::str::from_utf8;
23
24#[embassy::task]
25async fn main_task() {
26 let p = embassy_stm32::init(Default::default());
27
28 let mut spi = Spi::new(
29 p.SPI1,
30 p.PB3,
31 p.PB5,
32 p.PB4,
33 p.DMA2_CH3,
34 p.DMA2_CH2,
35 Hertz(1_000_000),
36 Config::default(),
37 );
38
39 for n in 0u32.. {
40 let mut write: String<128> = String::new();
41 let mut read = [0;128];
42 core::write!(&mut write, "Hello DMA World {}!\r\n", n).unwrap();
43 spi.read_write(&mut read[0..write.len()], write.as_bytes()).await.ok();
44 info!("read via spi+dma: {}", from_utf8(&read).unwrap());
45 }
46}
47
48struct ZeroClock;
49
50impl Clock for ZeroClock {
51 fn now(&self) -> u64 {
52 0
53 }
54}
55
56static EXECUTOR: Forever<Executor> = Forever::new();
57
58#[entry]
59fn main() -> ! {
60 info!("Hello World!");
61 unsafe {
62 pac::DBGMCU.cr().modify(|w| {
63 w.set_dbg_sleep(true);
64 w.set_dbg_standby(true);
65 w.set_dbg_stop(true);
66 });
67
68 pac::RCC.ahb1enr().modify(|w| {
69 w.set_gpioaen(true);
70 w.set_gpioben(true);
71 w.set_gpiocen(true);
72 w.set_gpioden(true);
73 w.set_gpioeen(true);
74 w.set_gpiofen(true);
75 });
76 }
77
78 unsafe { embassy::time::set_clock(&ZeroClock) };
79
80 let executor = EXECUTOR.put(Executor::new());
81
82 executor.run(|spawner| {
83 unwrap!(spawner.spawn(main_task()));
84 })
85}
diff --git a/examples/stm32h7/src/bin/spi.rs b/examples/stm32h7/src/bin/spi.rs
new file mode 100644
index 000000000..ac483a311
--- /dev/null
+++ b/examples/stm32h7/src/bin/spi.rs
@@ -0,0 +1,112 @@
1#![no_std]
2#![no_main]
3#![feature(trait_alias)]
4#![feature(min_type_alias_impl_trait)]
5#![feature(impl_trait_in_bindings)]
6#![feature(type_alias_impl_trait)]
7#![allow(incomplete_features)]
8
9#[path = "../example_common.rs"]
10mod example_common;
11
12use core::fmt::Write;
13use embassy::executor::Executor;
14use embassy::time::Clock;
15use embassy::util::Forever;
16use embassy_stm32::dma::NoDma;
17use example_common::*;
18use embedded_hal::blocking::spi::Transfer;
19
20use hal::prelude::*;
21use stm32h7xx_hal as hal;
22
23use cortex_m_rt::entry;
24use stm32h7::stm32h743 as pac;
25use heapless::String;
26use embassy_stm32::spi::{Spi, Config};
27use embassy_stm32::time::Hertz;
28
29#[embassy::task]
30async fn main_task() {
31 let p = embassy_stm32::init(Default::default());
32
33 let mut spi = Spi::new(
34 p.SPI3,
35 p.PB3,
36 p.PB5,
37 p.PB4,
38 NoDma,
39 NoDma,
40 Hertz(1_000_000),
41 Config::default(),
42 );
43
44 for n in 0u32.. {
45 let mut write: String<128> = String::new();
46 core::write!(&mut write, "Hello DMA World {}!\r\n", n).unwrap();
47 unsafe {
48 let result = spi.transfer(write.as_bytes_mut());
49 if let Err(_) = result {
50 defmt::panic!("crap");
51 }
52 }
53 info!("read via spi: {}", write.as_bytes());
54 }
55}
56
57struct ZeroClock;
58
59impl Clock for ZeroClock {
60 fn now(&self) -> u64 {
61 0
62 }
63}
64
65static EXECUTOR: Forever<Executor> = Forever::new();
66
67#[entry]
68fn main() -> ! {
69 info!("Hello World!");
70
71 let pp = pac::Peripherals::take().unwrap();
72
73 let pwrcfg = pp.PWR.constrain().freeze();
74
75 let rcc = pp.RCC.constrain();
76
77 rcc.sys_ck(96.mhz())
78 .pclk1(48.mhz())
79 .pclk2(48.mhz())
80 .pclk3(48.mhz())
81 .pclk4(48.mhz())
82 .pll1_q_ck(48.mhz())
83 .freeze(pwrcfg, &pp.SYSCFG);
84
85 let pp = unsafe { pac::Peripherals::steal() };
86
87 pp.DBGMCU.cr.modify(|_, w| {
88 w.dbgsleep_d1().set_bit();
89 w.dbgstby_d1().set_bit();
90 w.dbgstop_d1().set_bit();
91 w.d1dbgcken().set_bit();
92 w
93 });
94
95 pp.RCC.ahb4enr.modify(|_, w| {
96 w.gpioaen().set_bit();
97 w.gpioben().set_bit();
98 w.gpiocen().set_bit();
99 w.gpioden().set_bit();
100 w.gpioeen().set_bit();
101 w.gpiofen().set_bit();
102 w
103 });
104
105 unsafe { embassy::time::set_clock(&ZeroClock) };
106
107 let executor = EXECUTOR.put(Executor::new());
108
109 executor.run(|spawner| {
110 unwrap!(spawner.spawn(main_task()));
111 })
112}
diff --git a/examples/stm32h7/src/bin/spi_dma.rs b/examples/stm32h7/src/bin/spi_dma.rs
new file mode 100644
index 000000000..9dbfd0960
--- /dev/null
+++ b/examples/stm32h7/src/bin/spi_dma.rs
@@ -0,0 +1,109 @@
1#![no_std]
2#![no_main]
3#![feature(trait_alias)]
4#![feature(min_type_alias_impl_trait)]
5#![feature(impl_trait_in_bindings)]
6#![feature(type_alias_impl_trait)]
7#![allow(incomplete_features)]
8
9#[path = "../example_common.rs"]
10mod example_common;
11use core::fmt::Write;
12use embassy::executor::Executor;
13use embassy::time::Clock;
14use embassy::util::Forever;
15use example_common::*;
16use embassy_traits::spi::FullDuplex;
17
18use hal::prelude::*;
19use stm32h7xx_hal as hal;
20
21use cortex_m_rt::entry;
22use stm32h7::stm32h743 as pac;
23use heapless::String;
24use embassy_stm32::spi::{Spi, Config};
25use embassy_stm32::time::Hertz;
26use core::str::from_utf8;
27
28#[embassy::task]
29async fn main_task() {
30 let p = embassy_stm32::init(Default::default());
31
32 let mut spi = Spi::new(
33 p.SPI3,
34 p.PB3,
35 p.PB5,
36 p.PB4,
37 p.DMA1_CH3,
38 p.DMA1_CH4,
39 Hertz(1_000_000),
40 Config::default(),
41 );
42
43 for n in 0u32.. {
44 let mut write: String<128> = String::new();
45 let mut read = [0;128];
46 core::write!(&mut write, "Hello DMA World {}!\r\n", n).unwrap();
47 // read_write will slice the &mut read down to &write's actual length.
48 spi.read_write(&mut read, write.as_bytes()).await.ok();
49 info!("read via spi+dma: {}", from_utf8(&read).unwrap());
50 }
51
52}
53
54struct ZeroClock;
55
56impl Clock for ZeroClock {
57 fn now(&self) -> u64 {
58 0
59 }
60}
61
62static EXECUTOR: Forever<Executor> = Forever::new();
63
64#[entry]
65fn main() -> ! {
66 info!("Hello World!");
67
68 let pp = pac::Peripherals::take().unwrap();
69
70 let pwrcfg = pp.PWR.constrain().freeze();
71
72 let rcc = pp.RCC.constrain();
73
74 rcc.sys_ck(96.mhz())
75 .pclk1(48.mhz())
76 .pclk2(48.mhz())
77 .pclk3(48.mhz())
78 .pclk4(48.mhz())
79 .pll1_q_ck(48.mhz())
80 .freeze(pwrcfg, &pp.SYSCFG);
81
82 let pp = unsafe { pac::Peripherals::steal() };
83
84 pp.DBGMCU.cr.modify(|_, w| {
85 w.dbgsleep_d1().set_bit();
86 w.dbgstby_d1().set_bit();
87 w.dbgstop_d1().set_bit();
88 w.d1dbgcken().set_bit();
89 w
90 });
91
92 pp.RCC.ahb4enr.modify(|_, w| {
93 w.gpioaen().set_bit();
94 w.gpioben().set_bit();
95 w.gpiocen().set_bit();
96 w.gpioden().set_bit();
97 w.gpioeen().set_bit();
98 w.gpiofen().set_bit();
99 w
100 });
101
102 unsafe { embassy::time::set_clock(&ZeroClock) };
103
104 let executor = EXECUTOR.put(Executor::new());
105
106 executor.run(|spawner| {
107 unwrap!(spawner.spawn(main_task()));
108 })
109}
diff --git a/examples/stm32l0/src/bin/spi.rs b/examples/stm32l0/src/bin/spi.rs
index 9bb9b741e..5290906ef 100644
--- a/examples/stm32l0/src/bin/spi.rs
+++ b/examples/stm32l0/src/bin/spi.rs
@@ -18,10 +18,11 @@ use embassy_stm32::rcc;
18use embassy_stm32::spi::{Config, Spi}; 18use embassy_stm32::spi::{Config, Spi};
19use embassy_stm32::time::Hertz; 19use embassy_stm32::time::Hertz;
20use embedded_hal::blocking::spi::Transfer; 20use embedded_hal::blocking::spi::Transfer;
21use embassy_stm32::dma::NoDma;
21 22
22#[entry] 23#[entry]
23fn main() -> ! { 24fn main() -> ! {
24 info!("Hello World, dude!"); 25 info!("Hello World, folks!");
25 26
26 let mut p = embassy_stm32::init(Default::default()); 27 let mut p = embassy_stm32::init(Default::default());
27 let mut rcc = rcc::Rcc::new(p.RCC); 28 let mut rcc = rcc::Rcc::new(p.RCC);
@@ -32,6 +33,8 @@ fn main() -> ! {
32 p.PB3, 33 p.PB3,
33 p.PA7, 34 p.PA7,
34 p.PA6, 35 p.PA6,
36 NoDma,
37 NoDma,
35 Hertz(1_000_000), 38 Hertz(1_000_000),
36 Config::default(), 39 Config::default(),
37 ); 40 );
diff --git a/examples/stm32l4/src/bin/spi.rs b/examples/stm32l4/src/bin/spi.rs
index 8702fe0cc..14605283b 100644
--- a/examples/stm32l4/src/bin/spi.rs
+++ b/examples/stm32l4/src/bin/spi.rs
@@ -17,6 +17,7 @@ use embassy_stm32::time::Hertz;
17use embedded_hal::blocking::spi::Transfer; 17use embedded_hal::blocking::spi::Transfer;
18use embedded_hal::digital::v2::OutputPin; 18use embedded_hal::digital::v2::OutputPin;
19use example_common::*; 19use example_common::*;
20use embassy_stm32::dma::NoDma;
20 21
21#[entry] 22#[entry]
22fn main() -> ! { 23fn main() -> ! {
@@ -41,6 +42,8 @@ fn main() -> ! {
41 p.PC10, 42 p.PC10,
42 p.PC12, 43 p.PC12,
43 p.PC11, 44 p.PC11,
45 NoDma,
46 NoDma,
44 Hertz(1_000_000), 47 Hertz(1_000_000),
45 Config::default(), 48 Config::default(),
46 ); 49 );
diff --git a/examples/stm32l4/src/bin/spi_dma.rs b/examples/stm32l4/src/bin/spi_dma.rs
new file mode 100644
index 000000000..ba03ff44e
--- /dev/null
+++ b/examples/stm32l4/src/bin/spi_dma.rs
@@ -0,0 +1,116 @@
1#![no_std]
2#![no_main]
3#![feature(trait_alias)]
4#![feature(min_type_alias_impl_trait)]
5#![feature(impl_trait_in_bindings)]
6#![feature(type_alias_impl_trait)]
7#![allow(incomplete_features)]
8
9#[path = "../example_common.rs"]
10mod example_common;
11
12use cortex_m_rt::entry;
13use embassy::executor::Executor;
14use embassy::time::Clock;
15use embassy::util::Forever;
16use embassy_stm32::pac;
17use example_common::*;
18use embassy_stm32::spi::{Spi, Config};
19use embassy_traits::spi::FullDuplex;
20use embassy_stm32::time::Hertz;
21use embassy_stm32::gpio::{Output, Level, Speed, Input, Pull};
22use embedded_hal::digital::v2::{OutputPin, InputPin};
23
24#[embassy::task]
25async fn main_task() {
26 let p = embassy_stm32::init(Default::default());
27
28 let mut spi = Spi::new(
29 p.SPI3,
30 p.PC10,
31 p.PC12,
32 p.PC11,
33 p.DMA1_CH0,
34 p.DMA1_CH1,
35 Hertz(1_000_000),
36 Config::default(),
37 );
38
39
40 // These are the pins for the Inventek eS-Wifi SPI Wifi Adapter.
41
42 let _boot = Output::new(p.PB12, Level::Low, Speed::VeryHigh);
43 let _wake = Output::new(p.PB13, Level::Low, Speed::VeryHigh);
44 let mut reset = Output::new(p.PE8, Level::Low, Speed::VeryHigh);
45 let mut cs = Output::new(p.PE0, Level::High, Speed::VeryHigh);
46 let ready = Input::new(p.PE1, Pull::Up);
47
48 cortex_m::asm::delay(100_000);
49 reset.set_high().unwrap();
50 cortex_m::asm::delay(100_000);
51
52 while ready.is_low().unwrap() {
53 info!("waiting for ready");
54 }
55
56 let write = [0x0A; 10];
57 let mut read = [0; 10];
58 unwrap!(cs.set_low());
59 spi.read_write(&mut read, &write).await.ok();
60 unwrap!(cs.set_high());
61 info!("xfer {=[u8]:x}", read);
62}
63
64struct ZeroClock;
65
66impl Clock for ZeroClock {
67 fn now(&self) -> u64 {
68 0
69 }
70}
71
72static EXECUTOR: Forever<Executor> = Forever::new();
73
74#[entry]
75fn main() -> ! {
76 info!("Hello World!");
77
78 unsafe {
79 pac::DBGMCU.cr().modify(|w| {
80 w.set_dbg_sleep(true);
81 w.set_dbg_standby(true);
82 w.set_dbg_stop(true);
83 });
84
85 //pac::RCC.apbenr().modify(|w| {
86 //w.set_spi3en(true);
87 // });
88
89 pac::RCC.apb2enr().modify(|w| {
90 w.set_syscfgen(true);
91 });
92
93 pac::RCC.ahb1enr().modify(|w| {
94 w.set_dmamux1en(true);
95 w.set_dma1en(true);
96 w.set_dma2en(true);
97 });
98
99 pac::RCC.ahb2enr().modify(|w| {
100 w.set_gpioaen(true);
101 w.set_gpioben(true);
102 w.set_gpiocen(true);
103 w.set_gpioden(true);
104 w.set_gpioeen(true);
105 w.set_gpiofen(true);
106 });
107 }
108
109 unsafe { embassy::time::set_clock(&ZeroClock) };
110
111 let executor = EXECUTOR.put(Executor::new());
112
113 executor.run(|spawner| {
114 unwrap!(spawner.spawn(main_task()));
115 })
116}