aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDario Nieuwenhuis <[email protected]>2023-04-10 21:27:44 +0200
committerGitHub <[email protected]>2023-04-10 21:27:44 +0200
commit1f25d2ba8335300368b32f9ceedf163376dfdb6f (patch)
tree0e2702d7c45b93a87359ca00c2ccbe5ee7515e61
parent53c60df9979f32a7bfca3fe5c30b47850ee295df (diff)
parentcae683cd41261312e8a8da70c862832f0acb847c (diff)
Merge pull request #1347 from embassy-rs/h5-spi
stm32h5: add spi support, fix DMA hang, add HIL tests.
-rwxr-xr-xci.sh1
-rw-r--r--embassy-stm32/Cargo.toml4
-rw-r--r--embassy-stm32/src/dma/gpdma.rs11
-rw-r--r--embassy-stm32/src/spi/mod.rs72
-rw-r--r--tests/stm32/Cargo.toml1
-rw-r--r--tests/stm32/src/bin/gpio.rs2
-rw-r--r--tests/stm32/src/bin/spi.rs19
-rw-r--r--tests/stm32/src/bin/spi_dma.rs18
-rw-r--r--tests/stm32/src/bin/usart.rs2
-rw-r--r--tests/stm32/src/bin/usart_dma.rs9
10 files changed, 83 insertions, 56 deletions
diff --git a/ci.sh b/ci.sh
index 82b72ae32..47bf5d660 100755
--- a/ci.sh
+++ b/ci.sh
@@ -119,6 +119,7 @@ cargo batch \
119 --- build --release --manifest-path tests/stm32/Cargo.toml --target thumbv6m-none-eabi --features stm32g071rb --out-dir out/tests/nucleo-stm32g071rb \ 119 --- build --release --manifest-path tests/stm32/Cargo.toml --target thumbv6m-none-eabi --features stm32g071rb --out-dir out/tests/nucleo-stm32g071rb \
120 --- build --release --manifest-path tests/stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32h755zi --out-dir out/tests/nucleo-stm32h755zi \ 120 --- build --release --manifest-path tests/stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32h755zi --out-dir out/tests/nucleo-stm32h755zi \
121 --- build --release --manifest-path tests/stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32wb55rg --out-dir out/tests/nucleo-stm32wb55rg \ 121 --- build --release --manifest-path tests/stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32wb55rg --out-dir out/tests/nucleo-stm32wb55rg \
122 --- build --release --manifest-path tests/stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32h563zi --out-dir out/tests/nucleo-stm32h563zi \
122 --- build --release --manifest-path tests/stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32u585ai --out-dir out/tests/iot-stm32u585ai \ 123 --- build --release --manifest-path tests/stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32u585ai --out-dir out/tests/iot-stm32u585ai \
123 --- build --release --manifest-path tests/rp/Cargo.toml --target thumbv6m-none-eabi --out-dir out/tests/rpi-pico \ 124 --- build --release --manifest-path tests/rp/Cargo.toml --target thumbv6m-none-eabi --out-dir out/tests/rpi-pico \
124 --- build --release --manifest-path tests/nrf/Cargo.toml --target thumbv7em-none-eabi --out-dir out/tests/nrf52840-dk \ 125 --- build --release --manifest-path tests/nrf/Cargo.toml --target thumbv7em-none-eabi --out-dir out/tests/nrf52840-dk \
diff --git a/embassy-stm32/Cargo.toml b/embassy-stm32/Cargo.toml
index 4ab306223..a8ebacd25 100644
--- a/embassy-stm32/Cargo.toml
+++ b/embassy-stm32/Cargo.toml
@@ -58,7 +58,7 @@ sdio-host = "0.5.0"
58embedded-sdmmc = { git = "https://github.com/embassy-rs/embedded-sdmmc-rs", rev = "46d1b1c2ff13e31e282ec1e352421721694f126a", optional = true } 58embedded-sdmmc = { git = "https://github.com/embassy-rs/embedded-sdmmc-rs", rev = "46d1b1c2ff13e31e282ec1e352421721694f126a", optional = true }
59critical-section = "1.1" 59critical-section = "1.1"
60atomic-polyfill = "1.0.1" 60atomic-polyfill = "1.0.1"
61stm32-metapac = "4" 61stm32-metapac = "5"
62vcell = "0.1.3" 62vcell = "0.1.3"
63bxcan = "0.7.0" 63bxcan = "0.7.0"
64nb = "1.0.0" 64nb = "1.0.0"
@@ -73,7 +73,7 @@ critical-section = { version = "1.1", features = ["std"] }
73[build-dependencies] 73[build-dependencies]
74proc-macro2 = "1.0.36" 74proc-macro2 = "1.0.36"
75quote = "1.0.15" 75quote = "1.0.15"
76stm32-metapac = { version = "4", default-features = false, features = ["metadata"]} 76stm32-metapac = { version = "5", default-features = false, features = ["metadata"]}
77 77
78[features] 78[features]
79default = ["stm32-metapac/rt"] 79default = ["stm32-metapac/rt"]
diff --git a/embassy-stm32/src/dma/gpdma.rs b/embassy-stm32/src/dma/gpdma.rs
index 442fee48e..6f26fd194 100644
--- a/embassy-stm32/src/dma/gpdma.rs
+++ b/embassy-stm32/src/dma/gpdma.rs
@@ -190,6 +190,10 @@ mod low_level_api {
190 fence(Ordering::SeqCst); 190 fence(Ordering::SeqCst);
191 191
192 let ch = dma.ch(channel_number as _); 192 let ch = dma.ch(channel_number as _);
193
194 // Reset ch
195 ch.cr().write(|w| w.set_reset(true));
196
193 ch.llr().write(|_| {}); // no linked list 197 ch.llr().write(|_| {}); // no linked list
194 ch.tr1().write(|w| { 198 ch.tr1().write(|w| {
195 w.set_sdw(data_size.into()); 199 w.set_sdw(data_size.into());
@@ -252,7 +256,7 @@ mod low_level_api {
252 /// Gets the running status of the channel 256 /// Gets the running status of the channel
253 pub unsafe fn is_running(dma: Gpdma, ch: u8) -> bool { 257 pub unsafe fn is_running(dma: Gpdma, ch: u8) -> bool {
254 let ch = dma.ch(ch as _); 258 let ch = dma.ch(ch as _);
255 !ch.sr().read().idlef() 259 !ch.sr().read().tcf()
256 } 260 }
257 261
258 /// Gets the total remaining transfers for the channel 262 /// Gets the total remaining transfers for the channel
@@ -291,7 +295,10 @@ mod low_level_api {
291 } 295 }
292 296
293 if sr.suspf() || sr.tcf() { 297 if sr.suspf() || sr.tcf() {
294 ch.cr().write(|w| w.set_reset(true)); 298 // disable all xxIEs to prevent the irq from firing again.
299 ch.cr().write(|_| {});
300
301 // Wake the future. It'll look at tcf and see it's set.
295 STATE.channels[state_index].waker.wake(); 302 STATE.channels[state_index].waker.wake();
296 } 303 }
297 } 304 }
diff --git a/embassy-stm32/src/spi/mod.rs b/embassy-stm32/src/spi/mod.rs
index 1f1708873..481ea4abc 100644
--- a/embassy-stm32/src/spi/mod.rs
+++ b/embassy-stm32/src/spi/mod.rs
@@ -258,7 +258,7 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> {
258 w.set_spe(true); 258 w.set_spe(true);
259 }); 259 });
260 } 260 }
261 #[cfg(any(spi_v3, spi_v4))] 261 #[cfg(any(spi_v3, spi_v4, spi_v5))]
262 unsafe { 262 unsafe {
263 T::REGS.ifcr().write(|w| w.0 = 0xffff_ffff); 263 T::REGS.ifcr().write(|w| w.0 = 0xffff_ffff);
264 T::REGS.cfg2().modify(|w| { 264 T::REGS.cfg2().modify(|w| {
@@ -317,7 +317,7 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> {
317 }); 317 });
318 } 318 }
319 319
320 #[cfg(any(spi_v3, spi_v4))] 320 #[cfg(any(spi_v3, spi_v4, spi_v5))]
321 unsafe { 321 unsafe {
322 T::REGS.cfg2().modify(|w| { 322 T::REGS.cfg2().modify(|w| {
323 w.set_cpha(cpha); 323 w.set_cpha(cpha);
@@ -330,7 +330,7 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> {
330 pub fn get_current_config(&self) -> Config { 330 pub fn get_current_config(&self) -> Config {
331 #[cfg(any(spi_v1, spi_f1, spi_v2))] 331 #[cfg(any(spi_v1, spi_f1, spi_v2))]
332 let cfg = unsafe { T::REGS.cr1().read() }; 332 let cfg = unsafe { T::REGS.cr1().read() };
333 #[cfg(any(spi_v3, spi_v4))] 333 #[cfg(any(spi_v3, spi_v4, spi_v5))]
334 let cfg = unsafe { T::REGS.cfg2().read() }; 334 let cfg = unsafe { T::REGS.cfg2().read() };
335 let polarity = if cfg.cpol() == vals::Cpol::IDLELOW { 335 let polarity = if cfg.cpol() == vals::Cpol::IDLELOW {
336 Polarity::IdleLow 336 Polarity::IdleLow
@@ -383,7 +383,7 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> {
383 w.set_spe(true); 383 w.set_spe(true);
384 }); 384 });
385 } 385 }
386 #[cfg(any(spi_v3, spi_v4))] 386 #[cfg(any(spi_v3, spi_v4, spi_v5))]
387 unsafe { 387 unsafe {
388 T::REGS.cr1().modify(|w| { 388 T::REGS.cr1().modify(|w| {
389 w.set_csusp(true); 389 w.set_csusp(true);
@@ -429,7 +429,7 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> {
429 T::REGS.cr1().modify(|w| { 429 T::REGS.cr1().modify(|w| {
430 w.set_spe(true); 430 w.set_spe(true);
431 }); 431 });
432 #[cfg(any(spi_v3, spi_v4))] 432 #[cfg(any(spi_v3, spi_v4, spi_v5))]
433 T::REGS.cr1().modify(|w| { 433 T::REGS.cr1().modify(|w| {
434 w.set_cstart(true); 434 w.set_cstart(true);
435 }); 435 });
@@ -459,7 +459,7 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> {
459 } 459 }
460 460
461 // SPIv3 clears rxfifo on SPE=0 461 // SPIv3 clears rxfifo on SPE=0
462 #[cfg(not(any(spi_v3, spi_v4)))] 462 #[cfg(not(any(spi_v3, spi_v4, spi_v5)))]
463 flush_rx_fifo(T::REGS); 463 flush_rx_fifo(T::REGS);
464 464
465 set_rxdmaen(T::REGS, true); 465 set_rxdmaen(T::REGS, true);
@@ -481,7 +481,7 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> {
481 T::REGS.cr1().modify(|w| { 481 T::REGS.cr1().modify(|w| {
482 w.set_spe(true); 482 w.set_spe(true);
483 }); 483 });
484 #[cfg(any(spi_v3, spi_v4))] 484 #[cfg(any(spi_v3, spi_v4, spi_v5))]
485 T::REGS.cr1().modify(|w| { 485 T::REGS.cr1().modify(|w| {
486 w.set_cstart(true); 486 w.set_cstart(true);
487 }); 487 });
@@ -514,7 +514,7 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> {
514 } 514 }
515 515
516 // SPIv3 clears rxfifo on SPE=0 516 // SPIv3 clears rxfifo on SPE=0
517 #[cfg(not(any(spi_v3, spi_v4)))] 517 #[cfg(not(any(spi_v3, spi_v4, spi_v5)))]
518 flush_rx_fifo(T::REGS); 518 flush_rx_fifo(T::REGS);
519 519
520 set_rxdmaen(T::REGS, true); 520 set_rxdmaen(T::REGS, true);
@@ -534,7 +534,7 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> {
534 T::REGS.cr1().modify(|w| { 534 T::REGS.cr1().modify(|w| {
535 w.set_spe(true); 535 w.set_spe(true);
536 }); 536 });
537 #[cfg(any(spi_v3, spi_v4))] 537 #[cfg(any(spi_v3, spi_v4, spi_v5))]
538 T::REGS.cr1().modify(|w| { 538 T::REGS.cr1().modify(|w| {
539 w.set_cstart(true); 539 w.set_cstart(true);
540 }); 540 });
@@ -619,9 +619,9 @@ impl<'d, T: Instance, Tx, Rx> Drop for Spi<'d, T, Tx, Rx> {
619 } 619 }
620} 620}
621 621
622#[cfg(not(any(spi_v3, spi_v4)))] 622#[cfg(not(any(spi_v3, spi_v4, spi_v5)))]
623use vals::Br; 623use vals::Br;
624#[cfg(any(spi_v3, spi_v4))] 624#[cfg(any(spi_v3, spi_v4, spi_v5))]
625use vals::Mbr as Br; 625use vals::Mbr as Br;
626 626
627fn compute_baud_rate(clocks: Hertz, freq: Hertz) -> Br { 627fn compute_baud_rate(clocks: Hertz, freq: Hertz) -> Br {
@@ -647,17 +647,17 @@ trait RegsExt {
647 647
648impl RegsExt for Regs { 648impl RegsExt for Regs {
649 fn tx_ptr<W>(&self) -> *mut W { 649 fn tx_ptr<W>(&self) -> *mut W {
650 #[cfg(not(any(spi_v3, spi_v4)))] 650 #[cfg(not(any(spi_v3, spi_v4, spi_v5)))]
651 let dr = self.dr(); 651 let dr = self.dr();
652 #[cfg(any(spi_v3, spi_v4))] 652 #[cfg(any(spi_v3, spi_v4, spi_v5))]
653 let dr = self.txdr(); 653 let dr = self.txdr();
654 dr.ptr() as *mut W 654 dr.ptr() as *mut W
655 } 655 }
656 656
657 fn rx_ptr<W>(&self) -> *mut W { 657 fn rx_ptr<W>(&self) -> *mut W {
658 #[cfg(not(any(spi_v3, spi_v4)))] 658 #[cfg(not(any(spi_v3, spi_v4, spi_v5)))]
659 let dr = self.dr(); 659 let dr = self.dr();
660 #[cfg(any(spi_v3, spi_v4))] 660 #[cfg(any(spi_v3, spi_v4, spi_v5))]
661 let dr = self.rxdr(); 661 let dr = self.rxdr();
662 dr.ptr() as *mut W 662 dr.ptr() as *mut W
663 } 663 }
@@ -667,22 +667,22 @@ fn check_error_flags(sr: regs::Sr) -> Result<(), Error> {
667 if sr.ovr() { 667 if sr.ovr() {
668 return Err(Error::Overrun); 668 return Err(Error::Overrun);
669 } 669 }
670 #[cfg(not(any(spi_f1, spi_v3, spi_v4)))] 670 #[cfg(not(any(spi_f1, spi_v3, spi_v4, spi_v5)))]
671 if sr.fre() { 671 if sr.fre() {
672 return Err(Error::Framing); 672 return Err(Error::Framing);
673 } 673 }
674 #[cfg(any(spi_v3, spi_v4))] 674 #[cfg(any(spi_v3, spi_v4, spi_v5))]
675 if sr.tifre() { 675 if sr.tifre() {
676 return Err(Error::Framing); 676 return Err(Error::Framing);
677 } 677 }
678 if sr.modf() { 678 if sr.modf() {
679 return Err(Error::ModeFault); 679 return Err(Error::ModeFault);
680 } 680 }
681 #[cfg(not(any(spi_v3, spi_v4)))] 681 #[cfg(not(any(spi_v3, spi_v4, spi_v5)))]
682 if sr.crcerr() { 682 if sr.crcerr() {
683 return Err(Error::Crc); 683 return Err(Error::Crc);
684 } 684 }
685 #[cfg(any(spi_v3, spi_v4))] 685 #[cfg(any(spi_v3, spi_v4, spi_v5))]
686 if sr.crce() { 686 if sr.crce() {
687 return Err(Error::Crc); 687 return Err(Error::Crc);
688 } 688 }
@@ -696,11 +696,11 @@ fn spin_until_tx_ready(regs: Regs) -> Result<(), Error> {
696 696
697 check_error_flags(sr)?; 697 check_error_flags(sr)?;
698 698
699 #[cfg(not(any(spi_v3, spi_v4)))] 699 #[cfg(not(any(spi_v3, spi_v4, spi_v5)))]
700 if sr.txe() { 700 if sr.txe() {
701 return Ok(()); 701 return Ok(());
702 } 702 }
703 #[cfg(any(spi_v3, spi_v4))] 703 #[cfg(any(spi_v3, spi_v4, spi_v5))]
704 if sr.txp() { 704 if sr.txp() {
705 return Ok(()); 705 return Ok(());
706 } 706 }
@@ -713,11 +713,11 @@ fn spin_until_rx_ready(regs: Regs) -> Result<(), Error> {
713 713
714 check_error_flags(sr)?; 714 check_error_flags(sr)?;
715 715
716 #[cfg(not(any(spi_v3, spi_v4)))] 716 #[cfg(not(any(spi_v3, spi_v4, spi_v5)))]
717 if sr.rxne() { 717 if sr.rxne() {
718 return Ok(()); 718 return Ok(());
719 } 719 }
720 #[cfg(any(spi_v3, spi_v4))] 720 #[cfg(any(spi_v3, spi_v4, spi_v5))]
721 if sr.rxp() { 721 if sr.rxp() {
722 return Ok(()); 722 return Ok(());
723 } 723 }
@@ -726,11 +726,11 @@ fn spin_until_rx_ready(regs: Regs) -> Result<(), Error> {
726 726
727fn flush_rx_fifo(regs: Regs) { 727fn flush_rx_fifo(regs: Regs) {
728 unsafe { 728 unsafe {
729 #[cfg(not(any(spi_v3, spi_v4)))] 729 #[cfg(not(any(spi_v3, spi_v4, spi_v5)))]
730 while regs.sr().read().rxne() { 730 while regs.sr().read().rxne() {
731 let _ = regs.dr().read(); 731 let _ = regs.dr().read();
732 } 732 }
733 #[cfg(any(spi_v3, spi_v4))] 733 #[cfg(any(spi_v3, spi_v4, spi_v5))]
734 while regs.sr().read().rxp() { 734 while regs.sr().read().rxp() {
735 let _ = regs.rxdr().read(); 735 let _ = regs.rxdr().read();
736 } 736 }
@@ -739,11 +739,11 @@ fn flush_rx_fifo(regs: Regs) {
739 739
740fn set_txdmaen(regs: Regs, val: bool) { 740fn set_txdmaen(regs: Regs, val: bool) {
741 unsafe { 741 unsafe {
742 #[cfg(not(any(spi_v3, spi_v4)))] 742 #[cfg(not(any(spi_v3, spi_v4, spi_v5)))]
743 regs.cr2().modify(|reg| { 743 regs.cr2().modify(|reg| {
744 reg.set_txdmaen(val); 744 reg.set_txdmaen(val);
745 }); 745 });
746 #[cfg(any(spi_v3, spi_v4))] 746 #[cfg(any(spi_v3, spi_v4, spi_v5))]
747 regs.cfg1().modify(|reg| { 747 regs.cfg1().modify(|reg| {
748 reg.set_txdmaen(val); 748 reg.set_txdmaen(val);
749 }); 749 });
@@ -752,11 +752,11 @@ fn set_txdmaen(regs: Regs, val: bool) {
752 752
753fn set_rxdmaen(regs: Regs, val: bool) { 753fn set_rxdmaen(regs: Regs, val: bool) {
754 unsafe { 754 unsafe {
755 #[cfg(not(any(spi_v3, spi_v4)))] 755 #[cfg(not(any(spi_v3, spi_v4, spi_v5)))]
756 regs.cr2().modify(|reg| { 756 regs.cr2().modify(|reg| {
757 reg.set_rxdmaen(val); 757 reg.set_rxdmaen(val);
758 }); 758 });
759 #[cfg(any(spi_v3, spi_v4))] 759 #[cfg(any(spi_v3, spi_v4, spi_v5))]
760 regs.cfg1().modify(|reg| { 760 regs.cfg1().modify(|reg| {
761 reg.set_rxdmaen(val); 761 reg.set_rxdmaen(val);
762 }); 762 });
@@ -768,9 +768,9 @@ fn finish_dma(regs: Regs) {
768 #[cfg(spi_v2)] 768 #[cfg(spi_v2)]
769 while regs.sr().read().ftlvl() > 0 {} 769 while regs.sr().read().ftlvl() > 0 {}
770 770
771 #[cfg(any(spi_v3, spi_v4))] 771 #[cfg(any(spi_v3, spi_v4, spi_v5))]
772 while !regs.sr().read().txc() {} 772 while !regs.sr().read().txc() {}
773 #[cfg(not(any(spi_v3, spi_v4)))] 773 #[cfg(not(any(spi_v3, spi_v4, spi_v5)))]
774 while regs.sr().read().bsy() {} 774 while regs.sr().read().bsy() {}
775 775
776 // Disable the spi peripheral 776 // Disable the spi peripheral
@@ -780,12 +780,12 @@ fn finish_dma(regs: Regs) {
780 780
781 // The peripheral automatically disables the DMA stream on completion without error, 781 // The peripheral automatically disables the DMA stream on completion without error,
782 // but it does not clear the RXDMAEN/TXDMAEN flag in CR2. 782 // but it does not clear the RXDMAEN/TXDMAEN flag in CR2.
783 #[cfg(not(any(spi_v3, spi_v4)))] 783 #[cfg(not(any(spi_v3, spi_v4, spi_v5)))]
784 regs.cr2().modify(|reg| { 784 regs.cr2().modify(|reg| {
785 reg.set_txdmaen(false); 785 reg.set_txdmaen(false);
786 reg.set_rxdmaen(false); 786 reg.set_rxdmaen(false);
787 }); 787 });
788 #[cfg(any(spi_v3, spi_v4))] 788 #[cfg(any(spi_v3, spi_v4, spi_v5))]
789 regs.cfg1().modify(|reg| { 789 regs.cfg1().modify(|reg| {
790 reg.set_txdmaen(false); 790 reg.set_txdmaen(false);
791 reg.set_rxdmaen(false); 791 reg.set_rxdmaen(false);
@@ -799,7 +799,7 @@ fn transfer_word<W: Word>(regs: Regs, tx_word: W) -> Result<W, Error> {
799 unsafe { 799 unsafe {
800 ptr::write_volatile(regs.tx_ptr(), tx_word); 800 ptr::write_volatile(regs.tx_ptr(), tx_word);
801 801
802 #[cfg(any(spi_v3, spi_v4))] 802 #[cfg(any(spi_v3, spi_v4, spi_v5))]
803 regs.cr1().modify(|reg| reg.set_cstart(true)); 803 regs.cr1().modify(|reg| reg.set_cstart(true));
804 } 804 }
805 805
@@ -970,7 +970,7 @@ pub(crate) mod sealed {
970 } 970 }
971 } 971 }
972 972
973 #[cfg(any(spi_v3, spi_v4))] 973 #[cfg(any(spi_v3, spi_v4, spi_v5))]
974 pub fn dsize(&self) -> u8 { 974 pub fn dsize(&self) -> u8 {
975 match self { 975 match self {
976 WordSize::EightBit => 0b0111, 976 WordSize::EightBit => 0b0111,
@@ -978,7 +978,7 @@ pub(crate) mod sealed {
978 } 978 }
979 } 979 }
980 980
981 #[cfg(any(spi_v3, spi_v4))] 981 #[cfg(any(spi_v3, spi_v4, spi_v5))]
982 pub fn _frxth(&self) -> vals::Fthlv { 982 pub fn _frxth(&self) -> vals::Fthlv {
983 match self { 983 match self {
984 WordSize::EightBit => vals::Fthlv::ONEFRAME, 984 WordSize::EightBit => vals::Fthlv::ONEFRAME,
diff --git a/tests/stm32/Cargo.toml b/tests/stm32/Cargo.toml
index 6070a5a87..bd181f235 100644
--- a/tests/stm32/Cargo.toml
+++ b/tests/stm32/Cargo.toml
@@ -11,6 +11,7 @@ stm32g071rb = ["embassy-stm32/stm32g071rb"] # Nucleo
11stm32g491re = ["embassy-stm32/stm32g491re"] # Nucleo 11stm32g491re = ["embassy-stm32/stm32g491re"] # Nucleo
12stm32h755zi = ["embassy-stm32/stm32h755zi-cm7"] # Nucleo 12stm32h755zi = ["embassy-stm32/stm32h755zi-cm7"] # Nucleo
13stm32wb55rg = ["embassy-stm32/stm32wb55rg"] # Nucleo 13stm32wb55rg = ["embassy-stm32/stm32wb55rg"] # Nucleo
14stm32h563zi = ["embassy-stm32/stm32h563zi"] # Nucleo
14stm32u585ai = ["embassy-stm32/stm32u585ai"] # IoT board 15stm32u585ai = ["embassy-stm32/stm32u585ai"] # IoT board
15 16
16[dependencies] 17[dependencies]
diff --git a/tests/stm32/src/bin/gpio.rs b/tests/stm32/src/bin/gpio.rs
index 18fd85d44..6a36df8cc 100644
--- a/tests/stm32/src/bin/gpio.rs
+++ b/tests/stm32/src/bin/gpio.rs
@@ -30,6 +30,8 @@ async fn main(_spawner: Spawner) {
30 let (mut a, mut b) = (p.PB6, p.PB7); 30 let (mut a, mut b) = (p.PB6, p.PB7);
31 #[cfg(feature = "stm32u585ai")] 31 #[cfg(feature = "stm32u585ai")]
32 let (mut a, mut b) = (p.PD9, p.PD8); 32 let (mut a, mut b) = (p.PD9, p.PD8);
33 #[cfg(feature = "stm32h563zi")]
34 let (mut a, mut b) = (p.PB6, p.PB7);
33 35
34 // Test initial output 36 // Test initial output
35 { 37 {
diff --git a/tests/stm32/src/bin/spi.rs b/tests/stm32/src/bin/spi.rs
index 1c5dc87c0..bf8098b1b 100644
--- a/tests/stm32/src/bin/spi.rs
+++ b/tests/stm32/src/bin/spi.rs
@@ -17,22 +17,25 @@ async fn main(_spawner: Spawner) {
17 info!("Hello World!"); 17 info!("Hello World!");
18 18
19 #[cfg(feature = "stm32f103c8")] 19 #[cfg(feature = "stm32f103c8")]
20 let (sck, mosi, miso) = (p.PA5, p.PA7, p.PA6); 20 let (spi, sck, mosi, miso) = (p.SPI1, p.PA5, p.PA7, p.PA6);
21 #[cfg(feature = "stm32f429zi")] 21 #[cfg(feature = "stm32f429zi")]
22 let (sck, mosi, miso) = (p.PA5, p.PA7, p.PA6); 22 let (spi, sck, mosi, miso) = (p.SPI1, p.PA5, p.PA7, p.PA6);
23 #[cfg(feature = "stm32h755zi")] 23 #[cfg(feature = "stm32h755zi")]
24 let (sck, mosi, miso) = (p.PA5, p.PB5, p.PA6); 24 let (spi, sck, mosi, miso) = (p.SPI1, p.PA5, p.PB5, p.PA6);
25 #[cfg(feature = "stm32g491re")] 25 #[cfg(feature = "stm32g491re")]
26 let (sck, mosi, miso) = (p.PA5, p.PA7, p.PA6); 26 let (spi, sck, mosi, miso) = (p.SPI1, p.PA5, p.PA7, p.PA6);
27 #[cfg(feature = "stm32g071rb")] 27 #[cfg(feature = "stm32g071rb")]
28 let (sck, mosi, miso) = (p.PA5, p.PA7, p.PA6); 28 let (spi, sck, mosi, miso) = (p.SPI1, p.PA5, p.PA7, p.PA6);
29 #[cfg(feature = "stm32wb55rg")] 29 #[cfg(feature = "stm32wb55rg")]
30 let (sck, mosi, miso) = (p.PA5, p.PA7, p.PA6); 30 let (spi, sck, mosi, miso) = (p.SPI1, p.PA5, p.PA7, p.PA6);
31 #[cfg(feature = "stm32u585ai")] 31 #[cfg(feature = "stm32u585ai")]
32 let (sck, mosi, miso) = (p.PE13, p.PE15, p.PE14); 32 let (spi, sck, mosi, miso) = (p.SPI1, p.PE13, p.PE15, p.PE14);
33 #[cfg(feature = "stm32h563zi")]
34 let (spi, sck, mosi, miso) = (p.SPI4, p.PE12, p.PE14, p.PE13);
33 35
36 info!("asdfa;");
34 let mut spi = Spi::new( 37 let mut spi = Spi::new(
35 p.SPI1, 38 spi,
36 sck, // Arduino D13 39 sck, // Arduino D13
37 mosi, // Arduino D11 40 mosi, // Arduino D11
38 miso, // Arduino D12 41 miso, // Arduino D12
diff --git a/tests/stm32/src/bin/spi_dma.rs b/tests/stm32/src/bin/spi_dma.rs
index cb2152e0b..b3dad8132 100644
--- a/tests/stm32/src/bin/spi_dma.rs
+++ b/tests/stm32/src/bin/spi_dma.rs
@@ -16,22 +16,24 @@ async fn main(_spawner: Spawner) {
16 info!("Hello World!"); 16 info!("Hello World!");
17 17
18 #[cfg(feature = "stm32f103c8")] 18 #[cfg(feature = "stm32f103c8")]
19 let (sck, mosi, miso, tx_dma, rx_dma) = (p.PA5, p.PA7, p.PA6, p.DMA1_CH3, p.DMA1_CH2); 19 let (spi, sck, mosi, miso, tx_dma, rx_dma) = (p.SPI1, p.PA5, p.PA7, p.PA6, p.DMA1_CH3, p.DMA1_CH2);
20 #[cfg(feature = "stm32f429zi")] 20 #[cfg(feature = "stm32f429zi")]
21 let (sck, mosi, miso, tx_dma, rx_dma) = (p.PA5, p.PA7, p.PA6, p.DMA2_CH3, p.DMA2_CH2); 21 let (spi, sck, mosi, miso, tx_dma, rx_dma) = (p.SPI1, p.PA5, p.PA7, p.PA6, p.DMA2_CH3, p.DMA2_CH2);
22 #[cfg(feature = "stm32h755zi")] 22 #[cfg(feature = "stm32h755zi")]
23 let (sck, mosi, miso, tx_dma, rx_dma) = (p.PA5, p.PB5, p.PA6, p.DMA1_CH0, p.DMA1_CH1); 23 let (spi, sck, mosi, miso, tx_dma, rx_dma) = (p.SPI1, p.PA5, p.PB5, p.PA6, p.DMA1_CH0, p.DMA1_CH1);
24 #[cfg(feature = "stm32g491re")] 24 #[cfg(feature = "stm32g491re")]
25 let (sck, mosi, miso, tx_dma, rx_dma) = (p.PA5, p.PA7, p.PA6, p.DMA1_CH1, p.DMA1_CH2); 25 let (spi, sck, mosi, miso, tx_dma, rx_dma) = (p.SPI1, p.PA5, p.PA7, p.PA6, p.DMA1_CH1, p.DMA1_CH2);
26 #[cfg(feature = "stm32g071rb")] 26 #[cfg(feature = "stm32g071rb")]
27 let (sck, mosi, miso, tx_dma, rx_dma) = (p.PA5, p.PA7, p.PA6, p.DMA1_CH1, p.DMA1_CH2); 27 let (spi, sck, mosi, miso, tx_dma, rx_dma) = (p.SPI1, p.PA5, p.PA7, p.PA6, p.DMA1_CH1, p.DMA1_CH2);
28 #[cfg(feature = "stm32wb55rg")] 28 #[cfg(feature = "stm32wb55rg")]
29 let (sck, mosi, miso, tx_dma, rx_dma) = (p.PA5, p.PA7, p.PA6, p.DMA1_CH1, p.DMA1_CH2); 29 let (spi, sck, mosi, miso, tx_dma, rx_dma) = (p.SPI1, p.PA5, p.PA7, p.PA6, p.DMA1_CH1, p.DMA1_CH2);
30 #[cfg(feature = "stm32u585ai")] 30 #[cfg(feature = "stm32u585ai")]
31 let (sck, mosi, miso, tx_dma, rx_dma) = (p.PE13, p.PE15, p.PE14, p.GPDMA1_CH0, p.GPDMA1_CH1); 31 let (spi, sck, mosi, miso, tx_dma, rx_dma) = (p.SPI1, p.PE13, p.PE15, p.PE14, p.GPDMA1_CH0, p.GPDMA1_CH1);
32 #[cfg(feature = "stm32h563zi")]
33 let (spi, sck, mosi, miso, tx_dma, rx_dma) = (p.SPI4, p.PE12, p.PE14, p.PE13, p.GPDMA1_CH0, p.GPDMA1_CH1);
32 34
33 let mut spi = Spi::new( 35 let mut spi = Spi::new(
34 p.SPI1, 36 spi,
35 sck, // Arduino D13 37 sck, // Arduino D13
36 mosi, // Arduino D11 38 mosi, // Arduino D11
37 miso, // Arduino D12 39 miso, // Arduino D12
diff --git a/tests/stm32/src/bin/usart.rs b/tests/stm32/src/bin/usart.rs
index af55867f2..52409567c 100644
--- a/tests/stm32/src/bin/usart.rs
+++ b/tests/stm32/src/bin/usart.rs
@@ -32,6 +32,8 @@ async fn main(_spawner: Spawner) {
32 let (tx, rx, usart, irq) = (p.PB6, p.PB7, p.USART1, interrupt::take!(USART1)); 32 let (tx, rx, usart, irq) = (p.PB6, p.PB7, p.USART1, interrupt::take!(USART1));
33 #[cfg(feature = "stm32u585ai")] 33 #[cfg(feature = "stm32u585ai")]
34 let (tx, rx, usart, irq) = (p.PD8, p.PD9, p.USART3, interrupt::take!(USART3)); 34 let (tx, rx, usart, irq) = (p.PD8, p.PD9, p.USART3, interrupt::take!(USART3));
35 #[cfg(feature = "stm32h563zi")]
36 let (tx, rx, usart, irq) = (p.PB6, p.PB7, p.LPUART1, interrupt::take!(LPUART1));
35 37
36 let config = Config::default(); 38 let config = Config::default();
37 let mut usart = Uart::new(usart, rx, tx, irq, NoDma, NoDma, config); 39 let mut usart = Uart::new(usart, rx, tx, irq, NoDma, NoDma, config);
diff --git a/tests/stm32/src/bin/usart_dma.rs b/tests/stm32/src/bin/usart_dma.rs
index d12605a9a..3f70791c1 100644
--- a/tests/stm32/src/bin/usart_dma.rs
+++ b/tests/stm32/src/bin/usart_dma.rs
@@ -62,6 +62,15 @@ async fn main(_spawner: Spawner) {
62 p.GPDMA1_CH0, 62 p.GPDMA1_CH0,
63 p.GPDMA1_CH1, 63 p.GPDMA1_CH1,
64 ); 64 );
65 #[cfg(feature = "stm32h563zi")]
66 let (tx, rx, usart, irq, tx_dma, rx_dma) = (
67 p.PB6,
68 p.PB7,
69 p.LPUART1,
70 interrupt::take!(LPUART1),
71 p.GPDMA1_CH0,
72 p.GPDMA1_CH1,
73 );
65 74
66 let config = Config::default(); 75 let config = Config::default();
67 let mut usart = Uart::new(usart, rx, tx, irq, tx_dma, rx_dma, config); 76 let mut usart = Uart::new(usart, rx, tx, irq, tx_dma, rx_dma, config);