number :3
This commit is contained in:
parent
7e5f508494
commit
b27a706d74
3 changed files with 351 additions and 116 deletions
104
Cargo.lock
generated
104
Cargo.lock
generated
|
|
@ -23,12 +23,6 @@ version = "0.13.2"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "46afbd2983a5d5a7bd740ccb198caf5b82f45c40c09c0eed36052d91cb92e719"
|
||||
|
||||
[[package]]
|
||||
name = "bitflags"
|
||||
version = "1.3.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
|
||||
|
||||
[[package]]
|
||||
name = "cortex-m"
|
||||
version = "0.7.7"
|
||||
|
|
@ -68,48 +62,6 @@ version = "1.2.0"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
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]]
|
||||
name = "deranged"
|
||||
version = "0.5.8"
|
||||
|
|
@ -275,16 +227,6 @@ version = "1.0.0"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
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]]
|
||||
name = "portable-atomic"
|
||||
version = "1.13.1"
|
||||
|
|
@ -297,28 +239,6 @@ version = "0.2.0"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
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]]
|
||||
name = "proc-macro2"
|
||||
version = "1.0.106"
|
||||
|
|
@ -398,14 +318,12 @@ version = "0.1.0"
|
|||
dependencies = [
|
||||
"cortex-m",
|
||||
"cortex-m-rt",
|
||||
"defmt",
|
||||
"defmt-rtt",
|
||||
"embedded-hal 1.0.0",
|
||||
"otm8009a",
|
||||
"panic-halt",
|
||||
"panic-probe",
|
||||
"stm32f4",
|
||||
"stm32f4xx-hal",
|
||||
"time",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
@ -448,26 +366,6 @@ dependencies = [
|
|||
"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]]
|
||||
name = "time"
|
||||
version = "0.3.47"
|
||||
|
|
|
|||
|
|
@ -7,21 +7,15 @@ edition = "2024"
|
|||
cortex-m = {version = "0.7.7", features = ["critical-section-single-core"]}
|
||||
cortex-m-rt = "0.7.5"
|
||||
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"
|
||||
otm8009a = "0.1.0"
|
||||
stm32f4 = "0.16.0"
|
||||
time = {version = "0.3.47", default-features = false}
|
||||
|
||||
[dependencies.stm32f4xx-hal]
|
||||
version = "0.23.0"
|
||||
features = ["stm32f469"]
|
||||
|
||||
[features]
|
||||
default = []
|
||||
ccmram = []
|
||||
|
||||
[[bin]]
|
||||
name = "stm32f469ni"
|
||||
test = false
|
||||
|
|
|
|||
355
src/main.rs
355
src/main.rs
|
|
@ -15,8 +15,8 @@ use otm8009a::{Otm8009A, Otm8009AConfig};
|
|||
use panic_halt as _;
|
||||
use stm32f4xx_hal::{self as hal, gpio::Speed, ltdc, rcc::Config};
|
||||
|
||||
const WIDTH: usize = 480;
|
||||
const HEIGHT: usize = 800;
|
||||
const WIDTH: usize = 800;
|
||||
const HEIGHT: usize = 480;
|
||||
|
||||
const DISPLAY_CONFIGURATION: DisplayConfig = DisplayConfig {
|
||||
active_width: WIDTH as _,
|
||||
|
|
@ -34,6 +34,11 @@ const DISPLAY_CONFIGURATION: DisplayConfig = DisplayConfig {
|
|||
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]
|
||||
fn main() -> ! {
|
||||
let peripherals = Peripherals::take().unwrap();
|
||||
|
|
@ -165,6 +170,13 @@ fn main() -> ! {
|
|||
|
||||
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();
|
||||
lcd_reset.set_low();
|
||||
delay.delay_ms(20_u32);
|
||||
|
|
@ -234,7 +246,7 @@ fn main() -> ! {
|
|||
&mut dsi_host,
|
||||
Otm8009AConfig {
|
||||
frame_rate: otm8009a::FrameRate::_60Hz,
|
||||
mode: otm8009a::Mode::Portrait,
|
||||
mode: otm8009a::Mode::Landscape,
|
||||
color_map: otm8009a::ColorMap::Rgb,
|
||||
cols: WIDTH as u16,
|
||||
rows: HEIGHT as u16,
|
||||
|
|
@ -244,13 +256,34 @@ fn main() -> ! {
|
|||
.unwrap();
|
||||
|
||||
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();
|
||||
|
||||
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();
|
||||
peripherals
|
||||
.GPIOK
|
||||
|
|
@ -259,5 +292,315 @@ fn main() -> ! {
|
|||
.into_push_pull_output()
|
||||
.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);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue