mirror of
https://github.com/esp-rs/esp-idf-hal.git
synced 2025-09-27 12:21:02 +00:00
130 lines
4.5 KiB
Rust
130 lines
4.5 KiB
Rust
//! A simple example that sets up a RMT transmitter and an RMT receiver
|
|
//!
|
|
//! GPIO pin 2 is input and GPIO pin 4 is output
|
|
//!
|
|
//! TYPICAL OUTPUT
|
|
//! Tx Loop
|
|
//! Rx Loop
|
|
//! level0 = High dur0 = PulseTicks(620) level1 = Low dur1 = PulseTicks(620)
|
|
//! level0 = High dur0 = PulseTicks(620) level1 = Low dur1 = PulseTicks(620)
|
|
//! level0 = High dur0 = PulseTicks(210) level1 = Low dur1 = PulseTicks(410)
|
|
//! level0 = High dur0 = PulseTicks(410) level1 = Low dur1 = PulseTicks(210)
|
|
//! level0 = High dur0 = PulseTicks(210) level1 = Low dur1 = PulseTicks(0)
|
|
//! Rx Loop
|
|
//! level0 = High dur0 = PulseTicks(620) level1 = Low dur1 = PulseTicks(620)
|
|
//! level0 = High dur0 = PulseTicks(620) level1 = Low dur1 = PulseTicks(620)
|
|
//! level0 = High dur0 = PulseTicks(210) level1 = Low dur1 = PulseTicks(410)
|
|
//! level0 = High dur0 = PulseTicks(410) level1 = Low dur1 = PulseTicks(210)
|
|
//! level0 = High dur0 = PulseTicks(210) level1 = Low dur1 = PulseTicks(0)
|
|
//! Tx Loop
|
|
|
|
#![allow(unknown_lints)]
|
|
#![allow(unexpected_cfgs)]
|
|
|
|
#[cfg(any(feature = "rmt-legacy", esp_idf_version_major = "4"))]
|
|
fn main() -> anyhow::Result<()> {
|
|
example::main()
|
|
}
|
|
|
|
#[cfg(not(any(feature = "rmt-legacy", esp_idf_version_major = "4")))]
|
|
fn main() -> anyhow::Result<()> {
|
|
println!("This example requires feature `rmt-legacy` enabled or using ESP-IDF v4.4.X");
|
|
|
|
loop {
|
|
std::thread::sleep(std::time::Duration::from_millis(1000));
|
|
}
|
|
}
|
|
|
|
#[cfg(any(feature = "rmt-legacy", esp_idf_version_major = "4"))]
|
|
mod example {
|
|
use esp_idf_hal::{
|
|
delay::FreeRtos,
|
|
prelude::Peripherals,
|
|
rmt::{
|
|
FixedLengthSignal, PinState, Pulse, PulseTicks, Receive, RmtReceiveConfig,
|
|
RmtTransmitConfig, RxRmtDriver, TxRmtDriver,
|
|
},
|
|
};
|
|
|
|
pub fn main() -> anyhow::Result<()> {
|
|
println!("Starting APP!");
|
|
|
|
let peripherals = Peripherals::take()?;
|
|
|
|
/*
|
|
*********************** SET UP RMT RECEIVER ******************************
|
|
*/
|
|
let mut rx = RxRmtDriver::new(
|
|
peripherals.rmt.channel2,
|
|
peripherals.pins.gpio2,
|
|
&RmtReceiveConfig::new().idle_threshold(700u16),
|
|
250,
|
|
)?;
|
|
|
|
rx.start()?;
|
|
|
|
let _ = std::thread::Builder::new()
|
|
.stack_size(10000)
|
|
.spawn(move || loop {
|
|
println!("Rx Loop");
|
|
|
|
let mut pulses = [(Pulse::zero(), Pulse::zero()); 250];
|
|
|
|
// See sdkconfig.defaults to determine the tick time value ( default is one tick = 10 milliseconds)
|
|
// Set ticks_to_wait to 0 for non-blocking
|
|
let receive = rx.receive(&mut pulses, 0).unwrap();
|
|
|
|
if let Receive::Read(length) = receive {
|
|
let pulses = &pulses[..length];
|
|
|
|
for (pulse0, pulse1) in pulses {
|
|
println!("0={pulse0:?}, 1={pulse1:?}");
|
|
}
|
|
}
|
|
|
|
FreeRtos::delay_ms(500);
|
|
});
|
|
|
|
/*
|
|
*********************** SET UP RMT TRANSMITTER ******************************
|
|
*/
|
|
|
|
// Prepare the tx_config
|
|
// The default uses one memory block or 64 signals and clock divider set to 80 (1us tick)
|
|
let mut tx = TxRmtDriver::new(
|
|
peripherals.rmt.channel0,
|
|
peripherals.pins.gpio4,
|
|
&RmtTransmitConfig::new(),
|
|
)?;
|
|
|
|
// Prepare signal pulse signal to be sent.
|
|
let one_low = Pulse::new(PinState::Low, PulseTicks::new(410)?);
|
|
let one_high = Pulse::new(PinState::High, PulseTicks::new(210)?);
|
|
let zero_low = Pulse::new(PinState::Low, PulseTicks::new(210)?);
|
|
let zero_high = Pulse::new(PinState::High, PulseTicks::new(410)?);
|
|
let sync_low = Pulse::new(PinState::Low, PulseTicks::new(620)?);
|
|
let sync_high = Pulse::new(PinState::High, PulseTicks::new(620)?);
|
|
|
|
let _ = std::thread::spawn(move || loop {
|
|
println!("Tx Loop");
|
|
|
|
// Create a sequence
|
|
let mut signal = FixedLengthSignal::<5>::new();
|
|
signal.set(0, &(sync_high, sync_low)).unwrap();
|
|
signal.set(1, &(sync_high, sync_low)).unwrap();
|
|
signal.set(2, &(one_high, one_low)).unwrap();
|
|
signal.set(3, &(zero_high, zero_low)).unwrap();
|
|
signal.set(4, &(one_high, one_low)).unwrap();
|
|
|
|
// Transmit the signal (send sequence)
|
|
tx.start(signal).unwrap();
|
|
|
|
FreeRtos::delay_ms(1000);
|
|
});
|
|
|
|
loop {
|
|
FreeRtos::delay_ms(3000);
|
|
}
|
|
}
|
|
}
|