#![no_std] #![no_main] extern crate panic_halt; use cortex_m_rt::entry; use cortex_m::peripheral::Peripherals; use stm32f4xx_hal::{ delay::Delay, prelude::*, spi::{self, Spi}, stm32, }; use embedded_graphics::{ image::Image, pixelcolor::{Gray4, Rgb565}, prelude::*, primitives::{Circle, PrimitiveStyleBuilder, Rectangle, Triangle}, }; use tinybmp::Bmp; use display_interface_spi::SPIInterfaceNoCS; use ssd1320::buffered_graphics::BufferedSsd1320z2; #[entry] fn main() -> ! { let p = stm32::Peripherals::take().unwrap(); let cp = Peripherals::take().unwrap(); let gpioa = p.GPIOA.split(); let gpiob = p.GPIOB.split(); let rcc = p.RCC.constrain(); let clocks = rcc.cfgr.freeze(); let mut led = gpioa.pa5.into_push_pull_output(); led.set_low().ok(); let sck = gpiob.pb3.into_alternate_af5(); let miso = spi::NoMiso; let mosi = gpiob.pb5.into_alternate_af5(); let dc = gpiob.pb4.into_push_pull_output(); let mut res = gpiob.pb10.into_push_pull_output(); let cs1 = gpiob.pb13.into_push_pull_output(); let cs2 = gpiob.pb14.into_push_pull_output(); let mut delay = Delay::new(cp.SYST, clocks); let mode = spi::Mode { polarity: spi::Polarity::IdleLow, phase: spi::Phase::CaptureOnFirstTransition, }; let spi = Spi::spi1(p.SPI1, (sck, miso, mosi), mode, 8_000_000.hz(), clocks); let iface = SPIInterfaceNoCS::new(spi, dc); let mut display = BufferedSsd1320z2::new(iface, cs1, cs2); display.init(&mut res, &mut delay); let bmp: Bmp = Bmp::from_slice(include_bytes!("rust.bmp")).unwrap(); let yoffset = 20; let style = PrimitiveStyleBuilder::new() .stroke_width(2) .stroke_color(Gray4::WHITE) .build(); // screen outline // default display size is 128x64 if you don't pass a _DisplaySize_ // enum to the _Builder_ struct Rectangle::new(Point::new(1, 1), Size::new(127, 63)) .into_styled(style) .draw(&mut display) .unwrap(); // triangle Triangle::new( Point::new(16, 16 + yoffset), Point::new(16 + 16, 16 + yoffset), Point::new(16 + 8, yoffset), ) .into_styled(style) .draw(&mut display) .unwrap(); // square Rectangle::new(Point::new(52, yoffset), Size::new_equal(16)) .into_styled(style) .draw(&mut display) .unwrap(); // circle Circle::new(Point::new(88, yoffset), 16) .into_styled(style) .draw(&mut display) .unwrap(); // rust image Image::new(&bmp, Point::new(140, 0)) .draw(&mut display.color_converted()) .unwrap(); display.flush().unwrap(); loop { delay.delay_ms(500_u16); led.toggle().ok(); } }