/*
For a detailed explanation of this code check out the associated blog post:
https://apollolabsblog.hashnode.dev/esp32-standard-library-embedded-rust-timers
GitHub Repo containing source code and other examples:
https://github.com/apollolabsdev
For notifications on similar examples and more, subscribe to newsletter here:
https://www.theembeddedrustacean.com/subscribe
*/
use esp_idf_hal::gpio::*;
use esp_idf_hal::peripherals::Peripherals;
use esp_idf_hal::timer::config::Config;
use esp_idf_hal::timer::TimerDriver;
fn main() {
esp_idf_sys::link_patches();
let peripherals = Peripherals::take().unwrap();
// Configure and Initialize Timer Drivers
let config = Config::new();
let mut timer1 = TimerDriver::new(peripherals.timer00, &config).unwrap();
let mut timer2 = TimerDriver::new(peripherals.timer10, &config).unwrap();
// Configure Pins that Will Read the Square Wave as Inputs
let pin1 = PinDriver::input(peripherals.pins.gpio0).unwrap();
let pin2 = PinDriver::input(peripherals.pins.gpio1).unwrap();
// Declare and Init Variables that will Track Pin level
let mut pin1_current_level: Level;
let mut pin1_old_level: Level = Level::Low;
let mut pin2_current_level: Level;
let mut pin2_old_level: Level = Level::High;
// Set Counter Start Value to Zero
timer1.set_counter(0_u64).unwrap();
timer2.set_counter(0_u64).unwrap();
// Enable Counter
timer1.enable(true).unwrap();
timer2.enable(true).unwrap();
// Declare and Init Variables that will Track Count Value
let mut count1: u64 = 0;
let mut count2: u64 = 0;
loop {
// Get Level of pin 1
pin1_current_level = pin1.get_level();
// // Get Level of pin 2
pin2_current_level = pin2.get_level();
// If pin 1 level changed from Low to High then reset count
if (pin1_current_level != pin1_old_level) & (pin1_current_level == Level::High) {
timer1.set_counter(0).unwrap();
pin1_old_level = pin1_current_level;
}
// If pin 1 level changed from High to Low then capture count
if (pin1_current_level != pin1_old_level) & (pin1_current_level == Level::Low) {
count1 = timer1.counter().unwrap();
pin1_old_level = pin1_current_level;
}
// If pin 2 level changed from Low to High then reset count
if (pin2_current_level != pin2_old_level) & (pin2_current_level == Level::High) {
timer2.set_counter(0).unwrap();
pin2_old_level = pin2_current_level;
}
// If pin 2 level changed from High to Low then capture count
if (pin2_current_level != pin2_old_level) & (pin2_current_level == Level::Low) {
count2 = timer2.counter().unwrap();
pin2_old_level = pin2_current_level;
}
// Calculate and Print Out the Pulse Width
// Clock Frequency is 1 MHz According to Code
println!("Sq Wave 1 Pulse Width is {:.1}ms", count1 / 1000);
println!("Sq Wave 2 Pulse Width is {:.1}ms", count2 / 1000);
}
}
esp:0
esp:1
esp:2
esp:3
esp:4
esp:5
esp:6
esp:7
esp:8
esp:9
esp:10
esp:18
esp:19
esp:GND.1
esp:3V3.1
esp:3V3.2
esp:GND.2
esp:RST
esp:GND.3
esp:GND.4
esp:5V.1
esp:5V.2
esp:GND.5
esp:GND.6
esp:GND.7
esp:GND.8
esp:GND.9
esp:RX
esp:TX
esp:GND.10
chip1:OUT1
chip1:OUT2