From bc68e30eadd1b5e230d480290e4ee401412d6e89 Mon Sep 17 00:00:00 2001 From: Filipriec Date: Tue, 11 Nov 2025 16:03:46 +0100 Subject: [PATCH] its a separate task now --- semestralka_1/src/bin/main.rs | 38 ++---------------- .../software_uart/.gpio_dma_uart_tx.rs.swp | Bin 12288 -> 0 bytes .../src/software_uart/gpio_dma_uart_tx.rs | 28 ++++++++----- 3 files changed, 20 insertions(+), 46 deletions(-) delete mode 100644 semestralka_1/src/software_uart/.gpio_dma_uart_tx.rs.swp diff --git a/semestralka_1/src/bin/main.rs b/semestralka_1/src/bin/main.rs index 7db42bc..a4c3a13 100644 --- a/semestralka_1/src/bin/main.rs +++ b/semestralka_1/src/bin/main.rs @@ -7,15 +7,14 @@ use embassy_executor::Spawner; use embassy_stm32::dma::Request; use embassy_stm32::gpio::{Input, Output, Level, Pull, Speed}; use embassy_sync::{blocking_mutex::raw::CriticalSectionRawMutex, pipe::Pipe}; -use embassy_stm32::dma::{TransferOptions, WritableRingBuffer}; use dma_gpio::software_uart::{ dma_timer::{init_tim6_for_uart, init_tim7_for_uart}, - gpio_dma_uart_tx::encode_uart_frames, gpio_dma_uart_rx::rx_dma_task, debug::dump_tim6_regs, }; -use dma_gpio::config::{BAUD, TX_PIN_BIT, RX_OVERSAMPLE, TX_OVERSAMPLE}; +use dma_gpio::config::{BAUD, RX_OVERSAMPLE, TX_OVERSAMPLE}; use dma_gpio::config::{TX_RING_BYTES, RX_RING_BYTES, PIPE_RX_SIZE}; +use dma_gpio::software_uart::gpio_dma_uart_tx::tx_dma_task; use static_cell::StaticCell; use embassy_futures::yield_now; use {defmt_rtt as _, panic_probe as _}; @@ -49,44 +48,13 @@ async fn main(spawner: Spawner) { // Create and start the TX DMA ring in main. // let bsrr_ptr = embassy_stm32::pac::GPIOA.bsrr().as_ptr() as *mut u32; let odr_ptr = embassy_stm32::pac::GPIOA.odr().as_ptr() as *mut u32; - let mut tx_opts = TransferOptions::default(); - tx_opts.half_transfer_ir = true; - tx_opts.complete_transfer_ir = true; - - // SAFETY: tx_ring_mem is exclusive - let mut tx_ring = unsafe { - WritableRingBuffer::new( - p.GPDMA1_CH0, - TIM6_UP_REQ, - odr_ptr, - tx_ring_mem, - tx_opts, - ) - }; - // Start DMA - tx_ring.start(); - info!("TX DMA ring started"); - - let mut frame_buf = [0u32; 4096]; + spawner.spawn(tx_dma_task(p.GPDMA1_CH0, odr_ptr, tx_ring_mem).unwrap()); loop { info!("tick start"); // Timer::after(Duration::from_millis(100)).await; // info!("tick end"); - let used = encode_uart_frames( - TX_PIN_BIT, - b"Hello marshmallow\r\n", - &mut frame_buf, - ) - .await; - if used == 0 { - info!("encode_uart_frames() produced 0 words, skipping write"); - yield_now().await; - continue; - } - let _ = tx_ring.write_exact(&frame_buf[..used]).await; - info!("text"); yield_now().await; } } diff --git a/semestralka_1/src/software_uart/.gpio_dma_uart_tx.rs.swp b/semestralka_1/src/software_uart/.gpio_dma_uart_tx.rs.swp deleted file mode 100644 index 51c04ac5c957b35e8a303778d03206b2f6c14c5c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12288 zcmeI2O^g&p6vqop1V2y$2Tz(}iOZ~xGrJ4fKrc&NmIYQ>8HNEN%ciaAsotq>JMfImX9l>I{8h{)W@rO|9bBw zo2~Zv`GrM#s5U|H>?GuiQ@e$H|2(;IYb!~l)Ta4CPbB(MJ!la6>s=Z0dYlOE)sIOp z4SA#$e#@1Fg`tR6>S-kEN{9O=-6U1Iu6W3mPFS$Y+=;qMytV7SGm~A}7PVEq@z~iXE4zho8V%&JPcVrLUz3bfL=%n?@Dqt0`3RnfK0#*U5 zfK|XMU=_HB0y^G8uA*;i(f?-g-g3vg_-S8O0jq#jz$#!BunJfOtO8a6tAJI&Dqt0` z3Os@eunr;DpCsg;ZP+~i|6l(7|LgOFd-`@3>;!*3O~{|%d+-U+K!Ky+=2L|H0=@!Yf)Bw5;3{|rxZu`yLjDCe!N*_?c;F(q z0A2zwg00{dG&8#WZM3tGRlq7>6|f3e1s(|n)(ORvf0}P=f(IQplD*1UjrEw&(}b9I z^8{Q|m(EaJvFjy5bC>s-rz@jAF79!+o%&0)TB>+w`R=KM1&kq2Mp{HEpC;y4`E0Uu z*=61$^5ve&2#-A3$#4F-*}|$aMsa(vlX|>E$7xR{9aW`jRm3qa6Vhy_BV&W5gip;T z>C6m9Um5l;@1UEk(YoL^7T$7?F0`t&J#vxrP|egT)xujXw-!hlm)kKy4_SifOXKPO$!U6E{Ls{LaV7(6#};R4V!TxvHzIkb zG>VhTS}KMArD5HN#WYgP=kyAF8;8l-0dK;>(bV^O;y4lSRlIJMwiXtr+;a`LIe(@~ zWhZfCom3G4u2~K(u~uVrJy*A0r)Ou6&$li*SDXi{_#6($A21qul%L4zNBTB!_NK9=NhEB&?$VfR(hx;rIw2@&9BAak3 zTyW^NJ>L7vEDGwCl zCR@_;HKei(T@?tA7xm@X^xz$# zc6Z4-ypJ8JkSrikZ&e;SMJhYA$=^+Js~XN6KsCXcQO^XG;|$%cb{uoV+T~#yAX;SP zI2+d~wVb}s{4D-OXiAERgm$$Er(EcjUDh6&h)w!p#c{5n)Sf;+-#k0J*f=$h3bdi} zmgj_mldXxo4z;oD%iIxR1BlB-3!f?OIP{)Zy438W5+^n}9NN*KY&PD$7 zzT+gU=QwkymBM4eS?(D@nyj~IdZ$TI15Ihj3k5Pv#9gFWfNczFMBWKm;AwFP@Nu|c lRW~Wg>($KT(!uP0JWLEV@;>)cEupokEYm18^x>|{{|~HQ;hF#d diff --git a/semestralka_1/src/software_uart/gpio_dma_uart_tx.rs b/semestralka_1/src/software_uart/gpio_dma_uart_tx.rs index aaf37de..d238d03 100644 --- a/semestralka_1/src/software_uart/gpio_dma_uart_tx.rs +++ b/semestralka_1/src/software_uart/gpio_dma_uart_tx.rs @@ -5,13 +5,10 @@ use embassy_stm32::{ peripherals::GPDMA1_CH0, Peri, }; -use embassy_sync::blocking_mutex::raw::CriticalSectionRawMutex; -use embassy_sync::pipe::Pipe; use embassy_futures::yield_now; use defmt::info; -use crate::config::{TX_OVERSAMPLE, TX_PIN_BIT, UART_CFG}; -use crate::software_uart::dma_timer::init_tim6_for_uart; +use crate::config::{TX_PIN_BIT, UART_CFG}; use crate::software_uart::uart_emulation::encode_uart_byte_cfg; pub const TIM6_UP_REQ: Request = 4; @@ -44,15 +41,24 @@ pub async fn encode_uart_frames<'a>( pub async fn tx_dma_task( ch: Peri<'static, GPDMA1_CH0>, odr_ptr: *mut u32, - tx_ring: &'static mut [u32], + tx_ring_mem: &'static mut [u32], ) { - let mut opts = TransferOptions::default(); - opts.half_transfer_ir = true; - opts.complete_transfer_ir = true; + let mut tx_opts = TransferOptions::default(); + tx_opts.half_transfer_ir = true; + tx_opts.complete_transfer_ir = true; // SAFETY: tx_ring is exclusive to this task - let mut tx = unsafe { WritableRingBuffer::new(ch, TIM6_UP_REQ, odr_ptr, tx_ring, opts) }; - tx.start(); + let mut tx_ring = unsafe { + WritableRingBuffer::new( + ch, + TIM6_UP_REQ, + odr_ptr, + tx_ring_mem, + tx_opts, + ) + }; + + tx_ring.start(); info!("TX DMA ring started"); let mut frame_buf = [0u32; 4096]; @@ -68,7 +74,7 @@ pub async fn tx_dma_task( continue; } - let _ = tx.write_exact(&frame_buf[..used]).await; + let _ = tx_ring.write_exact(&frame_buf[..used]).await; yield_now().await; }