From c01a908b2578048d13fecadb3988845bc92c2cff Mon Sep 17 00:00:00 2001 From: Priec Date: Tue, 18 Nov 2025 10:29:29 +0100 Subject: [PATCH] cpu polling instead of dma --- semestralka_1e_tx_bez_dma/src/bin/main.rs | 49 ++++++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/semestralka_1e_tx_bez_dma/src/bin/main.rs b/semestralka_1e_tx_bez_dma/src/bin/main.rs index 7c12cc6..ca40ade 100644 --- a/semestralka_1e_tx_bez_dma/src/bin/main.rs +++ b/semestralka_1e_tx_bez_dma/src/bin/main.rs @@ -102,7 +102,8 @@ async fn main(spawner: Spawner) { let bsrr_ptr = embassy_stm32::pac::GPIOB.bsrr().as_ptr() as *mut u32; // POZOR B REGISTER // let odr_ptr = embassy_stm32::pac::GPIOA.odr().as_ptr() as *mut u32; // NEEDS DECODE CHANGE - spawner.spawn(tx_dma_task(p.GPDMA1_CH0, bsrr_ptr, sw_tx_ring, &PIPE_SW_TX).unwrap()); + // spawner.spawn(tx_dma_task(p.GPDMA1_CH0, bsrr_ptr, sw_tx_ring, &PIPE_SW_TX).unwrap()); + spawner.spawn(tx_cpu_task(bsrr_ptr, p.TIM6, &PIPE_SW_TX)).unwrap(); // EDN OF SOFTWARE UART @@ -115,6 +116,13 @@ async fn main(spawner: Spawner) { // Timer::after(Duration::from_millis(100)).await; // info!("tick end"); + let n = PIPE_SW_TX.read(&mut buf).await; + if n > 0 { + for &byte in &buf[..n] { + send_byte_cpu(&tx_pin, p.TIM6, byte).await; + } + } + counter += 1; let msg = if counter % 2 == 0 { b"AAAAA\n" @@ -164,3 +172,42 @@ pub async fn bridge_usart2_rx_to_usart1_tx( } } } + +#[embassy_executor::task] +pub async fn tx_cpu_task( + bsrr_ptr: *mut u32, + tim6: embassy_stm32::peripherals::TIM6, + pipe_tx: &'static embassy_sync::pipe::Pipe, +) { + use dma_gpio::config::TX_PIN_BIT; + use dma_gpio::software_uart::uart_emulation::{encode_uart_byte_cfg, UART_CFG}; + + let tim6_regs = unsafe { &*embassy_stm32::pac::TIM6::ptr() }; + let mut rx_buf = [0u8; 256]; + let mut frame_buf = [0u32; 32]; + let mut wait_tick = || async { + loop { + if tim6_regs.sr().read() & 1 != 0 { + tim6_regs.sr().write(|w| w & !1); + break; + } + embassy_futures::yield_now().await; + } + }; + + loop { + let n = pipe_tx.read(&mut rx_buf).await; + if n == 0 { + embassy_futures::yield_now().await; + continue; + } + + for &byte in &rx_buf[..n] { + let used = encode_uart_byte_cfg(TX_PIN_BIT, byte, &UART_CFG, &mut frame_buf); + for word in &frame_buf[..used] { + unsafe { core::ptr::write_volatile(bsrr_ptr, *word) }; + wait_tick().await; + } + } + } +}