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;
extern crate panic_halt;
use core::{convert::TryFrom, fmt::Write};
use cortex_m_rt::entry;

use lpc55_hal as hal;

use hal::{
    drivers::{Pins, SpiMaster},
    time::{Hertz, RateExtensions},
    traits::wg::spi::{Mode, Phase, Polarity},
    typestates::pin::flexcomm::{NoCs, NoMiso},
};

use ssd1306::{self, prelude::*};

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

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

    let clocks = hal::ClockRequirements::default()
        // .system_freq(96.mhz())
        // .support_flexcomm()
        .configure(&mut anactrl, &mut pmc, &mut syscon)
        .unwrap();

    let token = clocks.support_flexcomm_token().unwrap();

    // SPI8 is the high-speed SPI
    let spi = hal.flexcomm.8.enabled_as_spi(&mut syscon, &token);

    let pins = Pins::take().unwrap();

    let sck = pins.pio1_2.into_spi8_sck_pin(&mut iocon);
    let mosi = pins.pio0_26.into_spi8_mosi_pin(&mut iocon);
    // let miso = pins.pio1_3.into_spi8_miso_pin(&mut iocon);
    let miso = NoMiso;
    // let cs = pins.pio1_1.into_spi8_cs_pin(&mut iocon);
    let cs = NoCs;

    // try this: currently no way to use SWCLK pin
    // let danger = pins.pio0_11.into_usart6_rx_pin(&mut iocon);

    let spi_pins = (sck, mosi, miso, cs);

    let spi_mode = Mode {
        polarity: Polarity::IdleLow,
        phase: Phase::CaptureOnFirstTransition,
    };

    let spi = SpiMaster::new(
        spi,
        spi_pins,
        Hertz::try_from(100_u32.kHz()).unwrap(),
        spi_mode,
    );

    let dc = pins
        .pio1_5
        .into_gpio_pin(&mut iocon, &mut gpio)
        .into_output_high();

    // OLED
    let mut display: TerminalMode<_> = ssd1306::Builder::new()
        .size(DisplaySize::Display128x32)
        // .size(DisplaySize::Display70x40)  // <-- TODO
        // .with_rotation(DisplayRotation::Rotate90)
        .connect_spi(spi, dc)
        .into();

    display.init().unwrap();
    display.clear().ok();

    loop {
        for c in 97..123 {
            let _ = display.write_str(unsafe { core::str::from_utf8_unchecked(&[c]) });
        }
        for c in 65..91 {
            let _ = display.write_str(unsafe { core::str::from_utf8_unchecked(&[c]) });
        }
    }
}