From 89ee552da375f7ad4061449556334cf858dad677 Mon Sep 17 00:00:00 2001 From: Priec Date: Wed, 19 Nov 2025 14:41:39 +0100 Subject: [PATCH] working only at 600 baud, we are reading data of the pin in the interrupt --- semestralka_1d_rx_bez_dma/src/bin/main.rs | 39 ++++++++++++++++++++--- semestralka_1d_rx_bez_dma/src/config.rs | 4 +-- 2 files changed, 37 insertions(+), 6 deletions(-) diff --git a/semestralka_1d_rx_bez_dma/src/bin/main.rs b/semestralka_1d_rx_bez_dma/src/bin/main.rs index 15c5eda..e37b0d9 100644 --- a/semestralka_1d_rx_bez_dma/src/bin/main.rs +++ b/semestralka_1d_rx_bez_dma/src/bin/main.rs @@ -29,12 +29,15 @@ use dma_gpio::hw_uart_internal::driver::uart_task as uart_task_internal; use dma_gpio::config::{PIPE_INT_TX, PIPE_INT_RX}; use embassy_time::{Duration, Timer}; use embassy_stm32::pac; +use embassy_stm32::interrupt; use {defmt_rtt as _, panic_probe as _}; use cortex_m::interrupt::Mutex; use core::cell::RefCell; +use embassy_sync::channel::Channel; static RX_PIN_GLOBAL: Mutex>>> = Mutex::new(RefCell::new(None)); +static PD6_BITS: Channel = Channel::new(); bind_interrupts!(struct Irqs { USART1 => BufferedInterruptHandler; @@ -113,18 +116,46 @@ async fn main(spawner: Spawner) { init_tim6_for_uart(p.TIM6, BAUD, TX_OVERSAMPLE); init_tim7_for_uart(p.TIM7, BAUD, RX_OVERSAMPLE); - unsafe { cortex_m::peripheral::NVIC::unmask(pac::Interrupt::TIM7); } - info!("TIM7 Interrupt enabled"); dump_tim6_regs(); // EDN OF SOFTWARE UART - - + unsafe { cortex_m::peripheral::NVIC::unmask(pac::Interrupt::TIM7); } loop { + if let Ok(bit) = PD6_BITS.try_receive() { + // only called when ISR pushed something + info!("c"); + } yield_now().await; } } +#[interrupt] +fn TIM7() { + let tim = unsafe { pac::TIM7 }; + + // acknowledge update + if tim.sr().read().uif() { + tim.sr().modify(|w| w.set_uif(false)); + + // quick PD6 read + let bit = cortex_m::interrupt::free(|cs| { + RX_PIN_GLOBAL + .borrow(cs) + .borrow() + .as_ref() + .map(|pin| pin.is_high()) + .unwrap_or(false) + }); + + // track state change; push if different + static mut LAST: bool = false; + if bit != unsafe { LAST } { + unsafe { LAST = bit; } + let _ = PD6_BITS.try_send(bit as u8); + } + } +} + #[embassy_executor::task] pub async fn bridge_usart1_rx_to_usart2_tx( usart1_rx: &'static Pipe, diff --git a/semestralka_1d_rx_bez_dma/src/config.rs b/semestralka_1d_rx_bez_dma/src/config.rs index e2c6377..c189e21 100644 --- a/semestralka_1d_rx_bez_dma/src/config.rs +++ b/semestralka_1d_rx_bez_dma/src/config.rs @@ -3,13 +3,13 @@ use crate::software_uart::uart_emulation::{Parity, StopBits, UartConfig}; use embassy_sync::blocking_mutex::raw::CriticalSectionRawMutex; use embassy_sync::pipe::Pipe; -pub const BAUD: u32 = 9_600; +pub const BAUD: u32 = 600; // pub const TX_PIN_BIT: u8 = 2; // PA2 // pub const RX_PIN_BIT: u8 = 3; // PA3 pub const TX_PIN_BIT: u8 = 0; // PB2 pub const RX_PIN_BIT: u8 = 3; // PC3 pub const TX_OVERSAMPLE: u16 = 1; -pub const RX_OVERSAMPLE: u16 = 16; +pub const RX_OVERSAMPLE: u16 = 1; pub const RX_RING_BYTES: usize = 4096; pub const TX_RING_BYTES: usize = 4096;