module "dmx2"
This commit is contained in:
parent
20cdf7b6a6
commit
30858b66f5
2 changed files with 80 additions and 0 deletions
79
bluepill-rs/src/dmx2.rs
Normal file
79
bluepill-rs/src/dmx2.rs
Normal file
|
@ -0,0 +1,79 @@
|
|||
use stm32f1xx_hal::{dma, pac, prelude::*, serial};
|
||||
|
||||
type TxDma = dma::TxDma<serial::Tx<pac::USART1>, dma::dma1::C4>;
|
||||
type DMXUniverse<const DMX_LEN: usize> = &'static mut [u8; DMX_LEN];
|
||||
type DMXTransfer<const DMX_LEN: usize> = dma::Transfer<dma::R, DMXUniverse<DMX_LEN>, TxDma>;
|
||||
|
||||
struct TxDMAIdle<const DMX_LEN: usize> {
|
||||
dma: Option<dma::TxDma<serial::Tx<pac::USART1>, dma::dma1::C4>>,
|
||||
buffer: Option<DMXUniverse<DMX_LEN>>,
|
||||
}
|
||||
|
||||
struct TxDMABusy<const DMX_LEN: usize> {
|
||||
transfer: Option<DMXTransfer<DMX_LEN>>,
|
||||
}
|
||||
|
||||
enum TxDMA<const DMX_LEN: usize> {
|
||||
Idle(TxDMAIdle<DMX_LEN>),
|
||||
Busy(TxDMABusy<DMX_LEN>),
|
||||
}
|
||||
|
||||
pub struct DMX<const DMX_LEN: usize> {
|
||||
tx_universe: Option<DMXUniverse<DMX_LEN>>,
|
||||
sender: TxDMA<DMX_LEN>,
|
||||
}
|
||||
|
||||
impl<const DMX_LEN: usize> DMX<DMX_LEN> {
|
||||
pub fn new<PINS>(mem: &'static mut [u8]) -> Self {
|
||||
// use provided memory region
|
||||
assert!(mem.len() >= DMX_LEN * 2);
|
||||
|
||||
let (tx_universe, tx_buffer) = {
|
||||
let (left1, rest) = mem.split_at_mut(DMX_LEN);
|
||||
let (left2, _) = rest.split_at_mut(DMX_LEN);
|
||||
|
||||
let tx_universe: &mut [u8; DMX_LEN] = left1.try_into().unwrap();
|
||||
let tx_buffer: &mut [u8; DMX_LEN] = left2.try_into().unwrap();
|
||||
|
||||
(tx_universe, tx_buffer)
|
||||
};
|
||||
|
||||
// Peripherals
|
||||
let dp = unsafe { pac::Peripherals::steal() };
|
||||
let mut cp = unsafe { pac::CorePeripherals::steal() };
|
||||
|
||||
let clocks = dp
|
||||
.RCC
|
||||
.constrain()
|
||||
.cfgr
|
||||
.freeze(&mut dp.FLASH.constrain().acr);
|
||||
|
||||
let mut gpioa = dp.GPIOA.split();
|
||||
let mut afio = dp.AFIO.constrain();
|
||||
let mut dma1 = dp.DMA1.split();
|
||||
|
||||
// setup DMA1_CHANNEL4 interrupt on TransferComplete
|
||||
dma1.4.listen(dma::Event::TransferComplete);
|
||||
unsafe { cp.NVIC.set_priority(pac::Interrupt::DMA1_CHANNEL4, 1) };
|
||||
|
||||
// Serial config
|
||||
let serial = serial::Serial::new(
|
||||
dp.USART1,
|
||||
(
|
||||
gpioa.pa9.into_alternate_open_drain(&mut gpioa.crh),
|
||||
gpioa.pa10, //.into_pull_up_input(&mut gpioa.crh),
|
||||
),
|
||||
&mut afio.mapr,
|
||||
250_000.bps(),
|
||||
&clocks,
|
||||
);
|
||||
|
||||
Self {
|
||||
tx_universe: Some(tx_universe),
|
||||
sender: TxDMA::Idle(TxDMAIdle {
|
||||
dma: Some(serial.tx.with_dma(dma1.4)),
|
||||
buffer: Some(tx_buffer),
|
||||
}),
|
||||
}
|
||||
}
|
||||
}
|
|
@ -5,6 +5,7 @@
|
|||
// mod i2c_reg_slave;
|
||||
// mod i2c_slave;
|
||||
mod dmx;
|
||||
mod dmx2;
|
||||
|
||||
// extern crate panic_halt;
|
||||
extern crate panic_semihosting;
|
||||
|
|
Loading…
Reference in a new issue