diff --git a/Cargo.toml b/Cargo.toml index 40e4b95..9878b8f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,6 +8,7 @@ license = "MIT OR Apache-2.0" cortex-m = {version = "0.7"} cortex-m-rt = "0.7" embedded-hal = { version = "0.2.5", features = ["unproven"] } +embedded-alloc = "0.5.1" defmt = "0.3" defmt-rtt = "0.4" @@ -17,7 +18,6 @@ panic-probe = { version = "0.3", features = ["print-defmt"] } rp-pico = "0.8" max31855 = "0.1.0" hd44780-driver = "0.4.0" -embedded-alloc = "0.5.1" # cargo build/run [profile.dev] diff --git a/src/main.rs b/src/main.rs index 3d8364a..2807908 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,32 +3,35 @@ extern crate alloc; use alloc::format; -use bsp::{ - entry, - hal::{ - gpio, - uart::{UartConfig, UartPeripheral}, - }, -}; use core::fmt::Write; use cortex_m::delay::Delay; use defmt_rtt as _; use embedded_alloc::Heap; -use embedded_hal::digital::v2::OutputPin; -use embedded_hal::spi::MODE_0; +use embedded_hal::{digital::v2::OutputPin, spi::MODE_0}; +use hd44780::{bus::FourBitBus, HD44780}; use panic_probe as _; -// Provide an alias for our BSP so we can switch targets quickly. -// Uncomment the BSP you included in Cargo.toml, the rest of the code does not need to change. -use rp_pico as bsp; - -use bsp::hal::{ - clocks::{init_clocks_and_plls, Clock}, - fugit::RateExtU32, - pac, - sio::Sio, - spi::Spi, - watchdog::Watchdog, +use rp_pico::{ + entry, + hal::{ + clocks::{init_clocks_and_plls, Clock}, + fugit::RateExtU32, + gpio::{ + self, + bank0::{ + Gpio0, Gpio1, Gpio14, Gpio16, Gpio17, Gpio18, Gpio19, Gpio2, Gpio20, Gpio21, + Gpio25, Gpio3, Gpio4, Gpio5, + }, + FunctionSio, FunctionSpi, FunctionUart, Pin, PullDown, SioOutput, + }, + pac, + sio::Sio, + spi::{self, Spi}, + uart::{self, UartConfig, UartPeripheral}, + watchdog::Watchdog, + }, + pac::{SPI0, UART0}, + Pins, }; use hd44780_driver as hd44780; @@ -47,6 +50,53 @@ fn write_lcd( lcd.write_str(string, delay).unwrap(); } +type Uart = UartPeripheral< + uart::Enabled, + UART0, + ( + Pin, + Pin, + ), +>; + +type Led = Pin, PullDown>; + +type ExternalLed = Pin, PullDown>; + +type ThermocoupleSpi = Spi< + spi::Enabled, + SPI0, + ( + Pin, + Pin, + Pin, + ), +>; + +type Lcd = HD44780< + FourBitBus< + Pin, PullDown>, + Pin, PullDown>, + Pin, PullDown>, + Pin, PullDown>, + Pin, PullDown>, + Pin, PullDown>, + >, +>; + +struct Thermocouple { + cs: Pin, PullDown>, + spi: ThermocoupleSpi, +} + +impl Thermocouple { + fn read_temp( + &mut self, + ) -> Result> { + self.spi.read_thermocouple(&mut self.cs, Unit::Celsius) + } +} + #[entry] fn main() -> ! { let mut pac = pac::Peripherals::take().unwrap(); @@ -78,52 +128,57 @@ fn main() -> ! { let mut delay = cortex_m::delay::Delay::new(core.SYST, clocks.system_clock.freq().to_Hz()); - let pins = bsp::Pins::new( + let pins = Pins::new( pac.IO_BANK0, pac.PADS_BANK0, sio.gpio_bank0, &mut pac.RESETS, ); - let uart_pins = (pins.gpio0.into_function(), pins.gpio1.into_function()); - let mut uart = UartPeripheral::new(pac.UART0, uart_pins, &mut pac.RESETS) - .enable( - UartConfig::new( - 9600u32.Hz(), - bsp::hal::uart::DataBits::Eight, - None, - bsp::hal::uart::StopBits::One, - ), - clocks.peripheral_clock.freq(), - ) - .unwrap(); + let mut uart: Uart = UartPeripheral::new( + pac.UART0, + (pins.gpio0.into_function(), pins.gpio1.into_function()), + &mut pac.RESETS, + ) + .enable( + UartConfig::new( + 9600u32.Hz(), + rp_pico::hal::uart::DataBits::Eight, + None, + rp_pico::hal::uart::StopBits::One, + ), + clocks.peripheral_clock.freq(), + ) + .unwrap(); defmt::info!("Program start"); writeln!(uart, "Program start\r",).unwrap(); - let mut led_pin = pins.led.into_push_pull_output(); - let mut external_led_pin = pins.gpio14.into_push_pull_output(); - //clk - let thermometer_spi_sck = pins.gpio2.into_function::(); - //MOSI, I think unused? - let thermometer_spi_tx = pins.gpio3.into_function::(); - //do, or MISO. - let thermometer_spi_rx = pins.gpio4.into_function::(); + let mut led_pin: Led = pins.led.into_push_pull_output(); + let mut external_led_pin: ExternalLed = pins.gpio14.into_push_pull_output(); + //cs - let mut thermometer_spi_csn = pins - .gpio5 - .into_push_pull_output_in_state(gpio::PinState::Low); - let thermometer_spi_device = pac.SPI0; - let spi_pin_layout = (thermometer_spi_tx, thermometer_spi_rx, thermometer_spi_sck); - let mut spi = Spi::<_, _, _, 8>::new(thermometer_spi_device, spi_pin_layout).init( - &mut pac.RESETS, - 125_000_000u32.Hz(), - 4u32.MHz(), - MODE_0, - ); + let mut thermocouple = Thermocouple { + cs: pins + .gpio5 + .into_push_pull_output_in_state(gpio::PinState::Low), - let mut lcd = hd44780::HD44780::new_4bit( + spi: Spi::<_, _, _, 8>::new( + thermometer_spi_device, + ( + //mosi + pins.gpio3.into_function::(), + //miso/do + pins.gpio4.into_function::(), + //clk + pins.gpio2.into_function::(), + ), + ) + .init(&mut pac.RESETS, 125_000_000u32.Hz(), 4u32.MHz(), MODE_0), + }; + + let mut lcd: Lcd = hd44780::HD44780::new_4bit( pins.gpio16.into_push_pull_output(), //rs pins.gpio17.into_push_pull_output(), //enable pins.gpio18.into_push_pull_output(), //d4 @@ -142,7 +197,7 @@ fn main() -> ! { led_pin.set_low().unwrap(); external_led_pin.set_high().unwrap(); delay.delay_ms(500); - match spi.read_thermocouple(&mut thermometer_spi_csn, Unit::Celsius) { + match thermocouple.read_temp() { Ok(v) => { writeln!(uart, "Current: {} \r", v).unwrap(); write_lcd(&mut lcd, &mut delay, &format!("{:02.2} C", v))