diff --git a/HARDWARE.md b/HARDWARE.md deleted file mode 100644 index 91be202..0000000 --- a/HARDWARE.md +++ /dev/null @@ -1,31 +0,0 @@ -# Hardware Baseline (Bluepill + ST-Link) - -## Board and Probe - -- MCU board: STM32F103C8T6 Bluepill -- Debug probe: ST-Link (SWD) - -## SWD Wiring - -1. ST-Link `SWDIO` -> Bluepill `PA13` -2. ST-Link `SWCLK` -> Bluepill `PA14` -3. ST-Link `GND` -> Bluepill `GND` -4. ST-Link `3V3` -> Bluepill `3V3` (falls notwendig) -5. Optional: ST-Link `NRST` -> Bluepill `NRST` - -## Workshop I/O Wiring - -1. LED: - - Onboard LED an `PC13` (active-low) -2. Button: - - Externer Taster von `PA0` nach `GND` - - Interner Pull-up wird im Code aktiviert -3. Analog: - - Poti/Sensor-Ausgang an `PA1` - - Sensorversorgung über `3V3` + `GND` - -## Sanity Checks - -1. `probe-rs list` zeigt ST-Link an. -2. `probe-rs chip list | grep STM32F103C8` findet Target. -3. Beim Flashen keine "No probe found"-Meldung. diff --git a/README.md b/README.md index 96ec7b5..6a44d7c 100644 --- a/README.md +++ b/README.md @@ -6,28 +6,84 @@ Ideal für RoboCup-Interessierte aus der außerschulischen bzw. beruflichen Bild ## Workshop Layout -Dieses Repository ist als "Rust by Example"-ähnlicher Lernpfad aufgebaut: +Jede Übung hat ihren eigenen Ordner. Der Lernpfad ist nummeriert. +Jede Übung hat Aufgabe mit TODOs zum Lösen. -- `tutorial/00-setup-live` bis `tutorial/08-final-combined` -- Jeder Schritt hat: - - `task/` (Aufgabe mit TODOs) - - `solution/` (Referenzlösung) -- Teilnehmer arbeiten nur in `task/`. +## Ablauf -## Quick Start +0. Install Rust +1. Rust Basics - Hello World +2. Rust Basics - Typen +3. Rust Basics - Ownership/Borrow +4. kleines Desktop Programm +5. Embedded - no std +6. Embedded - LED Blinky +7. Embedded - Button Input +8. Embedded - Analog Readout +9. Embedded - EmbassyRS -1. Host vorbereiten: - - `bash scripts/setup-live.sh` -2. Host prüfen: - - `bash scripts/verify-host.sh` -3. Probe prüfen: - - `bash scripts/verify-probe.sh` -4. Schritt ausführen: - - `bash scripts/run-step.sh 01 task` +# Hardware -## Core Files +- MCU board: STM32F103C8T6 Bluepill +- Debug probe: ST-Link (SWD) -- [WORKSHOP.md](/home/wieerwill/Dokumente/GitHub/didkata-rust-on-robots/WORKSHOP.md) -- [HARDWARE.md](/home/wieerwill/Dokumente/GitHub/didkata-rust-on-robots/HARDWARE.md) -- [TROUBLESHOOTING.md](/home/wieerwill/Dokumente/GitHub/didkata-rust-on-robots/TROUBLESHOOTING.md) -- [references/source-map.md](/home/wieerwill/Dokumente/GitHub/didkata-rust-on-robots/references/source-map.md) +## SWD Wiring + +1. ST-Link `SWDIO` -> Bluepill `PA13` +2. ST-Link `SWCLK` -> Bluepill `PA14` +3. ST-Link `GND` -> Bluepill `GND` +4. ST-Link `3V3` -> Bluepill `3V3` +5. Optional: ST-Link `NRST` -> Bluepill `NRST` + +## Workshop I/O Wiring + +1. LED: + - Onboard LED an `PC13` (active-low) +2. Button: + - Externer Taster von `PA0` nach `GND` + - Interner Pull-up wird im Code aktiviert +3. Analog (optional): + - Poti/Sensor-Ausgang an `PA1` + - Sensorversorgung über `3V3` + `GND` + +# Troubleshooting + +## Host Setup + +1. `rustup: command not found` + - Rust via rustup installieren. +2. `probe-rs: command not found` + - `cargo install probe-rs-tools` +3. Target fehlt + - `rustup target add thumbv7m-none-eabi` + +## Probe / Flashing + +1. `No probe found` + - USB-Kabel/Port prüfen + - ST-Link Treiber/udev prüfen + - `probe-rs list` erneut ausführen +2. `chip not found` + - Runner-String prüfen: `STM32F103C8` +3. `Permission denied` (Linux) + - udev-Regeln für ST-Link setzen und neu laden + +## Runtime Behavior + +1. LED blinkt nicht + - PC13 active-low beachten + - Versorgung prüfen +2. Button reagiert nicht + - Taster nach GND verdrahten + - `PA0` korrekt belegt? +3. Analogwerte ändern sich nicht + - Sensor/Poti wirklich an `PA1` + - Gemeinsame Masse sicherstellen + +## Fallback in Session + +Wenn eine Station nicht stabil läuft: + +1. Mit funktionierender Nachbarn pairen. +2. `solution/` ausführen. +3. Später wieder auf `task/` zurückwechseln. diff --git a/TROUBLESHOOTING.md b/TROUBLESHOOTING.md deleted file mode 100644 index 3cfd60d..0000000 --- a/TROUBLESHOOTING.md +++ /dev/null @@ -1,41 +0,0 @@ -# Troubleshooting - -## Host Setup - -1. `rustup: command not found` - - Rust via rustup installieren. -2. `probe-rs: command not found` - - `cargo install probe-rs-tools` -3. Target fehlt - - `rustup target add thumbv7m-none-eabi` - -## Probe / Flashing - -1. `No probe found` - - USB-Kabel/Port prüfen - - ST-Link Treiber/udev prüfen - - `probe-rs list` erneut ausführen -2. `chip not found` - - Runner-String prüfen: `STM32F103C8` -3. `Permission denied` (Linux) - - udev-Regeln für ST-Link setzen und neu laden - -## Runtime Behavior - -1. LED blinkt nicht - - PC13 active-low beachten - - Versorgung prüfen -2. Button reagiert nicht - - Taster nach GND verdrahten - - `PA0` korrekt belegt? -3. Analogwerte ändern sich nicht - - Sensor/Poti wirklich an `PA1` - - Gemeinsame Masse sicherstellen - -## Fallback in Session - -Wenn eine Station nicht stabil läuft: - -1. Mit funktionierender Nachbarn pairen. -2. `solution/` ausführen. -3. Später wieder auf `task/` zurückwechseln. diff --git a/WORKSHOP.md b/WORKSHOP.md deleted file mode 100644 index 5fcd71a..0000000 --- a/WORKSHOP.md +++ /dev/null @@ -1,71 +0,0 @@ -# Workshop Plan (60 Minutes) - -## Goal - -Von Rust-Basics zu echter Hardware auf STM32F103C8 Bluepill: - -- LED blinken -- Button einlesen -- Analogwert einlesen -- Ausgabe live über `probe-rs` / RTT sehen - -## Timing - -1. 00:00-00:10: Setup + Probe Smoke Test (`00`) -2. 00:10-00:28: Rust Basics (`01`-`03`) -3. 00:28-00:36: Erstes `no_std` Firmware-Projekt (`04`) -4. 00:36-00:44: LED Blinky (`05`) -5. 00:44-00:50: Button Input (`06`) -6. 00:50-00:56: Analog Readout (`07`) -7. 00:56-01:00: Integration (`08`) - -## Rules During Workshop - -1. Bearbeite nur `task/`. -2. Nutze `solution/` nur als Hilfe bei Blockern. -3. Falls >3 Minuten blockiert: Diff vergleichen, minimalen Fix übernehmen, weiter. -4. Bei Embedded-Schritten: Board vor jedem `cargo run` korrekt verkabeln. - -## Repo Management During Workshop - -1. `main` enthält Aufgaben und Referenzlösungen. -2. Instructor kann Wiederherstellungspunkte als Tags setzen: - - `step-00-start` ... `step-08-solution` -3. Teilnehmer arbeiten auf lokalem Branch: - - `participant/` -4. Wenn eine Aufgabe nicht weitergeht: - - minimalen Diff aus `solution/` übernehmen und fortfahren. - -## Step Contract - -Jeder Schritt enthält: - -- `README.md` mit Ziel, Ablauf, Done-Check -- `task/` (Aufgabe) -- `solution/` (Referenz) - -## Script Contract - -- `scripts/setup-live.sh` -- `scripts/verify-host.sh` -- `scripts/verify-probe.sh` -- `scripts/run-step.sh ` -- `scripts/check-step.sh ` - -## Target Contract (Embedded Steps 04-08) - -- Target: `thumbv7m-none-eabi` -- Runner: `probe-rs run --chip STM32F103C8` -- Logging: `defmt-rtt` + `panic-probe` - -## Acceptance Scenarios - -1. Steps `01`-`03`: `cargo run` funktioniert für `task/` und `solution/`. -2. Steps `04`-`08`: `cargo build --release` funktioniert für `task/` und `solution/`. -3. Probe-Verbindung: - - `probe-rs list` erkennt ST-Link. -4. Behavior: - - `05`: LED blinkt - - `06`: Press/Release Logs - - `07`: ADC-Wert reagiert auf Eingang - - `08`: integriertes Verhalten läuft stabil diff --git a/shell.nix b/shell.nix new file mode 100644 index 0000000..41a71d7 --- /dev/null +++ b/shell.nix @@ -0,0 +1,48 @@ +{ pkgs ? import {} }: + let + overrides = (builtins.fromTOML (builtins.readFile ./rust-embassy-stm32/rust-toolchain.toml)); + libPath = with pkgs; lib.makeLibraryPath [ + # load external libraries that you need in your rust project here + ]; +in + pkgs.mkShell rec { + nativeBuildInputs = [ pkgs.pkg-config ]; + buildInputs = with pkgs; [ + clang + # Replace llvmPackages with llvmPackages_X, where X is the latest LLVM version (at the time of writing, 16) + llvmPackages.bintools + rustup + ]; + + RUSTC_VERSION = overrides.toolchain.channel; + + # https://github.com/rust-lang/rust-bindgen#environment-variables + LIBCLANG_PATH = pkgs.lib.makeLibraryPath [ pkgs.llvmPackages_latest.libclang.lib ]; + + shellHook = '' + export PATH=$PATH:''${CARGO_HOME:-~/.cargo}/bin + export PATH=$PATH:''${RUSTUP_HOME:-~/.rustup}/toolchains/$RUSTC_VERSION-x86_64-unknown-linux-gnu/bin/ + ''; + + # Add precompiled library to rustc search path + RUSTFLAGS = (builtins.map (a: ''-L ${a}/lib'') [ + # add libraries here (e.g. pkgs.libvmi) + ]); + + LD_LIBRARY_PATH = libPath; + + # Add glibc, clang, glib, and other headers to bindgen search path + BINDGEN_EXTRA_CLANG_ARGS = + # Includes normal include path + (builtins.map (a: ''-I"${a}/include"'') [ + # add dev libraries here (e.g. pkgs.libvmi.dev) + pkgs.glibc.dev + ]) + # Includes with special directory paths + ++ [ + ''-I"${pkgs.llvmPackages_latest.libclang.lib}/lib/clang/${pkgs.llvmPackages_latest.libclang.version}/include"'' + ''-I"${pkgs.glib.dev}/include/glib-2.0"'' + ''-I${pkgs.glib.out}/lib/glib-2.0/include/'' + ]; + } + diff --git a/source-map.md b/source-map.md deleted file mode 100644 index 41dd44b..0000000 --- a/source-map.md +++ /dev/null @@ -1,39 +0,0 @@ -# Source Map - -Dieses Mapping dokumentiert, welche gesammelten Quellen in welche Workshop-Bausteine eingeflossen sind. - -## Rust Basics (`01`-`03`) - -1. `sources/rust-by-example/*` - - Schrittweiser Lernstil mit kleinen, lauffähigen Beispielen -2. `sources/Introduction - A Gentle Introduction to Rust.md` - - sanfter Einstieg in Ownership/Borrowing -3. `sources/Learn Rust - Rust Programming Language.md` - - Orientierung an offiziellen Lernpfaden - -## Embedded Foundations (`04`) - -1. `sources/Intro to Rust on Embedded Your First no_std Project with Code Examples – Hubble Network Community.md` - - `no_std`, PAC/HAL/BSP, Einstiegspfad -2. `sources/rust-embedded-book/src/intro/no-std.md` - - saubere no_std-Grundlagen -3. `sources/rust-embedded-book/src/peripherals/singletons.md` - - Ownership auf Hardware-Peripherie übertragen - -## Tooling and Workflow (`00`, scripts) - -1. `sources/Embedded Rust Toolchains – Albert Skog.md` - - Probe-rs/probe-run Workflow-Einordnung -2. `sources/Embassy Book.md` - - praktischer Cargo + probe-rs Runner-Ansatz - -## STM32 Practical Steps (`05`-`08`) - -1. `sources/rust-embassy-stm32/src/bin/{blinky.rs,button.rs,adc.rs}` - - konkrete Zielübungen (LED/Button/ADC + Logs) -2. `sources/STM32F4 Embedded Rust at the HAL *.md` - - didaktische Sequenz: GPIO -> Input -> ADC -> Integration -3. `sources/AnyLeaf articles Writing embedded firmware using Rust.md` - - Register/HAL-Abstraktionslevel, Embedded-Rust Argumentation -4. `sources/Brave new IO Embedded in Rust.md` - - Ownership/Typisierung für sichere Hardwarezugriffe diff --git a/tutorial/00-setup-live/task/checklist.md b/tutorial/00-install-rust/README.md similarity index 92% rename from tutorial/00-setup-live/task/checklist.md rename to tutorial/00-install-rust/README.md index 89eb14a..47564d7 100644 --- a/tutorial/00-setup-live/task/checklist.md +++ b/tutorial/00-install-rust/README.md @@ -1,4 +1,4 @@ -# Task Checklist +# 00 - install rust - [ ] Rust toolchain installiert (`rustup`, `cargo`, `rustc`) - [ ] Target `thumbv7m-none-eabi` installiert diff --git a/tutorial/00-setup-live/task/setup.sh b/tutorial/00-install-rust/setup.sh similarity index 90% rename from tutorial/00-setup-live/task/setup.sh rename to tutorial/00-install-rust/setup.sh index 776e203..cc42104 100755 --- a/tutorial/00-setup-live/task/setup.sh +++ b/tutorial/00-install-rust/setup.sh @@ -28,9 +28,14 @@ if ! command -v probe-rs >/dev/null 2>&1; then cargo install probe-rs-tools sudo groupadd --system plugdev sudo usermod -a -G plugdev $USER + probe-rs complete install else echo "[setup] probe-rs already installed" probe-rs --version fi +probe-rs list +probe-rs info +probe-rs chip list | grep STM32F103C8 + echo "[setup] done" diff --git a/tutorial/00-setup-live/README.md b/tutorial/00-setup-live/README.md deleted file mode 100644 index dc93e64..0000000 --- a/tutorial/00-setup-live/README.md +++ /dev/null @@ -1,17 +0,0 @@ -# 00 - Setup Live (10 min) - -## Goal - -Jede Station kann Rust-Code bauen und eine Bluepill über ST-Link erkennen. - -## Steps - -1. install rustup -2. add target -3. add probe-rs - -## Done when - -1. `rustc`, `cargo`, `probe-rs` verfügbar. -2. `thumbv7m-none-eabi` installiert. -3. `probe-rs list` zeigt die Probe. diff --git a/tutorial/01-rust-hello/Cargo.lock b/tutorial/01-rust-hello/Cargo.lock new file mode 100644 index 0000000..b4554a8 --- /dev/null +++ b/tutorial/01-rust-hello/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "rust_hello_task" +version = "0.1.0" diff --git a/tutorial/01-rust-hello/task/Cargo.toml b/tutorial/01-rust-hello/Cargo.toml similarity index 58% rename from tutorial/01-rust-hello/task/Cargo.toml rename to tutorial/01-rust-hello/Cargo.toml index cd1abb5..ecfe9bf 100644 --- a/tutorial/01-rust-hello/task/Cargo.toml +++ b/tutorial/01-rust-hello/Cargo.toml @@ -1,4 +1,4 @@ [package] -name = "step01_rust_hello_task" +name = "rust_hello_task" version = "0.1.0" edition = "2021" diff --git a/tutorial/01-rust-hello/README.md b/tutorial/01-rust-hello/README.md index 27a3de8..40cd4e2 100644 --- a/tutorial/01-rust-hello/README.md +++ b/tutorial/01-rust-hello/README.md @@ -1,20 +1,15 @@ -# 01 - Rust Hello (5 min) - -## Goal +# 01 - Rust Hello Erstes lauffähiges Rust-Programm, das Daten über `println!` ausgibt. ## Run -- `bash scripts/run-step.sh 01 task` +```bash +cd src/ +rustc main.c +./main.c +``` -## Tasks - -1. Öffne `task/src/main.rs`. -2. Ersetze die TODO-Werte. -3. Starte erneut mit `cargo run`. - -## Done when - -1. Das Programm kompiliert. -2. Die Ausgabe enthält euren Namen und Workshop-Titel. +```bash +cargo run +``` \ No newline at end of file diff --git a/tutorial/01-rust-hello/solution.06p5vxa3q8owanxdnt6b423l3.rcgu.o b/tutorial/01-rust-hello/solution.06p5vxa3q8owanxdnt6b423l3.rcgu.o new file mode 100644 index 0000000..f2eb05f Binary files /dev/null and b/tutorial/01-rust-hello/solution.06p5vxa3q8owanxdnt6b423l3.rcgu.o differ diff --git a/tutorial/01-rust-hello/solution.solution.242aee81f8e03e97-cgu.0.rcgu.o b/tutorial/01-rust-hello/solution.solution.242aee81f8e03e97-cgu.0.rcgu.o new file mode 100644 index 0000000..5eb5f46 Binary files /dev/null and b/tutorial/01-rust-hello/solution.solution.242aee81f8e03e97-cgu.0.rcgu.o differ diff --git a/tutorial/01-rust-hello/src/main b/tutorial/01-rust-hello/src/main new file mode 100755 index 0000000..43e03da Binary files /dev/null and b/tutorial/01-rust-hello/src/main differ diff --git a/tutorial/01-rust-hello/task/src/main.rs b/tutorial/01-rust-hello/src/main.rs similarity index 67% rename from tutorial/01-rust-hello/task/src/main.rs rename to tutorial/01-rust-hello/src/main.rs index e4fff80..3304db7 100644 --- a/tutorial/01-rust-hello/task/src/main.rs +++ b/tutorial/01-rust-hello/src/main.rs @@ -3,7 +3,8 @@ fn main() { let participant_name = "Your Name"; let workshop_title = "Rust on Embedded @ Didacta"; - println!("Hello, {participant_name}!"); - println!("Welcome to: {workshop_title}"); + // TODO: Insert the strings in the output + println!("Hello, TODO !"); + println!("Welcome to: TODO"); println!("Next step: types, control flow, and ownership."); } diff --git a/tutorial/01-rust-hello/src/solution b/tutorial/01-rust-hello/src/solution new file mode 100755 index 0000000..ff2299a Binary files /dev/null and b/tutorial/01-rust-hello/src/solution differ diff --git a/tutorial/01-rust-hello/solution/src/main.rs b/tutorial/01-rust-hello/src/solution.rs similarity index 100% rename from tutorial/01-rust-hello/solution/src/main.rs rename to tutorial/01-rust-hello/src/solution.rs diff --git a/tutorial/02-rust-types-control/Cargo.lock b/tutorial/02-rust-types-control/Cargo.lock new file mode 100644 index 0000000..e1d7b38 --- /dev/null +++ b/tutorial/02-rust-types-control/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "rust_types_control_task" +version = "0.1.0" diff --git a/tutorial/01-rust-hello/solution/Cargo.toml b/tutorial/02-rust-types-control/Cargo.toml similarity index 55% rename from tutorial/01-rust-hello/solution/Cargo.toml rename to tutorial/02-rust-types-control/Cargo.toml index 4cd86be..7ded0b5 100644 --- a/tutorial/01-rust-hello/solution/Cargo.toml +++ b/tutorial/02-rust-types-control/Cargo.toml @@ -1,4 +1,4 @@ [package] -name = "step01_rust_hello_solution" +name = "rust_types_control_task" version = "0.1.0" edition = "2021" diff --git a/tutorial/02-rust-types-control/README.md b/tutorial/02-rust-types-control/README.md index e708044..9e7da34 100644 --- a/tutorial/02-rust-types-control/README.md +++ b/tutorial/02-rust-types-control/README.md @@ -1,20 +1,3 @@ # 02 - Types and Control Flow (6 min) -## Goal - Mit Typen, `if`, und `match` kleine Entscheidungen ausdrücken. - -## Run - -- `bash scripts/run-step.sh 02 task` - -## Tasks - -1. Passe die Schwellwerte in `classify_adc` an. -2. Teste mit mehreren ADC-Werten. -3. Beobachte die Ausgabe von `pressed/released` und `low/medium/high`. - -## Done when - -1. Das Programm kompiliert. -2. Für unterschiedliche Werte entstehen unterschiedliche Klassifizierungen. diff --git a/tutorial/02-rust-types-control/solution/Cargo.toml b/tutorial/02-rust-types-control/solution/Cargo.toml deleted file mode 100644 index e52602f..0000000 --- a/tutorial/02-rust-types-control/solution/Cargo.toml +++ /dev/null @@ -1,4 +0,0 @@ -[package] -name = "step02_rust_types_control_solution" -version = "0.1.0" -edition = "2021" diff --git a/tutorial/02-rust-types-control/task/src/main.rs b/tutorial/02-rust-types-control/src/main.rs similarity index 70% rename from tutorial/02-rust-types-control/task/src/main.rs rename to tutorial/02-rust-types-control/src/main.rs index 301b6d7..9539537 100644 --- a/tutorial/02-rust-types-control/task/src/main.rs +++ b/tutorial/02-rust-types-control/src/main.rs @@ -16,14 +16,17 @@ fn classify_adc(raw: u16) -> &'static str { } fn main() { + // TODO: fill in some values into the arrays let button_samples = [false, true, true, false]; let adc_samples: [u16; 5] = [120, 900, 1500, 2600, 3900]; for pressed in button_samples { - println!("button: {}", classify_button(pressed)); + // call and print the function for the button + println!("button: {}"); } for raw in adc_samples { - println!("adc raw={raw:4} => {}", classify_adc(raw)); + // call and print the function for the button + println!("adc raw={raw:4} => {}"); } } diff --git a/tutorial/02-rust-types-control/solution/src/main.rs b/tutorial/02-rust-types-control/src/solution.rs similarity index 100% rename from tutorial/02-rust-types-control/solution/src/main.rs rename to tutorial/02-rust-types-control/src/solution.rs diff --git a/tutorial/02-rust-types-control/task/Cargo.toml b/tutorial/03-rust-ownership-borrow/Cargo.toml similarity index 52% rename from tutorial/02-rust-types-control/task/Cargo.toml rename to tutorial/03-rust-ownership-borrow/Cargo.toml index ef1f9dd..c99e09d 100644 --- a/tutorial/02-rust-types-control/task/Cargo.toml +++ b/tutorial/03-rust-ownership-borrow/Cargo.toml @@ -1,4 +1,4 @@ [package] -name = "step02_rust_types_control_task" +name = "rust_ownership_borrow_task" version = "0.1.0" edition = "2021" diff --git a/tutorial/03-rust-ownership-borrow/README.md b/tutorial/03-rust-ownership-borrow/README.md index f57c917..1a15342 100644 --- a/tutorial/03-rust-ownership-borrow/README.md +++ b/tutorial/03-rust-ownership-borrow/README.md @@ -1,20 +1,3 @@ -# 03 - Ownership and Borrowing (7 min) - -## Goal +# 03 - Ownership and Borrowing Ownership und Borrowing an einem kleinen Robot-State praktisch verstehen. - -## Run - -- `bash scripts/run-step.sh 03 task` - -## Tasks - -1. Lies die Funktionen mit `&RobotState` und `&mut RobotState`. -2. Ergänze die TODOs in der Task-Datei. -3. Achte auf Compiler-Fehler, wenn mutable/immutable borrows kollidieren. - -## Done when - -1. Das Programm kompiliert. -2. LED-State, Button-Count und ADC-Wert werden korrekt aktualisiert. diff --git a/tutorial/03-rust-ownership-borrow/solution/Cargo.toml b/tutorial/03-rust-ownership-borrow/solution/Cargo.toml deleted file mode 100644 index 1063b94..0000000 --- a/tutorial/03-rust-ownership-borrow/solution/Cargo.toml +++ /dev/null @@ -1,4 +0,0 @@ -[package] -name = "step03_rust_ownership_borrow_solution" -version = "0.1.0" -edition = "2021" diff --git a/tutorial/03-rust-ownership-borrow/task/src/main.rs b/tutorial/03-rust-ownership-borrow/src/main.rs similarity index 54% rename from tutorial/03-rust-ownership-borrow/task/src/main.rs rename to tutorial/03-rust-ownership-borrow/src/main.rs index f012f15..c53922b 100644 --- a/tutorial/03-rust-ownership-borrow/task/src/main.rs +++ b/tutorial/03-rust-ownership-borrow/src/main.rs @@ -6,27 +6,31 @@ struct RobotState { } fn print_state(state: &RobotState) { + // TODO: print the different elements of RobotState println!( - "state => led_on={}, button_count={}, last_adc={}", - state.led_on, state.button_count, state.last_adc + "state => led_on={}, button_count={}, last_adc={}", + ??? ); } fn toggle_led(state: &mut RobotState) { - state.led_on = !state.led_on; + // TODO: change the LED state to the inverse of itself + state.led_on = ?? } fn record_button_press(state: &mut RobotState) { - state.button_count += 1; + // TODO: increase the button counter on press + state.button_count = ?? } fn update_adc(state: &mut RobotState, raw: u16) { - // TODO: keep this function as the single writer for ADC state. - state.last_adc = raw; + // TODO: update the adc value with the given one + state.last_adc = ?? } fn main() { - let mut state = RobotState { + // TODO: change the RobotState so we can edit its values + let state = RobotState { led_on: false, button_count: 0, last_adc: 0, diff --git a/tutorial/03-rust-ownership-borrow/solution/src/main.rs b/tutorial/03-rust-ownership-borrow/src/solution.rs similarity index 100% rename from tutorial/03-rust-ownership-borrow/solution/src/main.rs rename to tutorial/03-rust-ownership-borrow/src/solution.rs diff --git a/tutorial/03-rust-ownership-borrow/task/Cargo.toml b/tutorial/04-desktop-programm/Cargo.toml similarity index 51% rename from tutorial/03-rust-ownership-borrow/task/Cargo.toml rename to tutorial/04-desktop-programm/Cargo.toml index c39bc4c..d90dd72 100644 --- a/tutorial/03-rust-ownership-borrow/task/Cargo.toml +++ b/tutorial/04-desktop-programm/Cargo.toml @@ -1,4 +1,4 @@ [package] -name = "step03_rust_ownership_borrow_task" +name = "rust_desktop_programm" version = "0.1.0" edition = "2021" diff --git a/tutorial/04-desktop-programm/README.md b/tutorial/04-desktop-programm/README.md new file mode 100644 index 0000000..d9e6b75 --- /dev/null +++ b/tutorial/04-desktop-programm/README.md @@ -0,0 +1,3 @@ +# 04 Desktop Programm + +kleines CLI Tool um Fertigkeiten auszuprobieren diff --git a/tutorial/04-desktop-programm/src/main.rs b/tutorial/04-desktop-programm/src/main.rs new file mode 100644 index 0000000..e69de29 diff --git a/tutorial/04-embedded-no-std-hello/README.md b/tutorial/04-embedded-no-std-hello/README.md deleted file mode 100644 index 029e1ad..0000000 --- a/tutorial/04-embedded-no-std-hello/README.md +++ /dev/null @@ -1,20 +0,0 @@ -# 04 - Embedded no_std Hello (8 min) - -## Goal - -Erstes Bare-Metal-Programm mit `#![no_std]`, `#![no_main]` und RTT Logs. - -## Run - -- `bash scripts/run-step.sh 04 task` - -## Tasks - -1. Lies die Top-Level-Attribute in `task/src/main.rs`. -2. Passe die Log-Ausgaben an. -3. Flashe mit `cargo run --release`. - -## Done when - -1. Firmware läuft auf Bluepill. -2. RTT zeigt zyklisch eine "alive"-Meldung. diff --git a/tutorial/04-embedded-no-std-hello/solution/Cargo.toml b/tutorial/04-embedded-no-std-hello/solution/Cargo.toml deleted file mode 100644 index 63147d9..0000000 --- a/tutorial/04-embedded-no-std-hello/solution/Cargo.toml +++ /dev/null @@ -1,22 +0,0 @@ -[package] -name = "step04_embedded_no_std_hello_solution" -version = "0.1.0" -edition = "2021" - -[dependencies] -cortex-m = "0.7.7" -cortex-m-rt = "0.7.5" -defmt = "0.3.10" -defmt-rtt = "0.4.2" -panic-probe = { version = "0.3.2", features = ["print-defmt"] } -nb = "1.1.0" - -[dependencies.stm32f1xx-hal] -version = "0.11.0" -features = ["rt", "stm32f103", "medium"] - -[profile.release] -codegen-units = 1 -debug = 2 -lto = true -opt-level = "z" diff --git a/tutorial/04-embedded-no-std-hello/task/Cargo.toml b/tutorial/04-embedded-no-std-hello/task/Cargo.toml deleted file mode 100644 index e3bf052..0000000 --- a/tutorial/04-embedded-no-std-hello/task/Cargo.toml +++ /dev/null @@ -1,22 +0,0 @@ -[package] -name = "step04_embedded_no_std_hello_task" -version = "0.1.0" -edition = "2021" - -[dependencies] -cortex-m = "0.7.7" -cortex-m-rt = "0.7.5" -defmt = "0.3.10" -defmt-rtt = "0.4.2" -panic-probe = { version = "0.3.2", features = ["print-defmt"] } -nb = "1.1.0" - -[dependencies.stm32f1xx-hal] -version = "0.11.0" -features = ["rt", "stm32f103", "medium"] - -[profile.release] -codegen-units = 1 -debug = 2 -lto = true -opt-level = "z" diff --git a/tutorial/05-led-blink/README.md b/tutorial/05-led-blink/README.md deleted file mode 100644 index 20bccba..0000000 --- a/tutorial/05-led-blink/README.md +++ /dev/null @@ -1,20 +0,0 @@ -# 05 - LED Blink (8 min) - -## Goal - -Onboard-LED (PC13, active-low) per Timer toggeln. - -## Run - -- `bash scripts/run-step.sh 05 task` - -## Tasks - -1. Prüfe in `task/src/main.rs`, welche Pegel "LED an/aus" bedeuten. -2. Passe Blinkfrequenz an. -3. Verifiziere LED und Logs. - -## Done when - -1. LED blinkt sichtbar. -2. Logs zeigen den Schaltzustand. diff --git a/tutorial/04-embedded-no-std-hello/solution/.cargo/config.toml b/tutorial/05-no-std/.cargo/config.toml similarity index 100% rename from tutorial/04-embedded-no-std-hello/solution/.cargo/config.toml rename to tutorial/05-no-std/.cargo/config.toml diff --git a/tutorial/05-led-blink/task/Cargo.toml b/tutorial/05-no-std/Cargo.toml similarity index 92% rename from tutorial/05-led-blink/task/Cargo.toml rename to tutorial/05-no-std/Cargo.toml index 41e2b48..7fac694 100644 --- a/tutorial/05-led-blink/task/Cargo.toml +++ b/tutorial/05-no-std/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "step05_led_blink_task" +name = "embedded_no_std" version = "0.1.0" edition = "2021" diff --git a/tutorial/05-no-std/README.md b/tutorial/05-no-std/README.md new file mode 100644 index 0000000..b1637e7 --- /dev/null +++ b/tutorial/05-no-std/README.md @@ -0,0 +1,3 @@ +# 05 - Embedded no_std + +Erstes Bare-Metal-Programm mit `#![no_std]`, `#![no_main]` und RTT Logs. diff --git a/tutorial/04-embedded-no-std-hello/solution/memory.x b/tutorial/05-no-std/memory.x similarity index 100% rename from tutorial/04-embedded-no-std-hello/solution/memory.x rename to tutorial/05-no-std/memory.x diff --git a/tutorial/04-embedded-no-std-hello/solution/rust-toolchain.toml b/tutorial/05-no-std/rust-toolchain.toml similarity index 100% rename from tutorial/04-embedded-no-std-hello/solution/rust-toolchain.toml rename to tutorial/05-no-std/rust-toolchain.toml diff --git a/tutorial/04-embedded-no-std-hello/task/src/main.rs b/tutorial/05-no-std/src/main.rs similarity index 56% rename from tutorial/04-embedded-no-std-hello/task/src/main.rs rename to tutorial/05-no-std/src/main.rs index 1ff802d..eb2768b 100644 --- a/tutorial/04-embedded-no-std-hello/task/src/main.rs +++ b/tutorial/05-no-std/src/main.rs @@ -8,11 +8,9 @@ use {defmt_rtt as _, panic_probe as _}; #[entry] fn main() -> ! { - // TODO: personalize these log lines. - info!("step04: no_std hello on stm32f103c8"); + info!("stm: no_std hello on stm32f103c8"); - loop { + // TODO: we want this as a loop asm::delay(8_000_000); - info!("step04: alive"); - } + info!("stm: alive"); } diff --git a/tutorial/04-embedded-no-std-hello/solution/src/main.rs b/tutorial/05-no-std/src/solution.rs similarity index 76% rename from tutorial/04-embedded-no-std-hello/solution/src/main.rs rename to tutorial/05-no-std/src/solution.rs index b603c53..71476a5 100644 --- a/tutorial/04-embedded-no-std-hello/solution/src/main.rs +++ b/tutorial/05-no-std/src/solution.rs @@ -8,10 +8,10 @@ use {defmt_rtt as _, panic_probe as _}; #[entry] fn main() -> ! { - info!("step04: boot ok"); + info!("boot ok"); loop { asm::delay(8_000_000); - info!("step04: alive"); + info!("alive"); } } diff --git a/tutorial/06-button-input/README.md b/tutorial/06-button-input/README.md deleted file mode 100644 index dd954b3..0000000 --- a/tutorial/06-button-input/README.md +++ /dev/null @@ -1,20 +0,0 @@ -# 06 - Button Input (6 min) - -## Goal - -Button an PA0 (Pull-up) lesen und Press/Release als Log ausgeben. - -## Run - -- `bash scripts/run-step.sh 06 task` - -## Tasks - -1. Verdrahtung prüfen: PA0 -> Button -> GND. -2. Starte `task` und beobachte Logs. -3. Passe Polling-Intervall an. - -## Done when - -1. Pressed/Released wird korrekt erkannt. -2. Keine Flut von Wiederhol-Logs bei gehaltenem Taster. diff --git a/tutorial/06-button-input/solution/.cargo/config.toml b/tutorial/06-button-input/solution/.cargo/config.toml deleted file mode 100644 index d588bc1..0000000 --- a/tutorial/06-button-input/solution/.cargo/config.toml +++ /dev/null @@ -1,12 +0,0 @@ -[target.thumbv7m-none-eabi] -runner = "probe-rs run --chip STM32F103C8" -rustflags = [ - "-C", "link-arg=-Tlink.x", - "-C", "link-arg=-Tdefmt.x", -] - -[build] -target = "thumbv7m-none-eabi" - -[env] -DEFMT_LOG = "info" diff --git a/tutorial/06-button-input/solution/Cargo.toml b/tutorial/06-button-input/solution/Cargo.toml deleted file mode 100644 index 455c0dd..0000000 --- a/tutorial/06-button-input/solution/Cargo.toml +++ /dev/null @@ -1,22 +0,0 @@ -[package] -name = "step06_button_input_solution" -version = "0.1.0" -edition = "2021" - -[dependencies] -cortex-m = "0.7.7" -cortex-m-rt = "0.7.5" -defmt = "0.3.10" -defmt-rtt = "0.4.2" -panic-probe = { version = "0.3.2", features = ["print-defmt"] } -nb = "1.1.0" - -[dependencies.stm32f1xx-hal] -version = "0.11.0" -features = ["rt", "stm32f103", "medium"] - -[profile.release] -codegen-units = 1 -debug = 2 -lto = true -opt-level = "z" diff --git a/tutorial/06-button-input/solution/memory.x b/tutorial/06-button-input/solution/memory.x deleted file mode 100644 index 19825e7..0000000 --- a/tutorial/06-button-input/solution/memory.x +++ /dev/null @@ -1,5 +0,0 @@ -MEMORY -{ - FLASH : ORIGIN = 0x08000000, LENGTH = 64K - RAM : ORIGIN = 0x20000000, LENGTH = 20K -} diff --git a/tutorial/06-button-input/solution/rust-toolchain.toml b/tutorial/06-button-input/solution/rust-toolchain.toml deleted file mode 100644 index e2ff99e..0000000 --- a/tutorial/06-button-input/solution/rust-toolchain.toml +++ /dev/null @@ -1,4 +0,0 @@ -[toolchain] -channel = "stable" -components = ["rustfmt"] -targets = ["thumbv7m-none-eabi"] diff --git a/tutorial/06-button-input/task/.cargo/config.toml b/tutorial/06-button-input/task/.cargo/config.toml deleted file mode 100644 index d588bc1..0000000 --- a/tutorial/06-button-input/task/.cargo/config.toml +++ /dev/null @@ -1,12 +0,0 @@ -[target.thumbv7m-none-eabi] -runner = "probe-rs run --chip STM32F103C8" -rustflags = [ - "-C", "link-arg=-Tlink.x", - "-C", "link-arg=-Tdefmt.x", -] - -[build] -target = "thumbv7m-none-eabi" - -[env] -DEFMT_LOG = "info" diff --git a/tutorial/06-button-input/task/memory.x b/tutorial/06-button-input/task/memory.x deleted file mode 100644 index 19825e7..0000000 --- a/tutorial/06-button-input/task/memory.x +++ /dev/null @@ -1,5 +0,0 @@ -MEMORY -{ - FLASH : ORIGIN = 0x08000000, LENGTH = 64K - RAM : ORIGIN = 0x20000000, LENGTH = 20K -} diff --git a/tutorial/06-button-input/task/rust-toolchain.toml b/tutorial/06-button-input/task/rust-toolchain.toml deleted file mode 100644 index e2ff99e..0000000 --- a/tutorial/06-button-input/task/rust-toolchain.toml +++ /dev/null @@ -1,4 +0,0 @@ -[toolchain] -channel = "stable" -components = ["rustfmt"] -targets = ["thumbv7m-none-eabi"] diff --git a/tutorial/04-embedded-no-std-hello/task/.cargo/config.toml b/tutorial/06-led-blink/.cargo/config.toml similarity index 100% rename from tutorial/04-embedded-no-std-hello/task/.cargo/config.toml rename to tutorial/06-led-blink/.cargo/config.toml diff --git a/tutorial/06-button-input/task/Cargo.toml b/tutorial/06-led-blink/Cargo.toml similarity index 91% rename from tutorial/06-button-input/task/Cargo.toml rename to tutorial/06-led-blink/Cargo.toml index f6972d4..501e3b5 100644 --- a/tutorial/06-button-input/task/Cargo.toml +++ b/tutorial/06-led-blink/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "step06_button_input_task" +name = "led_blink_task" version = "0.1.0" edition = "2021" diff --git a/tutorial/06-led-blink/README.md b/tutorial/06-led-blink/README.md new file mode 100644 index 0000000..6ee531f --- /dev/null +++ b/tutorial/06-led-blink/README.md @@ -0,0 +1,3 @@ +# 06 - LED Blink + +Onboard-LED (PC13, active-low) per Timer toggeln. diff --git a/tutorial/04-embedded-no-std-hello/task/memory.x b/tutorial/06-led-blink/memory.x similarity index 100% rename from tutorial/04-embedded-no-std-hello/task/memory.x rename to tutorial/06-led-blink/memory.x diff --git a/tutorial/04-embedded-no-std-hello/task/rust-toolchain.toml b/tutorial/06-led-blink/rust-toolchain.toml similarity index 100% rename from tutorial/04-embedded-no-std-hello/task/rust-toolchain.toml rename to tutorial/06-led-blink/rust-toolchain.toml diff --git a/tutorial/05-led-blink/task/src/main.rs b/tutorial/06-led-blink/src/main.rs similarity index 92% rename from tutorial/05-led-blink/task/src/main.rs rename to tutorial/06-led-blink/src/main.rs index 154e66c..23ce672 100644 --- a/tutorial/05-led-blink/task/src/main.rs +++ b/tutorial/06-led-blink/src/main.rs @@ -16,7 +16,7 @@ fn main() -> ! { let mut gpioc = dp.GPIOC.split(&mut rcc); // Bluepill onboard LED on PC13 is active-low. - let mut led = gpioc.pc13.into_push_pull_output(&mut gpioc.crh); + // TODO: create LED Pin Input let mut timer = Timer::syst(cp.SYST, &rcc.clocks).counter_hz(); timer.start(2.Hz()).unwrap(); diff --git a/tutorial/05-led-blink/solution/src/main.rs b/tutorial/06-led-blink/src/solution.rs similarity index 100% rename from tutorial/05-led-blink/solution/src/main.rs rename to tutorial/06-led-blink/src/solution.rs diff --git a/tutorial/07-analog-readout/README.md b/tutorial/07-analog-readout/README.md deleted file mode 100644 index 9bdad25..0000000 --- a/tutorial/07-analog-readout/README.md +++ /dev/null @@ -1,20 +0,0 @@ -# 07 - Analog Readout (6 min) - -## Goal - -ADC auf PA1 lesen und Werte über RTT streamen. - -## Run - -- `bash scripts/run-step.sh 07 task` - -## Tasks - -1. Verdrahtung prüfen: Analogsignal an PA1. -2. Werte ausgeben und in drei Bereiche klassifizieren. -3. Potentiometer/Sensor bewegen und Änderung beobachten. - -## Done when - -1. Rohwert ändert sich mit Eingangsspannung. -2. Klassifizierung (`low/medium/high`) reagiert sinnvoll. diff --git a/tutorial/07-analog-readout/solution/.cargo/config.toml b/tutorial/07-analog-readout/solution/.cargo/config.toml deleted file mode 100644 index d588bc1..0000000 --- a/tutorial/07-analog-readout/solution/.cargo/config.toml +++ /dev/null @@ -1,12 +0,0 @@ -[target.thumbv7m-none-eabi] -runner = "probe-rs run --chip STM32F103C8" -rustflags = [ - "-C", "link-arg=-Tlink.x", - "-C", "link-arg=-Tdefmt.x", -] - -[build] -target = "thumbv7m-none-eabi" - -[env] -DEFMT_LOG = "info" diff --git a/tutorial/07-analog-readout/solution/Cargo.toml b/tutorial/07-analog-readout/solution/Cargo.toml deleted file mode 100644 index 74bff37..0000000 --- a/tutorial/07-analog-readout/solution/Cargo.toml +++ /dev/null @@ -1,22 +0,0 @@ -[package] -name = "step07_analog_readout_solution" -version = "0.1.0" -edition = "2021" - -[dependencies] -cortex-m = "0.7.7" -cortex-m-rt = "0.7.5" -defmt = "0.3.10" -defmt-rtt = "0.4.2" -panic-probe = { version = "0.3.2", features = ["print-defmt"] } -nb = "1.1.0" - -[dependencies.stm32f1xx-hal] -version = "0.11.0" -features = ["rt", "stm32f103", "medium"] - -[profile.release] -codegen-units = 1 -debug = 2 -lto = true -opt-level = "z" diff --git a/tutorial/07-analog-readout/solution/memory.x b/tutorial/07-analog-readout/solution/memory.x deleted file mode 100644 index 19825e7..0000000 --- a/tutorial/07-analog-readout/solution/memory.x +++ /dev/null @@ -1,5 +0,0 @@ -MEMORY -{ - FLASH : ORIGIN = 0x08000000, LENGTH = 64K - RAM : ORIGIN = 0x20000000, LENGTH = 20K -} diff --git a/tutorial/07-analog-readout/solution/rust-toolchain.toml b/tutorial/07-analog-readout/solution/rust-toolchain.toml deleted file mode 100644 index e2ff99e..0000000 --- a/tutorial/07-analog-readout/solution/rust-toolchain.toml +++ /dev/null @@ -1,4 +0,0 @@ -[toolchain] -channel = "stable" -components = ["rustfmt"] -targets = ["thumbv7m-none-eabi"] diff --git a/tutorial/07-analog-readout/task/.cargo/config.toml b/tutorial/07-analog-readout/task/.cargo/config.toml deleted file mode 100644 index d588bc1..0000000 --- a/tutorial/07-analog-readout/task/.cargo/config.toml +++ /dev/null @@ -1,12 +0,0 @@ -[target.thumbv7m-none-eabi] -runner = "probe-rs run --chip STM32F103C8" -rustflags = [ - "-C", "link-arg=-Tlink.x", - "-C", "link-arg=-Tdefmt.x", -] - -[build] -target = "thumbv7m-none-eabi" - -[env] -DEFMT_LOG = "info" diff --git a/tutorial/07-analog-readout/task/memory.x b/tutorial/07-analog-readout/task/memory.x deleted file mode 100644 index 19825e7..0000000 --- a/tutorial/07-analog-readout/task/memory.x +++ /dev/null @@ -1,5 +0,0 @@ -MEMORY -{ - FLASH : ORIGIN = 0x08000000, LENGTH = 64K - RAM : ORIGIN = 0x20000000, LENGTH = 20K -} diff --git a/tutorial/07-analog-readout/task/rust-toolchain.toml b/tutorial/07-analog-readout/task/rust-toolchain.toml deleted file mode 100644 index e2ff99e..0000000 --- a/tutorial/07-analog-readout/task/rust-toolchain.toml +++ /dev/null @@ -1,4 +0,0 @@ -[toolchain] -channel = "stable" -components = ["rustfmt"] -targets = ["thumbv7m-none-eabi"] diff --git a/tutorial/05-led-blink/solution/.cargo/config.toml b/tutorial/07-button-input/.cargo/config.toml similarity index 100% rename from tutorial/05-led-blink/solution/.cargo/config.toml rename to tutorial/07-button-input/.cargo/config.toml diff --git a/tutorial/05-led-blink/solution/Cargo.toml b/tutorial/07-button-input/Cargo.toml similarity index 91% rename from tutorial/05-led-blink/solution/Cargo.toml rename to tutorial/07-button-input/Cargo.toml index 6c103c8..4a319af 100644 --- a/tutorial/05-led-blink/solution/Cargo.toml +++ b/tutorial/07-button-input/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "step05_led_blink_solution" +name = "button_input_task" version = "0.1.0" edition = "2021" diff --git a/tutorial/07-button-input/README.md b/tutorial/07-button-input/README.md new file mode 100644 index 0000000..804ebd3 --- /dev/null +++ b/tutorial/07-button-input/README.md @@ -0,0 +1,3 @@ +# 07 - Button Input + +Button an PA0 (Pull-up) lesen und Press/Release als Log ausgeben. diff --git a/tutorial/05-led-blink/solution/memory.x b/tutorial/07-button-input/memory.x similarity index 100% rename from tutorial/05-led-blink/solution/memory.x rename to tutorial/07-button-input/memory.x diff --git a/tutorial/05-led-blink/solution/rust-toolchain.toml b/tutorial/07-button-input/rust-toolchain.toml similarity index 100% rename from tutorial/05-led-blink/solution/rust-toolchain.toml rename to tutorial/07-button-input/rust-toolchain.toml diff --git a/tutorial/06-button-input/task/src/main.rs b/tutorial/07-button-input/src/main.rs similarity index 63% rename from tutorial/06-button-input/task/src/main.rs rename to tutorial/07-button-input/src/main.rs index 3373f16..ebb8f2d 100644 --- a/tutorial/06-button-input/task/src/main.rs +++ b/tutorial/07-button-input/src/main.rs @@ -15,8 +15,7 @@ fn main() -> ! { let mut rcc = dp.RCC.constrain(); let mut gpioa = dp.GPIOA.split(&mut rcc); - // Button wiring: PA0 -> button -> GND - let button = gpioa.pa0.into_pull_up_input(&mut gpioa.crl); + // TODO: Button wiring: PA0 -> button -> GND let mut timer = Timer::syst(cp.SYST, &rcc.clocks).counter_hz(); timer.start(40.Hz()).unwrap(); @@ -24,15 +23,9 @@ fn main() -> ! { let mut last_pressed = false; loop { - let pressed = button.is_low(); - if pressed != last_pressed { - if pressed { - info!("button: pressed"); - } else { - info!("button: released"); - } - last_pressed = pressed; - } + + // TODO: get the current button status + // TODO: print a message when the button is pressed and released // Poll at 25ms to avoid too much log spam. block!(timer.wait()).unwrap(); diff --git a/tutorial/06-button-input/solution/src/main.rs b/tutorial/07-button-input/src/solution.rs similarity index 100% rename from tutorial/06-button-input/solution/src/main.rs rename to tutorial/07-button-input/src/solution.rs diff --git a/tutorial/05-led-blink/task/.cargo/config.toml b/tutorial/08-analog-readout/.cargo/config.toml similarity index 100% rename from tutorial/05-led-blink/task/.cargo/config.toml rename to tutorial/08-analog-readout/.cargo/config.toml diff --git a/tutorial/07-analog-readout/task/Cargo.toml b/tutorial/08-analog-readout/Cargo.toml similarity index 91% rename from tutorial/07-analog-readout/task/Cargo.toml rename to tutorial/08-analog-readout/Cargo.toml index 289292e..e5eca51 100644 --- a/tutorial/07-analog-readout/task/Cargo.toml +++ b/tutorial/08-analog-readout/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "step07_analog_readout_task" +name = "analog_readout_task" version = "0.1.0" edition = "2021" diff --git a/tutorial/08-analog-readout/README.md b/tutorial/08-analog-readout/README.md new file mode 100644 index 0000000..3592d75 --- /dev/null +++ b/tutorial/08-analog-readout/README.md @@ -0,0 +1,3 @@ +# 08 - Analog Readout + +ADC auf PA1 lesen und Werte über RTT streamen. diff --git a/tutorial/05-led-blink/task/memory.x b/tutorial/08-analog-readout/memory.x similarity index 100% rename from tutorial/05-led-blink/task/memory.x rename to tutorial/08-analog-readout/memory.x diff --git a/tutorial/05-led-blink/task/rust-toolchain.toml b/tutorial/08-analog-readout/rust-toolchain.toml similarity index 100% rename from tutorial/05-led-blink/task/rust-toolchain.toml rename to tutorial/08-analog-readout/rust-toolchain.toml diff --git a/tutorial/07-analog-readout/task/src/main.rs b/tutorial/08-analog-readout/src/main.rs similarity index 89% rename from tutorial/07-analog-readout/task/src/main.rs rename to tutorial/08-analog-readout/src/main.rs index 862425a..c5240f0 100644 --- a/tutorial/07-analog-readout/task/src/main.rs +++ b/tutorial/08-analog-readout/src/main.rs @@ -24,8 +24,7 @@ fn main() -> ! { let mut rcc = dp.RCC.constrain(); let mut gpioa = dp.GPIOA.split(&mut rcc); - let mut adc = Adc::new(dp.ADC1, &mut rcc); - let mut analog_pin = gpioa.pa1.into_analog(&mut gpioa.crl); + // TODO: set up ADC and ADC Pin and read let mut timer = Timer::syst(cp.SYST, &rcc.clocks).counter_hz(); timer.start(10.Hz()).unwrap(); diff --git a/tutorial/07-analog-readout/solution/src/main.rs b/tutorial/08-analog-readout/src/solution.rs similarity index 100% rename from tutorial/07-analog-readout/solution/src/main.rs rename to tutorial/08-analog-readout/src/solution.rs diff --git a/tutorial/08-final-combined/README.md b/tutorial/08-final-combined/README.md deleted file mode 100644 index b7305e2..0000000 --- a/tutorial/08-final-combined/README.md +++ /dev/null @@ -1,22 +0,0 @@ -# 08 - Final Combined (4 min) - -## Goal - -Blink + Button + ADC in einem Programm kombinieren. - -## Behavior - -1. ADC steuert Blink-Intervall. -2. Button toggelt Betriebsmodus: - - `Mode::Blinking` - - `Mode::ForcedOff` - -## Run - -- `bash scripts/run-step.sh 08 task` - -## Done when - -1. LED-Verhalten ändert sich per Button. -2. ADC beeinflusst Blinkgeschwindigkeit im Blink-Modus. -3. Logs zeigen Mode, ADC und Delay. diff --git a/tutorial/08-final-combined/solution/.cargo/config.toml b/tutorial/08-final-combined/solution/.cargo/config.toml deleted file mode 100644 index d588bc1..0000000 --- a/tutorial/08-final-combined/solution/.cargo/config.toml +++ /dev/null @@ -1,12 +0,0 @@ -[target.thumbv7m-none-eabi] -runner = "probe-rs run --chip STM32F103C8" -rustflags = [ - "-C", "link-arg=-Tlink.x", - "-C", "link-arg=-Tdefmt.x", -] - -[build] -target = "thumbv7m-none-eabi" - -[env] -DEFMT_LOG = "info" diff --git a/tutorial/08-final-combined/solution/Cargo.toml b/tutorial/08-final-combined/solution/Cargo.toml deleted file mode 100644 index 00ad29e..0000000 --- a/tutorial/08-final-combined/solution/Cargo.toml +++ /dev/null @@ -1,22 +0,0 @@ -[package] -name = "step08_final_combined_solution" -version = "0.1.0" -edition = "2021" - -[dependencies] -cortex-m = "0.7.7" -cortex-m-rt = "0.7.5" -defmt = "0.3.10" -defmt-rtt = "0.4.2" -panic-probe = { version = "0.3.2", features = ["print-defmt"] } -nb = "1.1.0" - -[dependencies.stm32f1xx-hal] -version = "0.11.0" -features = ["rt", "stm32f103", "medium"] - -[profile.release] -codegen-units = 1 -debug = 2 -lto = true -opt-level = "z" diff --git a/tutorial/08-final-combined/solution/memory.x b/tutorial/08-final-combined/solution/memory.x deleted file mode 100644 index 19825e7..0000000 --- a/tutorial/08-final-combined/solution/memory.x +++ /dev/null @@ -1,5 +0,0 @@ -MEMORY -{ - FLASH : ORIGIN = 0x08000000, LENGTH = 64K - RAM : ORIGIN = 0x20000000, LENGTH = 20K -} diff --git a/tutorial/08-final-combined/solution/rust-toolchain.toml b/tutorial/08-final-combined/solution/rust-toolchain.toml deleted file mode 100644 index e2ff99e..0000000 --- a/tutorial/08-final-combined/solution/rust-toolchain.toml +++ /dev/null @@ -1,4 +0,0 @@ -[toolchain] -channel = "stable" -components = ["rustfmt"] -targets = ["thumbv7m-none-eabi"] diff --git a/tutorial/08-final-combined/solution/src/main.rs b/tutorial/08-final-combined/solution/src/main.rs deleted file mode 100644 index 7c08a4e..0000000 --- a/tutorial/08-final-combined/solution/src/main.rs +++ /dev/null @@ -1,83 +0,0 @@ -#![no_std] -#![no_main] - -use cortex_m_rt::entry; -use defmt::info; -use nb::block; -use stm32f1xx_hal::{adc::Adc, pac, prelude::*, timer::Timer}; -use {defmt_rtt as _, panic_probe as _}; - -#[derive(Clone, Copy, PartialEq, Eq)] -enum Mode { - Blinking, - ForcedOff, -} - -fn interval_from_adc(raw: u16) -> u32 { - 100 + (u32::from(raw) * 800 / 4095) -} - -#[entry] -fn main() -> ! { - let cp = cortex_m::Peripherals::take().unwrap(); - let dp = pac::Peripherals::take().unwrap(); - - let mut rcc = dp.RCC.constrain(); - let mut gpioa = dp.GPIOA.split(&mut rcc); - let mut gpioc = dp.GPIOC.split(&mut rcc); - - let mut led = gpioc.pc13.into_push_pull_output(&mut gpioc.crh); - let button = gpioa.pa0.into_pull_up_input(&mut gpioa.crl); - - let mut adc = Adc::new(dp.ADC1, &mut rcc); - let mut analog_pin = gpioa.pa1.into_analog(&mut gpioa.crl); - - let mut tick = Timer::syst(cp.SYST, &rcc.clocks).counter_hz(); - tick.start(100.Hz()).unwrap(); - - let mut mode = Mode::Blinking; - let mut last_pressed = false; - let mut led_on = false; - let mut elapsed_ms: u32 = 0; - - loop { - let pressed = button.is_low(); - if pressed && !last_pressed { - mode = if mode == Mode::Blinking { - info!("mode -> ForcedOff"); - Mode::ForcedOff - } else { - info!("mode -> Blinking"); - Mode::Blinking - }; - } - last_pressed = pressed; - - let raw: u16 = adc.read(&mut analog_pin).unwrap(); - let interval_ms = interval_from_adc(raw); - - match mode { - Mode::Blinking => { - elapsed_ms += 10; - if elapsed_ms >= interval_ms { - elapsed_ms = 0; - led_on = !led_on; - if led_on { - led.set_low(); - } else { - led.set_high(); - } - info!("mode=Blinking adc={} interval_ms={} led_on={}", raw, interval_ms, led_on); - } - } - Mode::ForcedOff => { - led_on = false; - led.set_high(); - elapsed_ms = 0; - info!("mode=ForcedOff adc={} interval_ms={}", raw, interval_ms); - } - } - - block!(tick.wait()).unwrap(); - } -} diff --git a/tutorial/08-final-combined/task/.cargo/config.toml b/tutorial/08-final-combined/task/.cargo/config.toml deleted file mode 100644 index d588bc1..0000000 --- a/tutorial/08-final-combined/task/.cargo/config.toml +++ /dev/null @@ -1,12 +0,0 @@ -[target.thumbv7m-none-eabi] -runner = "probe-rs run --chip STM32F103C8" -rustflags = [ - "-C", "link-arg=-Tlink.x", - "-C", "link-arg=-Tdefmt.x", -] - -[build] -target = "thumbv7m-none-eabi" - -[env] -DEFMT_LOG = "info" diff --git a/tutorial/08-final-combined/task/Cargo.toml b/tutorial/08-final-combined/task/Cargo.toml deleted file mode 100644 index 87555a6..0000000 --- a/tutorial/08-final-combined/task/Cargo.toml +++ /dev/null @@ -1,22 +0,0 @@ -[package] -name = "step08_final_combined_task" -version = "0.1.0" -edition = "2021" - -[dependencies] -cortex-m = "0.7.7" -cortex-m-rt = "0.7.5" -defmt = "0.3.10" -defmt-rtt = "0.4.2" -panic-probe = { version = "0.3.2", features = ["print-defmt"] } -nb = "1.1.0" - -[dependencies.stm32f1xx-hal] -version = "0.11.0" -features = ["rt", "stm32f103", "medium"] - -[profile.release] -codegen-units = 1 -debug = 2 -lto = true -opt-level = "z" diff --git a/tutorial/08-final-combined/task/memory.x b/tutorial/08-final-combined/task/memory.x deleted file mode 100644 index 19825e7..0000000 --- a/tutorial/08-final-combined/task/memory.x +++ /dev/null @@ -1,5 +0,0 @@ -MEMORY -{ - FLASH : ORIGIN = 0x08000000, LENGTH = 64K - RAM : ORIGIN = 0x20000000, LENGTH = 20K -} diff --git a/tutorial/08-final-combined/task/rust-toolchain.toml b/tutorial/08-final-combined/task/rust-toolchain.toml deleted file mode 100644 index e2ff99e..0000000 --- a/tutorial/08-final-combined/task/rust-toolchain.toml +++ /dev/null @@ -1,4 +0,0 @@ -[toolchain] -channel = "stable" -components = ["rustfmt"] -targets = ["thumbv7m-none-eabi"] diff --git a/tutorial/08-final-combined/task/src/main.rs b/tutorial/08-final-combined/task/src/main.rs deleted file mode 100644 index 7bbec09..0000000 --- a/tutorial/08-final-combined/task/src/main.rs +++ /dev/null @@ -1,85 +0,0 @@ -#![no_std] -#![no_main] - -use cortex_m_rt::entry; -use defmt::info; -use nb::block; -use stm32f1xx_hal::{adc::Adc, pac, prelude::*, timer::Timer}; -use {defmt_rtt as _, panic_probe as _}; - -#[derive(Clone, Copy, PartialEq, Eq)] -enum Mode { - Blinking, - ForcedOff, -} - -fn interval_from_adc(raw: u16) -> u32 { - // Map 0..4095 -> 100..900 ms - 100 + (u32::from(raw) * 800 / 4095) -} - -#[entry] -fn main() -> ! { - let cp = cortex_m::Peripherals::take().unwrap(); - let dp = pac::Peripherals::take().unwrap(); - - let mut rcc = dp.RCC.constrain(); - let mut gpioa = dp.GPIOA.split(&mut rcc); - let mut gpioc = dp.GPIOC.split(&mut rcc); - - let mut led = gpioc.pc13.into_push_pull_output(&mut gpioc.crh); - let button = gpioa.pa0.into_pull_up_input(&mut gpioa.crl); - - let mut adc = Adc::new(dp.ADC1, &mut rcc); - let mut analog_pin = gpioa.pa1.into_analog(&mut gpioa.crl); - - // Fast base tick: all app timing derives from this. - let mut tick = Timer::syst(cp.SYST, &rcc.clocks).counter_hz(); - tick.start(100.Hz()).unwrap(); // 10 ms - - let mut mode = Mode::Blinking; - let mut last_pressed = false; - let mut led_on = false; - let mut elapsed_ms: u32 = 0; - - loop { - let pressed = button.is_low(); - if pressed && !last_pressed { - mode = if mode == Mode::Blinking { - info!("mode -> ForcedOff"); - Mode::ForcedOff - } else { - info!("mode -> Blinking"); - Mode::Blinking - }; - } - last_pressed = pressed; - - let raw: u16 = adc.read(&mut analog_pin).unwrap(); - let interval_ms = interval_from_adc(raw); - - match mode { - Mode::Blinking => { - elapsed_ms += 10; - if elapsed_ms >= interval_ms { - elapsed_ms = 0; - led_on = !led_on; - if led_on { - led.set_low(); // active-low - } else { - led.set_high(); - } - info!("mode=Blinking adc={} interval_ms={} led_on={}", raw, interval_ms, led_on); - } - } - Mode::ForcedOff => { - led_on = false; - led.set_high(); - elapsed_ms = 0; - info!("mode=ForcedOff adc={} interval_ms={}", raw, interval_ms); - } - } - - block!(tick.wait()).unwrap(); - } -}