only improvements
This commit is contained in:
@@ -14,7 +14,7 @@ use dma_gpio::software_uart::{
|
|||||||
gpio_dma_uart_rx::rx_dma_task,
|
gpio_dma_uart_rx::rx_dma_task,
|
||||||
debug::dump_tim6_regs,
|
debug::dump_tim6_regs,
|
||||||
};
|
};
|
||||||
use dma_gpio::config::{BAUD, TX_PIN_BIT, RX_OVERSAMPLE, TX_OVERSAMPLE, UART_CFG};
|
use dma_gpio::config::{BAUD, TX_PIN_BIT, RX_OVERSAMPLE, TX_OVERSAMPLE};
|
||||||
use dma_gpio::config::{TX_RING_BYTES, RX_RING_BYTES, PIPE_RX_SIZE};
|
use dma_gpio::config::{TX_RING_BYTES, RX_RING_BYTES, PIPE_RX_SIZE};
|
||||||
use static_cell::StaticCell;
|
use static_cell::StaticCell;
|
||||||
use {defmt_rtt as _, panic_probe as _};
|
use {defmt_rtt as _, panic_probe as _};
|
||||||
@@ -38,14 +38,14 @@ async fn main(spawner: Spawner) {
|
|||||||
|
|
||||||
// Safe one-time init from StaticCell
|
// Safe one-time init from StaticCell
|
||||||
let rx_ring: &mut [u8; RX_RING_BYTES] = RX_RING.init([0; RX_RING_BYTES]);
|
let rx_ring: &mut [u8; RX_RING_BYTES] = RX_RING.init([0; RX_RING_BYTES]);
|
||||||
let tx_ring_mem: &mut [u32; TX_RING_BYTES] =
|
let tx_ring_mem: &mut [u32; TX_RING_BYTES] = TX_RING.init([0; TX_RING_BYTES]);
|
||||||
TX_RING.init([0; TX_RING_BYTES]);
|
|
||||||
|
|
||||||
// Spawn tasks
|
// Spawn tasks
|
||||||
spawner.spawn(rx_dma_task(p.GPDMA1_CH1, &PIPE_RX, rx_ring).unwrap());
|
spawner.spawn(rx_dma_task(p.GPDMA1_CH1, &PIPE_RX, rx_ring).unwrap());
|
||||||
|
|
||||||
// Create and start the TX DMA ring in main.
|
// Create and start the TX DMA ring in main.
|
||||||
let bsrr_ptr = embassy_stm32::pac::GPIOA.bsrr().as_ptr() as *mut u32;
|
// 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();
|
let mut tx_opts = TransferOptions::default();
|
||||||
tx_opts.half_transfer_ir = true;
|
tx_opts.half_transfer_ir = true;
|
||||||
tx_opts.complete_transfer_ir = true;
|
tx_opts.complete_transfer_ir = true;
|
||||||
@@ -55,7 +55,7 @@ async fn main(spawner: Spawner) {
|
|||||||
WritableRingBuffer::new(
|
WritableRingBuffer::new(
|
||||||
p.GPDMA1_CH0,
|
p.GPDMA1_CH0,
|
||||||
TIM6_UP_REQ,
|
TIM6_UP_REQ,
|
||||||
bsrr_ptr,
|
odr_ptr,
|
||||||
tx_ring_mem,
|
tx_ring_mem,
|
||||||
tx_opts,
|
tx_opts,
|
||||||
)
|
)
|
||||||
@@ -65,13 +65,15 @@ async fn main(spawner: Spawner) {
|
|||||||
info!("TX DMA ring started");
|
info!("TX DMA ring started");
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
|
info!("tick start");
|
||||||
|
Timer::after(Duration::from_millis(100)).await;
|
||||||
|
info!("tick end");
|
||||||
write_uart_frames_to_ring(
|
write_uart_frames_to_ring(
|
||||||
&mut tx_ring,
|
&mut tx_ring,
|
||||||
TX_PIN_BIT,
|
TX_PIN_BIT,
|
||||||
b"Hello marshmallow\r\n",
|
b"Hello marshmallow\r\n",
|
||||||
&UART_CFG,
|
).await;
|
||||||
)
|
info!("text");
|
||||||
.await;
|
Timer::after(Duration::from_secs(1)).await;
|
||||||
Timer::after(Duration::from_secs(2)).await;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ use embassy_stm32::{
|
|||||||
Peri,
|
Peri,
|
||||||
};
|
};
|
||||||
use embassy_stm32::dma::{
|
use embassy_stm32::dma::{
|
||||||
ReadableRingBuffer as DmaRingRx,
|
ReadableRingBuffer,
|
||||||
TransferOptions,
|
TransferOptions,
|
||||||
};
|
};
|
||||||
use crate::config::{RX_OVERSAMPLE, UART_CFG};
|
use crate::config::{RX_OVERSAMPLE, UART_CFG};
|
||||||
@@ -30,7 +30,7 @@ pub async fn rx_dma_task(
|
|||||||
opts.complete_transfer_ir = true;
|
opts.complete_transfer_ir = true;
|
||||||
|
|
||||||
// SAFETY: ring is exclusive to this task
|
// SAFETY: ring is exclusive to this task
|
||||||
let mut rx = unsafe { DmaRingRx::new(ch, TIM7_UP_REQ, gpioa_idr, ring, opts) };
|
let mut rx = unsafe { ReadableRingBuffer::new(ch, TIM7_UP_REQ, gpioa_idr, ring, opts) };
|
||||||
rx.start();
|
rx.start();
|
||||||
|
|
||||||
let mut chunk = [0u8; 256];
|
let mut chunk = [0u8; 256];
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
// src/software_uart/gpio_dma_uart_tx.rs
|
// src/software_uart/gpio_dma_uart_tx.rs
|
||||||
use embassy_stm32::dma::Request;
|
use embassy_stm32::dma::Request;
|
||||||
use embassy_stm32::dma::WritableRingBuffer;
|
use embassy_stm32::dma::WritableRingBuffer;
|
||||||
use crate::software_uart::uart_emulation::{UartConfig, encode_uart_byte_cfg};
|
use crate::software_uart::uart_emulation::encode_uart_byte_cfg;
|
||||||
|
use crate::config::UART_CFG;
|
||||||
|
|
||||||
// kapitola 17.4.11 - 2 casovace pre 2 DMA
|
// kapitola 17.4.11 - 2 casovace pre 2 DMA
|
||||||
pub const TIM6_UP_REQ: Request = 4; // Table 137: tim6_upd_dma, strana 687 STM32U5xx datasheet
|
pub const TIM6_UP_REQ: Request = 4; // Table 137: tim6_upd_dma, strana 687 STM32U5xx datasheet
|
||||||
@@ -11,11 +12,10 @@ pub async fn write_uart_frames_to_ring(
|
|||||||
ring: &mut WritableRingBuffer<'static, u32>,
|
ring: &mut WritableRingBuffer<'static, u32>,
|
||||||
pin_bit: u8,
|
pin_bit: u8,
|
||||||
bytes: &[u8],
|
bytes: &[u8],
|
||||||
cfg: &UartConfig,
|
|
||||||
) {
|
) {
|
||||||
for &b in bytes {
|
for &b in bytes {
|
||||||
let mut frame = [0u32; 12];
|
let mut frame = [0u32; 12];
|
||||||
let used = encode_uart_byte_cfg(pin_bit, b, cfg, &mut frame);
|
let used = encode_uart_byte_cfg(pin_bit, b, &UART_CFG, &mut frame);
|
||||||
|
|
||||||
// Will wait until all words are written
|
// Will wait until all words are written
|
||||||
ring.write_exact(&frame[..used]).await.unwrap();
|
ring.write_exact(&frame[..used]).await.unwrap();
|
||||||
|
|||||||
@@ -40,7 +40,8 @@ pub fn encode_uart_byte_cfg(
|
|||||||
) -> usize {
|
) -> usize {
|
||||||
// GPIOx_BSRR register str. 636 kap. 13.4.7
|
// GPIOx_BSRR register str. 636 kap. 13.4.7
|
||||||
let set_high = |bit: u8| -> u32 { 1u32 << bit };
|
let set_high = |bit: u8| -> u32 { 1u32 << bit };
|
||||||
let set_low = |bit: u8| -> u32 { 1u32 << (bit as u32 + 16) };
|
let set_low = |bit: u8| -> u32 { 0 };
|
||||||
|
// let set_low = |bit: u8| -> u32 { 1u32 << (bit as u32 + 16) };
|
||||||
|
|
||||||
let mut idx = 0usize;
|
let mut idx = 0usize;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user