lpc55-hal 0.5.0

Hardware Abstraction Layer (HAL) for the NXP LPC55S6x ARM Cortex-33 microcontrollers
Documentation
#![no_main]
#![no_std]

extern crate panic_semihosting; // 4004 bytes
                                // extern crate panic_halt; // 672 bytes

#[macro_use(block)]
extern crate nb;

use cortex_m_rt::entry;
// use cortex_m_semihosting::dbg;
// use cortex_m_semihosting::heprintln;

use hal::drivers::pins::Level;
use hal::drivers::{
    touch::{profile_touch_sensing, ButtonPins, Edge, TouchSensor, TouchSensorChannel},
    Pins, Timer,
};
use hal::prelude::*;
pub use hal::typestates::pin::state;
use lpc55_hal as hal;

#[entry]
fn main() -> ! {
    let mut hal = hal::new();

    let clocks = hal::ClockRequirements::default()
        .system_frequency(96.MHz())
        .configure(&mut hal.anactrl, &mut hal.pmc, &mut hal.syscon)
        .unwrap();
    let fro_token = clocks.support_1mhz_fro_token().unwrap();

    let touch_token = clocks.support_touch_token().unwrap();

    let mut gpio = hal.gpio.enabled(&mut hal.syscon);

    let mut iocon = hal.iocon.enabled(&mut hal.syscon);
    let pins = Pins::take().unwrap();

    let but1 = pins.pio0_23.into_analog_input(&mut iocon, &mut gpio); // channel 0
    let but2 = pins.pio0_31.into_analog_input(&mut iocon, &mut gpio); // channel 3
    let but3 = pins.pio0_15.into_analog_input(&mut iocon, &mut gpio); // channel 2

    let mut green = pins
        .pio0_5
        .into_gpio_pin(&mut iocon, &mut gpio)
        .into_output(Level::High);
    let mut red = pins
        .pio1_19
        .into_gpio_pin(&mut iocon, &mut gpio)
        .into_output(Level::High);
    let mut blue = pins
        .pio1_21
        .into_gpio_pin(&mut iocon, &mut gpio)
        .into_output(Level::High);

    let mut delay_timer = Timer::new(hal.ctimer.0.enabled(&mut hal.syscon, fro_token));

    let button_pins = ButtonPins(but1, but2, but3);

    let adc = hal.adc.enabled(&mut hal.pmc, &mut hal.syscon);

    let touch_timer = hal
        .ctimer
        .1
        .enabled(&mut hal.syscon, clocks.support_1mhz_fro_token().unwrap());
    let touch_sync_timer = hal
        .ctimer
        .2
        .enabled(&mut hal.syscon, clocks.support_1mhz_fro_token().unwrap());
    let charge_pin = pins.pio1_16.into_match_output(&mut iocon);

    let mut dma = hal.dma.enabled(&mut hal.syscon);

    let touch_sensor = TouchSensor::new(
        [13_900, 13_900, 13_900],
        5,
        adc,
        touch_timer,
        touch_sync_timer,
        charge_pin,
        button_pins,
    );
    let mut touch_sensor = touch_sensor.enabled(&mut dma, touch_token);

    // Used to get tunning information for capacitive touch
    {
        let mut counts = [0u32; 3];
        let mut times = [0u32; 128];
        let mut results = [0u32; 128];
        profile_touch_sensing(
            &mut touch_sensor,
            &mut delay_timer,
            &mut results,
            &mut times,
        );
        for i in 0..125 {
            let src = (results[i] & (0xf << 24)) >> 24;
            let _sample_num = (times[i] - 1196) / 802;
            let _button_sample_num = (times[i] - 1192) / (802 * 3);
            // heprintln!("{}",src).unwrap();
            // heprintln!("{}\t{}\t{}\t{}\t{}\t{}",times[i], i, sample_num,src, counts[(src-3) as usize], button_sample_num).unwrap();

            counts[(src - 3) as usize] += 1;
        }
    }

    delay_timer.start(300_000.microseconds());
    block!(delay_timer.wait()).unwrap();

    loop {
        // Check for a press
        if touch_sensor.has_edge(TouchSensorChannel::Channel1, Edge::Falling) {
            touch_sensor.reset_results(TouchSensorChannel::Channel1, -1);
            red.set_low().unwrap();
        }

        if touch_sensor.has_edge(TouchSensorChannel::Channel2, Edge::Falling) {
            touch_sensor.reset_results(TouchSensorChannel::Channel2, -1);
            green.set_low().unwrap();
        }

        if touch_sensor.has_edge(TouchSensorChannel::Channel3, Edge::Falling) {
            touch_sensor.reset_results(TouchSensorChannel::Channel3, -1);
            blue.set_low().unwrap();
        }

        // Check for a release
        if touch_sensor.has_edge(TouchSensorChannel::Channel1, Edge::Rising) {
            touch_sensor.reset_results(TouchSensorChannel::Channel1, 1);
            red.set_high().unwrap();
        }

        if touch_sensor.has_edge(TouchSensorChannel::Channel2, Edge::Rising) {
            touch_sensor.reset_results(TouchSensorChannel::Channel2, 1);
            green.set_high().unwrap();
        }

        if touch_sensor.has_edge(TouchSensorChannel::Channel3, Edge::Rising) {
            touch_sensor.reset_results(TouchSensorChannel::Channel3, 1);
            blue.set_high().unwrap();
        }
    }
}