number :3

This commit is contained in:
benstrb 2026-04-20 21:33:47 +02:00
parent 7e5f508494
commit b27a706d74
3 changed files with 351 additions and 116 deletions

104
Cargo.lock generated
View file

@ -23,12 +23,6 @@ version = "0.13.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "46afbd2983a5d5a7bd740ccb198caf5b82f45c40c09c0eed36052d91cb92e719" checksum = "46afbd2983a5d5a7bd740ccb198caf5b82f45c40c09c0eed36052d91cb92e719"
[[package]]
name = "bitflags"
version = "1.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
[[package]] [[package]]
name = "cortex-m" name = "cortex-m"
version = "0.7.7" version = "0.7.7"
@ -68,48 +62,6 @@ version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b"
[[package]]
name = "defmt"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "548d977b6da32fa1d1fda2876453da1e7df63ad0304c8b3dae4dbe7b96f39b78"
dependencies = [
"bitflags",
"defmt-macros",
]
[[package]]
name = "defmt-macros"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3d4fc12a85bcf441cfe44344c4b72d58493178ce635338a3f3b78943aceb258e"
dependencies = [
"defmt-parser",
"proc-macro-error2",
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "defmt-parser"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "10d60334b3b2e7c9d91ef8150abfb6fa4c1c39ebbcf4a81c2e346aad939fee3e"
dependencies = [
"thiserror",
]
[[package]]
name = "defmt-rtt"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "93d5a25c99d89c40f5676bec8cefe0614f17f0f40e916f98e345dae941807f9e"
dependencies = [
"critical-section",
"defmt",
]
[[package]] [[package]]
name = "deranged" name = "deranged"
version = "0.5.8" version = "0.5.8"
@ -275,16 +227,6 @@ version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a513e167849a384b7f9b746e517604398518590a9142f4846a32e3c2a4de7b11" checksum = "a513e167849a384b7f9b746e517604398518590a9142f4846a32e3c2a4de7b11"
[[package]]
name = "panic-probe"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fd402d00b0fb94c5aee000029204a46884b1262e0c443f166d86d2c0747e1a1a"
dependencies = [
"cortex-m",
"defmt",
]
[[package]] [[package]]
name = "portable-atomic" name = "portable-atomic"
version = "1.13.1" version = "1.13.1"
@ -297,28 +239,6 @@ version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391"
[[package]]
name = "proc-macro-error-attr2"
version = "2.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5"
dependencies = [
"proc-macro2",
"quote",
]
[[package]]
name = "proc-macro-error2"
version = "2.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802"
dependencies = [
"proc-macro-error-attr2",
"proc-macro2",
"quote",
"syn",
]
[[package]] [[package]]
name = "proc-macro2" name = "proc-macro2"
version = "1.0.106" version = "1.0.106"
@ -398,14 +318,12 @@ version = "0.1.0"
dependencies = [ dependencies = [
"cortex-m", "cortex-m",
"cortex-m-rt", "cortex-m-rt",
"defmt",
"defmt-rtt",
"embedded-hal 1.0.0", "embedded-hal 1.0.0",
"otm8009a", "otm8009a",
"panic-halt", "panic-halt",
"panic-probe",
"stm32f4", "stm32f4",
"stm32f4xx-hal", "stm32f4xx-hal",
"time",
] ]
[[package]] [[package]]
@ -448,26 +366,6 @@ dependencies = [
"unicode-ident", "unicode-ident",
] ]
[[package]]
name = "thiserror"
version = "2.0.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4"
dependencies = [
"thiserror-impl",
]
[[package]]
name = "thiserror-impl"
version = "2.0.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]] [[package]]
name = "time" name = "time"
version = "0.3.47" version = "0.3.47"

View file

@ -7,21 +7,15 @@ edition = "2024"
cortex-m = {version = "0.7.7", features = ["critical-section-single-core"]} cortex-m = {version = "0.7.7", features = ["critical-section-single-core"]}
cortex-m-rt = "0.7.5" cortex-m-rt = "0.7.5"
embedded-hal = "1.0.0" embedded-hal = "1.0.0"
defmt-rtt = "1.1.0"
defmt = "1.0.1"
panic-probe = {version = "1.0.0", features = ["print-defmt"]}
panic-halt = "1.0.0" panic-halt = "1.0.0"
otm8009a = "0.1.0" otm8009a = "0.1.0"
stm32f4 = "0.16.0" stm32f4 = "0.16.0"
time = {version = "0.3.47", default-features = false}
[dependencies.stm32f4xx-hal] [dependencies.stm32f4xx-hal]
version = "0.23.0" version = "0.23.0"
features = ["stm32f469"] features = ["stm32f469"]
[features]
default = []
ccmram = []
[[bin]] [[bin]]
name = "stm32f469ni" name = "stm32f469ni"
test = false test = false

View file

@ -15,8 +15,8 @@ use otm8009a::{Otm8009A, Otm8009AConfig};
use panic_halt as _; use panic_halt as _;
use stm32f4xx_hal::{self as hal, gpio::Speed, ltdc, rcc::Config}; use stm32f4xx_hal::{self as hal, gpio::Speed, ltdc, rcc::Config};
const WIDTH: usize = 480; const WIDTH: usize = 800;
const HEIGHT: usize = 800; const HEIGHT: usize = 480;
const DISPLAY_CONFIGURATION: DisplayConfig = DisplayConfig { const DISPLAY_CONFIGURATION: DisplayConfig = DisplayConfig {
active_width: WIDTH as _, active_width: WIDTH as _,
@ -34,6 +34,11 @@ const DISPLAY_CONFIGURATION: DisplayConfig = DisplayConfig {
pixel_clock_pol: true, pixel_clock_pol: true,
}; };
const LINE_WIDTH: usize = 20;
const DIGIT_HEIGHT: usize = 350;
const DIGIT_WIDTH: usize = 150;
const DIGIT_MARGIN: usize = 20;
#[entry] #[entry]
fn main() -> ! { fn main() -> ! {
let peripherals = Peripherals::take().unwrap(); let peripherals = Peripherals::take().unwrap();
@ -165,6 +170,13 @@ fn main() -> ! {
while fmc.sdsr().read().busy().bit_is_set() {} while fmc.sdsr().read().busy().bit_is_set() {}
let rtc = peripherals.RTC;
let mut pwr = peripherals.PWR;
let mut enabled_rtc = hal::rtc::Rtc::new(rtc, &mut rcc, &mut pwr);
//let time_val = time::Time::from_hms_micro(0, 0, 0, 0).unwrap();
//enabled_rtc.set_time(&time_val).unwrap();
let mut lcd_reset = gpioh.ph7.into_push_pull_output(); let mut lcd_reset = gpioh.ph7.into_push_pull_output();
lcd_reset.set_low(); lcd_reset.set_low();
delay.delay_ms(20_u32); delay.delay_ms(20_u32);
@ -234,7 +246,7 @@ fn main() -> ! {
&mut dsi_host, &mut dsi_host,
Otm8009AConfig { Otm8009AConfig {
frame_rate: otm8009a::FrameRate::_60Hz, frame_rate: otm8009a::FrameRate::_60Hz,
mode: otm8009a::Mode::Portrait, mode: otm8009a::Mode::Landscape,
color_map: otm8009a::ColorMap::Rgb, color_map: otm8009a::ColorMap::Rgb,
cols: WIDTH as u16, cols: WIDTH as u16,
rows: HEIGHT as u16, rows: HEIGHT as u16,
@ -244,13 +256,34 @@ fn main() -> ! {
.unwrap(); .unwrap();
unsafe { unsafe {
(0..480 * 800).for_each(|i| BUFF[i] = 0xFF00FFFF); (0..480 * 800).for_each(|i| BUFF[i] = 0xFF000000);
} }
draw_0(&mut display, ltdc::Layer::L1, (DIGIT_WIDTH, 65), 0xFFFFFFFF);
draw_5(
&mut display,
ltdc::Layer::L1,
(DIGIT_WIDTH * 2 + DIGIT_MARGIN, 65),
0xFFFFFFFF,
);
draw_colon(
&mut display,
ltdc::Layer::L1,
(WIDTH / 2 + LINE_WIDTH / 2, 65),
0xFFFFFFFF,
);
draw_2(
&mut display,
ltdc::Layer::L1,
(WIDTH - DIGIT_WIDTH - DIGIT_MARGIN, 65),
0xFFFFFFFF,
);
draw_8(&mut display, ltdc::Layer::L1, (WIDTH, 65), 0xFFFFFFFF);
display.reload(); display.reload();
gpiog.pg6.into_push_pull_output().set_low(); gpiog.pg6.into_push_pull_output().set_low();
gpiod.pd4.into_push_pull_output().set_low(); let mut led = gpiod.pd4.into_push_pull_output();
gpiod.pd5.into_push_pull_output().set_low(); gpiod.pd5.into_push_pull_output().set_low();
peripherals peripherals
.GPIOK .GPIOK
@ -259,5 +292,315 @@ fn main() -> ! {
.into_push_pull_output() .into_push_pull_output()
.set_low(); .set_low();
loop {} loop {
if enabled_rtc.get_datetime().time().second() == 20 {
led.set_low();
} else {
led.set_high();
}
}
}
// (x, y)
// 0,0 is top left
// a
// ___
// f |_g| b
// e |__| c
// d
fn draw_rectangle(
display: &mut DisplayController<u32>,
layer: ltdc::Layer,
top_left: (usize, usize),
bottom_right: (usize, usize),
color: u32,
) {
for x in bottom_right.0.min(top_left.0)..bottom_right.0.max(top_left.0) {
for y in bottom_right.1.min(top_left.1)..bottom_right.1.max(top_left.1) {
display.draw_pixel(layer, x, y, color);
}
}
}
fn draw_horizontal_line(
display: &mut DisplayController<u32>,
layer: ltdc::Layer,
top_left: (usize, usize),
color: u32,
) {
draw_rectangle(
display,
layer,
(top_left.0, top_left.1),
(top_left.0 - DIGIT_WIDTH, top_left.1 + LINE_WIDTH),
color,
);
}
fn draw_vertical_line(
display: &mut DisplayController<u32>,
layer: ltdc::Layer,
top_left: (usize, usize),
color: u32,
) {
draw_rectangle(
display,
layer,
(top_left.0, top_left.1),
(top_left.0 - LINE_WIDTH, top_left.1 + DIGIT_HEIGHT / 2),
color,
);
}
fn draw_a(
display: &mut DisplayController<u32>,
layer: ltdc::Layer,
top_left: (usize, usize),
color: u32,
) {
draw_horizontal_line(display, layer, top_left, color);
}
fn draw_b(
display: &mut DisplayController<u32>,
layer: ltdc::Layer,
top_left: (usize, usize),
color: u32,
) {
draw_vertical_line(
display,
layer,
(top_left.0 - DIGIT_WIDTH + LINE_WIDTH, top_left.1),
color,
);
}
fn draw_c(
display: &mut DisplayController<u32>,
layer: ltdc::Layer,
top_left: (usize, usize),
color: u32,
) {
draw_vertical_line(
display,
layer,
(
top_left.0 - DIGIT_WIDTH + LINE_WIDTH,
top_left.1 + DIGIT_HEIGHT / 2 - LINE_WIDTH,
),
color,
);
}
fn draw_d(
display: &mut DisplayController<u32>,
layer: ltdc::Layer,
top_left: (usize, usize),
color: u32,
) {
draw_horizontal_line(
display,
layer,
(top_left.0, top_left.1 + DIGIT_HEIGHT - LINE_WIDTH),
color,
);
}
fn draw_e(
display: &mut DisplayController<u32>,
layer: ltdc::Layer,
top_left: (usize, usize),
color: u32,
) {
draw_vertical_line(
display,
layer,
(top_left.0, top_left.1 + DIGIT_HEIGHT / 2 - LINE_WIDTH),
color,
);
}
fn draw_f(
display: &mut DisplayController<u32>,
layer: ltdc::Layer,
top_left: (usize, usize),
color: u32,
) {
draw_vertical_line(display, layer, (top_left.0, top_left.1), color);
}
fn draw_g(
display: &mut DisplayController<u32>,
layer: ltdc::Layer,
top_left: (usize, usize),
color: u32,
) {
draw_horizontal_line(
display,
layer,
(top_left.0, top_left.1 + DIGIT_HEIGHT / 2 - LINE_WIDTH),
color,
);
}
fn draw_colon(
display: &mut DisplayController<u32>,
layer: ltdc::Layer,
top_left: (usize, usize),
color: u32,
) {
draw_rectangle(
display,
layer,
(top_left.0, top_left.1 + DIGIT_MARGIN * 2),
(
top_left.0 - LINE_WIDTH,
top_left.1 + LINE_WIDTH + DIGIT_MARGIN * 2,
),
color,
);
draw_rectangle(
display,
layer,
(
top_left.0,
top_left.1 + DIGIT_HEIGHT - LINE_WIDTH - DIGIT_MARGIN * 2,
),
(
top_left.0 - LINE_WIDTH,
top_left.1 + DIGIT_HEIGHT - DIGIT_MARGIN * 2,
),
color,
);
}
fn draw_0(
display: &mut DisplayController<u32>,
layer: ltdc::Layer,
top_left: (usize, usize),
color: u32,
) {
draw_a(display, layer, top_left, color);
draw_b(display, layer, top_left, color);
draw_c(display, layer, top_left, color);
draw_d(display, layer, top_left, color);
draw_e(display, layer, top_left, color);
draw_f(display, layer, top_left, color);
}
fn draw_1(
display: &mut DisplayController<u32>,
layer: ltdc::Layer,
top_left: (usize, usize),
color: u32,
) {
draw_b(display, layer, top_left, color);
draw_c(display, layer, top_left, color);
}
fn draw_2(
display: &mut DisplayController<u32>,
layer: ltdc::Layer,
top_left: (usize, usize),
color: u32,
) {
draw_a(display, layer, top_left, color);
draw_b(display, layer, top_left, color);
draw_d(display, layer, top_left, color);
draw_e(display, layer, top_left, color);
draw_g(display, layer, top_left, color);
}
fn draw_3(
display: &mut DisplayController<u32>,
layer: ltdc::Layer,
top_left: (usize, usize),
color: u32,
) {
draw_a(display, layer, top_left, color);
draw_b(display, layer, top_left, color);
draw_c(display, layer, top_left, color);
draw_d(display, layer, top_left, color);
draw_g(display, layer, top_left, color);
}
fn draw_4(
display: &mut DisplayController<u32>,
layer: ltdc::Layer,
top_left: (usize, usize),
color: u32,
) {
draw_b(display, layer, top_left, color);
draw_c(display, layer, top_left, color);
draw_f(display, layer, top_left, color);
draw_g(display, layer, top_left, color);
}
fn draw_5(
display: &mut DisplayController<u32>,
layer: ltdc::Layer,
top_left: (usize, usize),
color: u32,
) {
draw_a(display, layer, top_left, color);
draw_c(display, layer, top_left, color);
draw_d(display, layer, top_left, color);
draw_f(display, layer, top_left, color);
draw_g(display, layer, top_left, color);
}
fn draw_6(
display: &mut DisplayController<u32>,
layer: ltdc::Layer,
top_left: (usize, usize),
color: u32,
) {
draw_a(display, layer, top_left, color);
draw_c(display, layer, top_left, color);
draw_d(display, layer, top_left, color);
draw_e(display, layer, top_left, color);
draw_f(display, layer, top_left, color);
draw_g(display, layer, top_left, color);
}
fn draw_7(
display: &mut DisplayController<u32>,
layer: ltdc::Layer,
top_left: (usize, usize),
color: u32,
) {
draw_a(display, layer, top_left, color);
draw_b(display, layer, top_left, color);
draw_c(display, layer, top_left, color);
}
fn draw_8(
display: &mut DisplayController<u32>,
layer: ltdc::Layer,
top_left: (usize, usize),
color: u32,
) {
draw_a(display, layer, top_left, color);
draw_b(display, layer, top_left, color);
draw_c(display, layer, top_left, color);
draw_d(display, layer, top_left, color);
draw_e(display, layer, top_left, color);
draw_f(display, layer, top_left, color);
draw_g(display, layer, top_left, color);
}
fn draw_9(
display: &mut DisplayController<u32>,
layer: ltdc::Layer,
top_left: (usize, usize),
color: u32,
) {
draw_a(display, layer, top_left, color);
draw_b(display, layer, top_left, color);
draw_c(display, layer, top_left, color);
draw_d(display, layer, top_left, color);
draw_f(display, layer, top_left, color);
draw_g(display, layer, top_left, color);
} }