#![no_std]
#![no_main]
use embassy_stm32::time::Hertz;
use embassy_stm32::{bind_interrupts, Config};
use embassy_time::Delay;
use embassy_executor::Spawner;
use embedded_graphics::{
mono_font::{ascii::FONT_6X10, MonoTextStyleBuilder},
pixelcolor::BinaryColor,
prelude::*,
text::{Baseline, Text},
};
use embedded_hal::delay::DelayNs;
use oled_async::{prelude::*, Builder};
use {defmt_rtt as _, panic_probe as _};
bind_interrupts!(struct Irqs {
I2C2_EV => embassy_stm32::i2c::EventInterruptHandler<embassy_stm32::peripherals::I2C2>;
I2C2_ER => embassy_stm32::i2c::ErrorInterruptHandler<embassy_stm32::peripherals::I2C2>;
});
#[embassy_executor::main]
async fn main(_spawner: Spawner) {
let mut config = Config::default();
{
use embassy_stm32::rcc::*;
config.rcc.sys = Sysclk::HSI;
}
let p = embassy_stm32::init(config);
let mut i2c_cfg = embassy_stm32::i2c::Config::default();
i2c_cfg.sda_pullup = false;
i2c_cfg.sda_pullup = false;
type I2c = embassy_stm32::i2c::I2c<
'static,
embassy_stm32::peripherals::I2C2,
embassy_stm32::mode::Async,
>;
type I2cInterface = display_interface_i2c::I2CInterface<I2c>;
let i2c: I2c = embassy_stm32::i2c::I2c::new(
p.I2C2,
p.PA9, p.PA8, Irqs,
p.DMA1_CH1,
p.DMA1_CH2,
Hertz(100_000),
i2c_cfg,
);
let di: I2cInterface = display_interface_i2c::I2CInterface::new(
i2c, 0x3C, 0x40, );
let mut delay = Delay {};
let raw_disp = Builder::new(oled_async::displays::sh1107::Sh1107_128_128 {})
.with_rotation(crate::DisplayRotation::Rotate180)
.connect(di);
let mut disp: GraphicsMode<_, _> = raw_disp.into();
disp.init().await.unwrap();
disp.clear();
disp.flush().await.unwrap();
let text_style = MonoTextStyleBuilder::new()
.font(&FONT_6X10)
.text_color(BinaryColor::On)
.build();
Text::with_baseline("Hello world!", Point::zero(), text_style, Baseline::Top)
.draw(&mut disp)
.unwrap();
disp.flush().await.unwrap();
loop {
delay.delay_ms(1000);
}
}