cpu polling instead of dma
This commit is contained in:
@@ -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 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
|
// 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
|
// EDN OF SOFTWARE UART
|
||||||
|
|
||||||
|
|
||||||
@@ -115,6 +116,13 @@ async fn main(spawner: Spawner) {
|
|||||||
// Timer::after(Duration::from_millis(100)).await;
|
// Timer::after(Duration::from_millis(100)).await;
|
||||||
// info!("tick end");
|
// 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;
|
counter += 1;
|
||||||
let msg = if counter % 2 == 0 {
|
let msg = if counter % 2 == 0 {
|
||||||
b"AAAAA\n"
|
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<embassy_sync::blocking_mutex::raw::CriticalSectionRawMutex,1024,>,
|
||||||
|
) {
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user