aboutsummaryrefslogtreecommitdiff
path: root/examples/src/bin/dma_interleave_transfer.rs
diff options
context:
space:
mode:
authorBogdan Petru Chircu Mare <[email protected]>2025-11-27 21:39:31 -0800
committerBogdan Petru Chircu Mare <[email protected]>2025-11-28 12:34:37 -0800
commit5a6394666e23555e4f329f7b1bd470d0728434a1 (patch)
treecf4d3f68d30224051707ff1a74769ff3588e1702 /examples/src/bin/dma_interleave_transfer.rs
parent03356a261801d7ee234490809eef3eac3c27cc52 (diff)
Updated per PR #52 feedback
Diffstat (limited to 'examples/src/bin/dma_interleave_transfer.rs')
-rw-r--r--examples/src/bin/dma_interleave_transfer.rs31
1 files changed, 7 insertions, 24 deletions
diff --git a/examples/src/bin/dma_interleave_transfer.rs b/examples/src/bin/dma_interleave_transfer.rs
index 710f18de3..949ea0605 100644
--- a/examples/src/bin/dma_interleave_transfer.rs
+++ b/examples/src/bin/dma_interleave_transfer.rs
@@ -4,7 +4,6 @@
4//! to interleave data during transfer. 4//! to interleave data during transfer.
5//! 5//!
6//! # Embassy-style features demonstrated: 6//! # Embassy-style features demonstrated:
7//! - `dma::edma_tcd()` accessor for simplified register access
8//! - `TransferOptions::default()` for configuration (used internally) 7//! - `TransferOptions::default()` for configuration (used internally)
9//! - DMA channel with `DmaChannel::new()` 8//! - DMA channel with `DmaChannel::new()`
10 9
@@ -13,9 +12,8 @@
13 12
14use embassy_executor::Spawner; 13use embassy_executor::Spawner;
15use embassy_mcxa::clocks::config::Div8; 14use embassy_mcxa::clocks::config::Div8;
16use embassy_mcxa::clocks::Gate; 15use embassy_mcxa::dma::{DmaChannel, DmaCh0InterruptHandler};
17use embassy_mcxa::dma::{edma_tcd, DmaChannel, DmaCh0InterruptHandler}; 16use embassy_mcxa::bind_interrupts;
18use embassy_mcxa::{bind_interrupts, dma};
19use embassy_mcxa::lpuart::{Blocking, Config, Lpuart, LpuartTx}; 17use embassy_mcxa::lpuart::{Blocking, Config, Lpuart, LpuartTx};
20use embassy_mcxa::pac; 18use embassy_mcxa::pac;
21use {defmt_rtt as _, embassy_mcxa as hal, panic_probe as _}; 19use {defmt_rtt as _, embassy_mcxa as hal, panic_probe as _};
@@ -80,19 +78,7 @@ async fn main(_spawner: Spawner) {
80 78
81 defmt::info!("DMA interleave transfer example starting..."); 79 defmt::info!("DMA interleave transfer example starting...");
82 80
83 // Enable DMA0 clock and release reset 81 // Enable DMA interrupt (DMA clock/reset/init is handled automatically by HAL)
84 unsafe {
85 hal::peripherals::DMA0::enable_clock();
86 hal::peripherals::DMA0::release_reset();
87 }
88
89 let pac_periphs = unsafe { pac::Peripherals::steal() };
90
91 unsafe {
92 dma::init(&pac_periphs);
93 }
94
95 // Enable DMA interrupt
96 unsafe { 82 unsafe {
97 cortex_m::peripheral::NVIC::unmask(pac::Interrupt::DMA_CH0); 83 cortex_m::peripheral::NVIC::unmask(pac::Interrupt::DMA_CH0);
98 } 84 }
@@ -130,15 +116,12 @@ async fn main(_spawner: Spawner) {
130 // Create DMA channel using Embassy-style API 116 // Create DMA channel using Embassy-style API
131 let dma_ch0 = DmaChannel::new(p.DMA_CH0); 117 let dma_ch0 = DmaChannel::new(p.DMA_CH0);
132 118
133 // Use edma_tcd() accessor instead of passing register block around
134 let edma = edma_tcd();
135
136 // Configure interleaved transfer using direct TCD access: 119 // Configure interleaved transfer using direct TCD access:
137 // - src_offset = 4: advance source by 4 bytes after each read 120 // - src_offset = 4: advance source by 4 bytes after each read
138 // - dst_offset = 8: advance dest by 8 bytes after each write 121 // - dst_offset = 8: advance dest by 8 bytes after each write
139 // This spreads source data across every other word in destination 122 // This spreads source data across every other word in destination
140 unsafe { 123 unsafe {
141 let t = edma.tcd(0); 124 let t = dma_ch0.tcd();
142 125
143 // Reset channel state 126 // Reset channel state
144 t.ch_csr().write(|w| { 127 t.ch_csr().write(|w| {
@@ -182,14 +165,14 @@ async fn main(_spawner: Spawner) {
182 cortex_m::asm::dsb(); 165 cortex_m::asm::dsb();
183 166
184 tx.blocking_write(b"Triggering transfer...\r\n").unwrap(); 167 tx.blocking_write(b"Triggering transfer...\r\n").unwrap();
185 dma_ch0.trigger_start(edma); 168 dma_ch0.trigger_start();
186 } 169 }
187 170
188 // Wait for completion using channel helper method 171 // Wait for completion using channel helper method
189 while !dma_ch0.is_done(edma) { 172 while !dma_ch0.is_done() {
190 cortex_m::asm::nop(); 173 cortex_m::asm::nop();
191 } 174 }
192 unsafe { dma_ch0.clear_done(edma); } 175 unsafe { dma_ch0.clear_done(); }
193 176
194 tx.blocking_write(b"\r\nEDMA interleave transfer example finish.\r\n\r\n") 177 tx.blocking_write(b"\r\nEDMA interleave transfer example finish.\r\n\r\n")
195 .unwrap(); 178 .unwrap();