Compare commits

...

4 commits

11 changed files with 110 additions and 56 deletions

5
firmware/Cargo.lock generated
View file

@ -130,8 +130,7 @@ dependencies = [
"cfg-if",
"cortex-m",
"cortex-m-rt",
"defmt 1.0.1",
"defmt-rtt",
"embassy-boot",
"embassy-boot-stm32",
"embassy-executor",
"embassy-stm32",
@ -320,7 +319,6 @@ name = "embassy-boot"
version = "0.4.0"
source = "git+https://github.com/embassy-rs/embassy#56572ef0adffd6258adc10fb424e37a8b4ddc19c"
dependencies = [
"defmt 1.0.1",
"digest",
"embassy-embedded-hal",
"embassy-sync",
@ -337,7 +335,6 @@ dependencies = [
"cfg-if",
"cortex-m",
"cortex-m-rt",
"defmt 1.0.1",
"embassy-boot",
"embassy-stm32",
"embassy-sync",

View file

@ -3,6 +3,7 @@ resolver = "3"
members = ["app", "boot"]
[patch.crates-io]
embassy-boot = { git = "https://github.com/embassy-rs/embassy" }
embassy-boot-stm32 = { git = "https://github.com/embassy-rs/embassy" }
embassy-executor = { git = "https://github.com/embassy-rs/embassy" }
embassy-futures = { git = "https://github.com/embassy-rs/embassy" }

View file

@ -1,13 +1,3 @@
[target.'cfg(all(target_arch = "arm", target_os = "none"))']
runner = [
"probe-rs",
"run",
"--chip",
"STM32G070KB",
"--log-format",
"{t} {m} {s}",
]
[build]
target = "thumbv6m-none-eabi"
rustdocflags = ["--document-private-items"]

View file

@ -1,13 +1,19 @@
use embassy_executor::Spawner;
use embassy_stm32::usart;
use micropb::heapless::Vec;
use static_cell::StaticCell;
type UartRxBuf = Vec<u8, 32>;
type UartTxBuf = Vec<u8, 32>;
struct UartBuf {
buffer: [u8; 32],
}
static UART_RX_BUF: StaticCell<UartRxBuf> = StaticCell::new();
static UART_TX_BUF: StaticCell<UartTxBuf> = StaticCell::new();
impl Default for UartBuf {
fn default() -> UartBuf {
unsafe { core::mem::zeroed() }
}
}
static UART_TX_BUF: StaticCell<UartBuf> = StaticCell::new();
static UART_RX_BUF: StaticCell<UartBuf> = StaticCell::new();
#[allow(dead_code)]
struct Tx {
@ -20,8 +26,8 @@ struct Rx {
}
pub fn start(r: crate::HeatPumpInterfaceResources, spawner: Spawner) {
let rx_buf = UART_RX_BUF.init(UartRxBuf::new());
let tx_buf = UART_TX_BUF.init(UartTxBuf::new());
let tx_buf = UART_TX_BUF.init(UartBuf::default());
let rx_buf = UART_RX_BUF.init(UartBuf::default());
let mut config = usart::Config::default();
config.baudrate = 2400;
@ -32,8 +38,8 @@ pub fn start(r: crate::HeatPumpInterfaceResources, spawner: Spawner) {
r.usart,
r.rx_pin,
r.tx_pin,
tx_buf,
rx_buf,
&mut tx_buf.buffer,
&mut rx_buf.buffer,
crate::Irqs,
config,
)

View file

@ -1,13 +1,19 @@
use embassy_executor::Spawner;
use embassy_stm32::usart;
use micropb::heapless::Vec;
use static_cell::StaticCell;
type UartRxBuf = Vec<u8, 32>;
type UartTxBuf = Vec<u8, 32>;
struct UartBuf {
buffer: [u8; 32],
}
static UART_RX_BUF: StaticCell<UartRxBuf> = StaticCell::new();
static UART_TX_BUF: StaticCell<UartTxBuf> = StaticCell::new();
impl Default for UartBuf {
fn default() -> UartBuf {
unsafe { core::mem::zeroed() }
}
}
static UART_TX_BUF: StaticCell<UartBuf> = StaticCell::new();
static UART_RX_BUF: StaticCell<UartBuf> = StaticCell::new();
#[allow(dead_code)]
struct Tx {
@ -20,8 +26,8 @@ struct Rx {
}
pub fn start(r: crate::ThermostatInterfaceResources, spawner: Spawner) {
let rx_buf = UART_RX_BUF.init(UartRxBuf::new());
let tx_buf = UART_TX_BUF.init(UartTxBuf::new());
let tx_buf = UART_TX_BUF.init(UartBuf::default());
let rx_buf = UART_RX_BUF.init(UartBuf::default());
let mut config = usart::Config::default();
config.baudrate = 2400;
@ -32,8 +38,8 @@ pub fn start(r: crate::ThermostatInterfaceResources, spawner: Spawner) {
r.usart,
r.rx_pin,
r.tx_pin,
tx_buf,
rx_buf,
&mut tx_buf.buffer,
&mut rx_buf.buffer,
crate::Irqs,
config,
)

View file

@ -1,16 +1,3 @@
[target.'cfg(all(target_arch = "arm", target_os = "none"))']
runner = [
"probe-rs",
"run",
"--chip",
"STM32G070KB",
"--log-format",
"{t} {m} {s}",
]
[build]
target = "thumbv6m-none-eabi"
rustdocflags = ["--document-private-items"]
[env]
DEFMT_LOG = "trace"

View file

@ -4,9 +4,10 @@ version = "0.1.0"
edition = "2024"
[dependencies]
embassy-boot-stm32 = { version = "0.3.0", features = ["defmt"] }
embassy-executor = { version = "0.7.0", features = ["arch-cortex-m", "executor-thread", "defmt"] }
embassy-stm32 = { version = "0.2.0", features = ["time-driver-tim1", "stm32g070kb", "defmt"] }
embassy-boot = { version = "0.4.0" }
embassy-boot-stm32 = { version = "0.3.0" }
embassy-executor = { version = "0.7.0", features = ["arch-cortex-m", "executor-thread"] }
embassy-stm32 = { version = "0.2.0", features = ["time-driver-tim1", "stm32g070kb"] }
embassy-sync = "0.7.0"
cortex-m = { version = "0.7.6", features = ["inline-asm", "critical-section-single-core"] }
@ -17,9 +18,6 @@ embedded-storage-async = "0.4.1"
cfg-if = "1.0.1"
defmt = { version = "1.0.0" }
defmt-rtt = { version = "1.0.0" }
[lints.clippy]
pedantic = { level = "warn", priority = -1 }
cargo = { level = "warn", priority = -1 }

View file

@ -27,5 +27,4 @@ fn main() {
println!("cargo:rustc-link-arg-bins=--nmagic");
println!("cargo:rustc-link-arg-bins=-Tlink.x");
println!("cargo:rustc-link-arg-bins=-Tdefmt.x");
}

View file

@ -4,7 +4,6 @@
use core::cell::RefCell;
use cortex_m_rt::{entry, exception};
use defmt_rtt as _;
use embassy_boot_stm32::*;
use embassy_stm32::Config;
use embassy_stm32::flash::{BANK1_REGION, Flash};
@ -16,9 +15,9 @@ fn main() -> ! {
// Uncomment this if you are debugging the bootloader with debugger/RTT attached,
// as it prevents a hard fault when accessing flash 'too early' after boot.
for _i in 0..10_000_000 {
cortex_m::asm::nop();
}
// for _i in 0..50_000_000 {
// cortex_m::asm::nop();
// }
let layout = Flash::new_blocking(p.FLASH).into_blocking_regions();
let flash = Mutex::new(RefCell::new(layout.bank1_region));

1
firmware/run Symbolic link
View file

@ -0,0 +1 @@
run.sh

70
firmware/run.sh Executable file
View file

@ -0,0 +1,70 @@
#!/usr/bin/env bash
CHIP=STM32G070KB
function clean {
cargo clean $@
}
function build-boot {
(cd boot; cargo build --release $@)
}
function build-app {
(cd app; cargo build --release $@)
}
function build {
build-boot
build-app
}
function size-boot {
(cd boot; cargo size --release -- -A $@)
}
function size-app {
(cd app; cargo size --release -- -A $@)
}
function size {
size-boot
size-app
}
function erase {
probe-rs erase --chip ${CHIP}
}
function flash-boot {
(cd boot; cargo flash --release --chip ${CHIP} --reset-halt --log INFO $@)
}
function flash-app {
(cd app; cargo flash --release --chip ${CHIP} --reset-halt --log INFO $@)
}
function flash {
flash-boot
flash-app
}
function run {
probe-rs attach --chip ${CHIP} --log-format "{t} {m} {s}" target/thumbv6m-none-eabi/release/app
}
set -o nounset
set -o pipefail
set -o errexit
#set -o xtrace
PROJECT_ROOT=${0%/*}
if [[ $0 != $PROJECT_ROOT && $PROJECT_ROOT != "" ]]; then
cd "$PROJECT_ROOT"
fi
readonly PROJECT_ROOT=$(pwd)
readonly SCRIPT="$PROJECT_ROOT/$(basename "$0")"
TIMEFORMAT=$'\nTask completed in %3lR'
time "${@}"