forked from M-Labs/ionpak-thermostat
Add UART debug port.
This commit is contained in:
parent
9fdce3ac4c
commit
8a49dfc980
|
@ -7,6 +7,7 @@ extern crate cortex_m_rt;
|
||||||
extern crate tm4c129x;
|
extern crate tm4c129x;
|
||||||
|
|
||||||
use core::cell::{Cell, RefCell};
|
use core::cell::{Cell, RefCell};
|
||||||
|
use core::fmt;
|
||||||
use cortex_m::ctxt::Local;
|
use cortex_m::ctxt::Local;
|
||||||
use cortex_m::exception::Handlers as ExceptionHandlers;
|
use cortex_m::exception::Handlers as ExceptionHandlers;
|
||||||
use cortex_m::interrupt::Mutex;
|
use cortex_m::interrupt::Mutex;
|
||||||
|
@ -54,6 +55,39 @@ const ERR_RESN: u8 = 0x01; // PQ0
|
||||||
|
|
||||||
const PWM_LOAD: u16 = (/*pwmclk*/16_000_000u32 / /*freq*/100_000) as u16;
|
const PWM_LOAD: u16 = (/*pwmclk*/16_000_000u32 / /*freq*/100_000) as u16;
|
||||||
|
|
||||||
|
const UART_DIV_16P6: u32 = /*altclk*/16_000_000 * (1 << /*len(divfrac)*/6) /
|
||||||
|
(/*clkdiv*/16 * /*baud*/115200);
|
||||||
|
|
||||||
|
|
||||||
|
pub struct UART0;
|
||||||
|
|
||||||
|
impl fmt::Write for UART0 {
|
||||||
|
fn write_str(&mut self, s: &str) -> Result<(), fmt::Error> {
|
||||||
|
for c in s.bytes() {
|
||||||
|
unsafe {
|
||||||
|
let uart_0 = tm4c129x::UART0.get();
|
||||||
|
while (*uart_0).fr.read().txff().bit() {}
|
||||||
|
(*uart_0).dr.write(|w| w.data().bits(c))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[macro_export]
|
||||||
|
macro_rules! print {
|
||||||
|
($($arg:tt)*) => ({
|
||||||
|
use core::fmt::Write;
|
||||||
|
write!($crate::UART0, $($arg)*).unwrap()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
#[macro_export]
|
||||||
|
macro_rules! println {
|
||||||
|
($fmt:expr) => (print!(concat!($fmt, "\n")));
|
||||||
|
($fmt:expr, $($arg:tt)*) => (print!(concat!($fmt, "\n"), $($arg)*));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
fn set_led(nr: u8, state: bool) {
|
fn set_led(nr: u8, state: bool) {
|
||||||
cortex_m::interrupt::free(|cs| {
|
cortex_m::interrupt::free(|cs| {
|
||||||
|
@ -120,7 +154,6 @@ fn error_reset() {
|
||||||
|
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
unsafe { cortex_m::interrupt::enable(); }
|
|
||||||
cortex_m::interrupt::free(|cs| {
|
cortex_m::interrupt::free(|cs| {
|
||||||
let sysctl = tm4c129x::SYSCTL.borrow(cs);
|
let sysctl = tm4c129x::SYSCTL.borrow(cs);
|
||||||
let nvic = tm4c129x::NVIC.borrow(cs);
|
let nvic = tm4c129x::NVIC.borrow(cs);
|
||||||
|
@ -145,9 +178,10 @@ fn main() {
|
||||||
systick.enable_counter();
|
systick.enable_counter();
|
||||||
systick.enable_interrupt();
|
systick.enable_interrupt();
|
||||||
|
|
||||||
// Bring up GPIO ports D, E, F, G, K, L, P, Q
|
// Bring up GPIO ports A, D, E, F, G, K, L, P, Q
|
||||||
sysctl.rcgcgpio.modify(|_, w| {
|
sysctl.rcgcgpio.modify(|_, w| {
|
||||||
w.r3().bit(true)
|
w.r0().bit(true)
|
||||||
|
.r3().bit(true)
|
||||||
.r4().bit(true)
|
.r4().bit(true)
|
||||||
.r5().bit(true)
|
.r5().bit(true)
|
||||||
.r6().bit(true)
|
.r6().bit(true)
|
||||||
|
@ -156,6 +190,7 @@ fn main() {
|
||||||
.r13().bit(true)
|
.r13().bit(true)
|
||||||
.r14().bit(true)
|
.r14().bit(true)
|
||||||
});
|
});
|
||||||
|
while !sysctl.prgpio.read().r0().bit() {}
|
||||||
while !sysctl.prgpio.read().r3().bit() {}
|
while !sysctl.prgpio.read().r3().bit() {}
|
||||||
while !sysctl.prgpio.read().r4().bit() {}
|
while !sysctl.prgpio.read().r4().bit() {}
|
||||||
while !sysctl.prgpio.read().r5().bit() {}
|
while !sysctl.prgpio.read().r5().bit() {}
|
||||||
|
@ -165,6 +200,23 @@ fn main() {
|
||||||
while !sysctl.prgpio.read().r13().bit() {}
|
while !sysctl.prgpio.read().r13().bit() {}
|
||||||
while !sysctl.prgpio.read().r14().bit() {}
|
while !sysctl.prgpio.read().r14().bit() {}
|
||||||
|
|
||||||
|
// Set up UART0 at 115200
|
||||||
|
let gpio_a = tm4c129x::GPIO_PORTA_AHB.borrow(cs);
|
||||||
|
gpio_a.dir.write(|w| w.dir().bits(0b11));
|
||||||
|
gpio_a.den.write(|w| w.den().bits(0b11));
|
||||||
|
gpio_a.afsel.write(|w| w.afsel().bits(0b11));
|
||||||
|
gpio_a.pctl.write(|w| unsafe { w.pmc0().bits(1).pmc1().bits(1) });
|
||||||
|
|
||||||
|
sysctl.rcgcuart.modify(|_, w| w.r0().bit(true));
|
||||||
|
while !sysctl.pruart.read().r0().bit() {}
|
||||||
|
|
||||||
|
let uart_0 = tm4c129x::UART0.borrow(cs);
|
||||||
|
uart_0.cc.write(|w| w.cs().altclk());
|
||||||
|
uart_0.ibrd.write(|w| w.divint().bits((UART_DIV_16P6 >> 6) as u16));
|
||||||
|
uart_0.fbrd.write(|w| w.divfrac().bits(UART_DIV_16P6 as u8));
|
||||||
|
uart_0.lcrh.write(|w| w.wlen()._8().fen().bit(true));
|
||||||
|
uart_0.ctl.write(|w| w.rxe().bit(true).txe().bit(true).uarten().bit(true));
|
||||||
|
|
||||||
// Set up LEDs
|
// Set up LEDs
|
||||||
let gpio_k = tm4c129x::GPIO_PORTK.borrow(cs);
|
let gpio_k = tm4c129x::GPIO_PORTK.borrow(cs);
|
||||||
gpio_k.dir.write(|w| w.dir().bits(LED1|LED2));
|
gpio_k.dir.write(|w| w.dir().bits(LED1|LED2));
|
||||||
|
@ -270,6 +322,8 @@ fn main() {
|
||||||
set_fbv_pwm(PWM_LOAD/8);
|
set_fbv_pwm(PWM_LOAD/8);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
println!("ready");
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
cortex_m::interrupt::free(|cs| {
|
cortex_m::interrupt::free(|cs| {
|
||||||
let gpio_l = tm4c129x::GPIO_PORTL.borrow(cs);
|
let gpio_l = tm4c129x::GPIO_PORTL.borrow(cs);
|
||||||
|
|
Loading…
Reference in New Issue