#![no_main]
#![no_std]
use embedded_hal::digital::v2::OutputPin;
use embedded_hal::prelude::*;
use msp430_rt::entry;
use msp430fr247x_hal::{
clock::{ClockConfig, DcoclkFreqSel, MclkDiv, SmclkDiv},
fram::Fram,
gpio::Batch,
pmm::Pmm,
serial::*,
watchdog::Wdt,
};
use nb::block;
#[cfg(debug_assertions)]
use panic_msp430 as _;
#[cfg(not(debug_assertions))]
use panic_never as _;
#[entry]
fn main() -> ! {
if let Some(periph) = msp430fr247x::Peripherals::take() {
let mut fram = Fram::new(periph.FRCTL);
let _wdt = Wdt::constrain(periph.WDT_A);
let (_smclk, aclk) = ClockConfig::new(periph.CS)
.mclk_dcoclk(DcoclkFreqSel::_1MHz, MclkDiv::_1)
.smclk_on(SmclkDiv::_2)
.aclk_refoclk()
.freeze(&mut fram);
let pmm = Pmm::new(periph.PMM);
let p1 = Batch::new(periph.P1).split(&pmm);
let mut led = p1.pin0.to_output();
led.set_low().ok();
let (mut tx, mut rx) = SerialConfig::new(
periph.E_USCI_A0,
BitOrder::LsbFirst,
BitCount::EightBits,
StopBits::OneStopBit,
Parity::NoParity,
Loopback::NoLoop,
9600,
)
.use_aclk(&aclk)
.split(p1.pin4.to_alternate1(), p1.pin5.to_alternate1());
led.set_high().ok();
tx.bwrite_all(b"HELLO\n").ok();
loop {
let ch = match block!(rx.read()) {
Ok(c) => c,
Err(err) => {
(match err {
RecvError::Parity => '!',
RecvError::Overrun(_) => '}',
RecvError::Framing => '?',
}) as u8
}
};
block!(tx.write(ch)).ok();
}
} else {
loop {}
}
}
#[no_mangle]
extern "C" fn abort() -> ! {
panic!();
}