diff --git a/stm32u5-blinky/.cargo/config.toml b/stm32u5-blinky/.cargo/config.toml deleted file mode 100644 index 2f53554..0000000 --- a/stm32u5-blinky/.cargo/config.toml +++ /dev/null @@ -1,27 +0,0 @@ -[target.'cfg(all(target_arch = "arm", target_os = "none"))'] -# TODO(2) replace `$CHIP` with your chip's name (see `probe-rs chip list` output) -runner = ["probe-rs", "run", "--chip", "$CHIP", "--log-format=oneline"] -# If you have an nRF52, you might also want to add "--allow-erase-all" to the list - -rustflags = [ - "-C", "linker=flip-link", - "-C", "link-arg=-Tlink.x", - "-C", "link-arg=-Tdefmt.x", - # This is needed if your flash or ram addresses are not aligned to 0x10000 in memory.x - # See https://github.com/rust-embedded/cortex-m-quickstart/pull/95 - "-C", "link-arg=--nmagic", -] - -[build] -# TODO(3) Adjust the compilation target. -# Select the correct target for your processor: -# target = "thumbv6m-none-eabi" # Cortex-M0 and Cortex-M0+ -# target = "thumbv7m-none-eabi" # Cortex-M3 -# target = "thumbv7em-none-eabi" # Cortex-M4 and Cortex-M7 (no FPU) -target = "thumbv7em-none-eabihf" # Cortex-M4F and Cortex-M7F (with FPU) - -[alias] -# `cargo rb foo` will expand to `cargo run --bin foo` -rb = "run --bin" -# `cargo rrb foo` will expand to `cargo run --release --bin foo` -rrb = "run --release --bin" diff --git a/stm32u5-blinky/.gitignore b/stm32u5-blinky/.gitignore deleted file mode 100644 index 96ef6c0..0000000 --- a/stm32u5-blinky/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/target -Cargo.lock diff --git a/stm32u5-blinky/.vscode/settings.json b/stm32u5-blinky/.vscode/settings.json deleted file mode 100644 index c1ca1f6..0000000 --- a/stm32u5-blinky/.vscode/settings.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - // override the default setting (`cargo check --all-targets`) which produces the following error - // "can't find crate for `test`" when the default compilation target is a no_std target - // with these changes RA will call `cargo check --bins` on save - "rust-analyzer.check.allTargets": false, - "rust-analyzer.check.extraArgs": [ - "--bins" - ] -} diff --git a/stm32u5-blinky/Cargo.toml b/stm32u5-blinky/Cargo.toml deleted file mode 100644 index 85c657d..0000000 --- a/stm32u5-blinky/Cargo.toml +++ /dev/null @@ -1,85 +0,0 @@ -[package] -# TODO(1) fix `authors` and `name` if you didn't use `cargo-generate` -authors = ["Priec "] -name = "stm32u5-blinky" -edition = "2024" -version = "0.1.0" - - -# To run all the tests via `cargo test` the tests need to be explicitly disabled for the binary targets -# If you use a standard main.rs file the following is sufficient: -# [[bin]] -# name = "stm32u5-blinky" -# test = false - -[[bin]] -name = "bitfield" -path = "src/bin/bitfield.rs" -test = false - -[[bin]] -name = "format" -path = "src/bin/format.rs" -test = false - -[[bin]] -name = "hello" -path = "src/bin/hello.rs" -test = false - -[[bin]] -name = "levels" -path = "src/bin/levels.rs" -test = false - -[[bin]] -name = "overflow" -path = "src/bin/overflow.rs" -test = false - -[[bin]] -name = "panic" -path = "src/bin/panic.rs" -test = false - -[lib] -harness = false - -# needed for each integration test -[[test]] -name = "integration" -harness = false - -[dependencies] -cortex-m = { version = "0.7", features = ["critical-section-single-core"] } -cortex-m-rt = "0.7" -defmt = "1.0" -defmt-rtt = "1.0" -panic-probe = { version = "1.0", features = ["print-defmt"] } -semihosting = "0.1.20" -# TODO(4) enter your HAL here -# some-hal = "1.2.3" - -[dev-dependencies] -defmt-test = "0.3" - -# cargo build/run -[profile.dev] -# default is opt-level = '0', but that makes very -# verbose machine code -opt-level = 's' -# trade compile speed for slightly better optimisations -codegen-units = 1 - -# cargo build/run --release -[profile.release] -# default is opt-level = '3', but that makes quite -# verbose machine code -opt-level = 's' -# trade compile speed for slightly better optimisations -codegen-units = 1 -# Use Link Time Optimisations to further inline things across -# crates -lto = 'fat' -# Leave the debug symbols in (default is no debug info) -debug = 2 diff --git a/stm32u5-blinky/LICENSE-APACHE b/stm32u5-blinky/LICENSE-APACHE deleted file mode 100644 index 11069ed..0000000 --- a/stm32u5-blinky/LICENSE-APACHE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - -APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - -Copyright [yyyy] [name of copyright owner] - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff --git a/stm32u5-blinky/LICENSE-MIT b/stm32u5-blinky/LICENSE-MIT deleted file mode 100644 index 468cd79..0000000 --- a/stm32u5-blinky/LICENSE-MIT +++ /dev/null @@ -1,23 +0,0 @@ -Permission is hereby granted, free of charge, to any -person obtaining a copy of this software and associated -documentation files (the "Software"), to deal in the -Software without restriction, including without -limitation the rights to use, copy, modify, merge, -publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software -is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice -shall be included in all copies or substantial portions -of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF -ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/stm32u5-blinky/README.md b/stm32u5-blinky/README.md deleted file mode 100644 index 05d63c4..0000000 --- a/stm32u5-blinky/README.md +++ /dev/null @@ -1,232 +0,0 @@ -# `app-template` - -> Quickly set up a [`probe-rs`] + [`defmt`] + [`flip-link`] embedded project - -[`probe-rs`]: https://crates.io/crates/probe-rs -[`defmt`]: https://github.com/knurling-rs/defmt -[`flip-link`]: https://github.com/knurling-rs/flip-link - -## Dependencies - -### 1. `flip-link`: - -```bash -cargo install flip-link -``` - -### 2. `probe-rs`: - -Install probe-rs by following the instructions at . - -### 3. [`cargo-generate`]: - -```bash -cargo install cargo-generate -``` - -[`cargo-generate`]: https://crates.io/crates/cargo-generate - -> *Note:* You can also just clone this repository instead of using `cargo-generate`, but this involves additional manual adjustments. - -## Setup - -### 1. Initialize the project template - -```bash -cargo generate \ - --git https://github.com/knurling-rs/app-template \ - --branch main \ - --name my-app -``` - -If you look into your new `my-app` folder, you'll find that there are a few `TODO`s in the files marking the properties you need to set. - -Let's walk through them together now. - -### 2. Set `probe-rs` chip - -Pick a chip from ` probe-rs chip list` and enter it into `.cargo/config.toml`. - -If, for example, you have a nRF52840 Development Kit as used in one of [our exercises], replace `{{chip}}` with `nRF52840_xxAA`. - -[our workshops]: https://rust-exercises.ferrous-systems.com - -```diff - # .cargo/config.toml --runner = ["probe-rs", "run", "--chip", "$CHIP", "--log-format=oneline"] -+runner = ["probe-rs", "run", "--chip", "nRF52840_xxAA", "--log-format=oneline"] -``` - -### 3. Adjust the compilation target - -In `.cargo/config.toml`, pick the right compilation target for your board. - -```diff - # .cargo/config.toml - [build] --target = "thumbv6m-none-eabi" # Cortex-M0 and Cortex-M0+ --# target = "thumbv7m-none-eabi" # Cortex-M3 --# target = "thumbv7em-none-eabi" # Cortex-M4 and Cortex-M7 (no FPU) --# target = "thumbv7em-none-eabihf" # Cortex-M4F and Cortex-M7F (with FPU) -+target = "thumbv7em-none-eabihf" # Cortex-M4F (with FPU) -``` - -Add the target with `rustup`. - -```bash -rustup target add thumbv7em-none-eabihf -``` - -### 4. Add a HAL as a dependency - -In `Cargo.toml`, list the Hardware Abstraction Layer (HAL) for your board as a dependency. - -For the nRF52840 you'll want to use the [`nrf52840-hal`]. - -[`nrf52840-hal`]: https://crates.io/crates/nrf52840-hal - -```diff - # Cargo.toml - [dependencies] --# some-hal = "1.2.3" -+nrf52840-hal = "0.14.0" -``` - -⚠️ Note for RP2040 users ⚠️ - -You will need to not just specify the `rp-hal` HAL, but a BSP (board support crate) which includes a second stage bootloader. Please find a list of available BSPs [here](https://github.com/rp-rs/rp-hal-boards#packages). - -### 5. Import your HAL - -Now that you have selected a HAL, fix the HAL import in `src/lib.rs` - -```diff - // my-app/src/lib.rs --// use some_hal as _; // memory layout -+use nrf52840_hal as _; // memory layout -``` - -### (6. Get a linker script) - -Some HAL crates require that you manually copy over a file called `memory.x` from the HAL to the root of your project. For nrf52840-hal, this is done automatically so no action is needed. For other HAL crates, see their documentation on where to find an example file. - -The `memory.x` file should look something like: - -```text -MEMORY -{ - FLASH : ORIGIN = 0x00000000, LENGTH = 1024K - RAM : ORIGIN = 0x20000000, LENGTH = 256K -} -``` - -The `memory.x` file is included in the `cortex-m-rt` linker script `link.x`, and so `link.x` is the one you should tell `rustc` to use (see the `.cargo/config.toml` file where we do that). - -### 7. Run! - -You are now all set to `cargo-run` your first `defmt`-powered application! -There are some examples in the `src/bin` directory. - -Start by `cargo run`-ning `my-app/src/bin/hello.rs`: - -```console -$ # `rb` is an alias for `run --bin` -$ cargo rb hello - Finished `dev` profile [optimized + debuginfo] target(s) in 0.01s - Running `probe-rs run --chip nrf52840_xxaa --log-format=oneline target/thumbv6m-none-eabi/debug/hello` - Erasing ✔ 100% [####################] 8.00 KiB @ 15.79 KiB/s (took 1s) - Programming ✔ 100% [####################] 8.00 KiB @ 13.19 KiB/s (took 1s) Finished in 1.11s -Hello, world! - -$ echo $? -0 -``` - -If you're running out of memory (`flip-link` bails with an overflow error), you can decrease the size of the device memory buffer by setting the `DEFMT_RTT_BUFFER_SIZE` environment variable. The default value is 1024 bytes, and powers of two should be used for optimal performance: - -```console -$ DEFMT_RTT_BUFFER_SIZE=64 cargo rb hello -``` - -### (8. Set `rust-analyzer.linkedProjects`) - -If you are using [rust-analyzer] with VS Code for IDE-like features you can add following configuration to your `.vscode/settings.json` to make it work transparently across workspaces. Find the details of this option in the [RA docs]. - -```json -{ - "rust-analyzer.linkedProjects": [ - "Cargo.toml", - "firmware/Cargo.toml", - ] -} -``` - -[RA docs]: https://rust-analyzer.github.io/manual.html#configuration -[rust-analyzer]: https://rust-analyzer.github.io/ - -## Running tests - -The template comes configured for running unit tests and integration tests on the target. - -Unit tests reside in the library crate and can test private API; the initial set of unit tests are in `src/lib.rs`. -`cargo test --lib` will run those unit tests. - -```console -$ cargo test --lib - Compiling example v0.1.0 (./knurling-rs/example) - Finished `test` profile [optimized + debuginfo] target(s) in 0.15s - Running unittests src/lib.rs (target/thumbv6m-none-eabi/debug/deps/example-2b0d0e25d141bf57) - Erasing ✔ 100% [####################] 8.00 KiB @ 15.99 KiB/s (took 1s) - Programming ✔ 100% [####################] 8.00 KiB @ 13.33 KiB/s (took 1s) Finished in 1.10s -(1/1) running `it_works`... -all tests passed! -``` - -Integration tests reside in the `tests` directory; the initial set of integration tests are in `tests/integration.rs`. -`cargo test --test integration` will run those integration tests. -Note that the argument of the `--test` flag must match the name of the test file in the `tests` directory. - -```console -$ cargo test --test integration - Compiling example v0.1.0 (./knurling-rs/example) - Finished `test` profile [optimized + debuginfo] target(s) in 0.10s - Running tests/integration.rs (target/thumbv6m-none-eabi/debug/deps/integration-aaaff41151f6a722) - Erasing ✔ 100% [####################] 8.00 KiB @ 16.03 KiB/s (took 0s) - Programming ✔ 100% [####################] 8.00 KiB @ 13.19 KiB/s (took 1s) Finished in 1.11s -(1/1) running `it_works`... -all tests passed! -``` - -Note that to add a new test file to the `tests` directory you also need to add a new `[[test]]` section to `Cargo.toml`. - -To run all the tests via `cargo test` the tests need to be explicitly disabled for all the existing binary targets. -See `Cargo.toml` for details on how to do this. - -## Support - -`app-template` is part of the [Knurling] project, [Ferrous Systems]' effort at -improving tooling used to develop for embedded systems. - -If you think that our work is useful, consider sponsoring it via [GitHub -Sponsors]. - -## License - -Licensed under either of - -- Apache License, Version 2.0 ([LICENSE-APACHE](LICENSE-APACHE) or - http://www.apache.org/licenses/LICENSE-2.0) - -- MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT) - -at your option. - -### Contribution - -Unless you explicitly state otherwise, any contribution intentionally submitted -for inclusion in the work by you, as defined in the Apache-2.0 license, shall be -licensed as above, without any additional terms or conditions. - -[Knurling]: https://knurling.ferrous-systems.com -[Ferrous Systems]: https://ferrous-systems.com/ -[GitHub Sponsors]: https://github.com/sponsors/knurling-rs diff --git a/stm32u5-blinky/memory.x b/stm32u5-blinky/memory.x deleted file mode 100644 index 89f96e1..0000000 --- a/stm32u5-blinky/memory.x +++ /dev/null @@ -1,13 +0,0 @@ -/* memory.x - STM32U575ZITxQ memory layout */ - -/* Flash: 2 MB starting at 0x08000000 */ -/* SRAM1 + SRAM2 + SRAM3 total 786 KB starting at 0x20000000 */ - -MEMORY -{ - FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 2048K - RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 786K -} - -/* provide stack start symbol (end of RAM) */ -_stack_start = ORIGIN(RAM) + LENGTH(RAM); diff --git a/stm32u5-blinky/src/bin/bitfield.rs b/stm32u5-blinky/src/bin/bitfield.rs deleted file mode 100644 index 40479dd..0000000 --- a/stm32u5-blinky/src/bin/bitfield.rs +++ /dev/null @@ -1,13 +0,0 @@ -#![no_main] -#![no_std] - -use stm32u5_blinky as _; // global logger + panicking-behavior + memory layout - -#[cortex_m_rt::entry] -fn main() -> ! { - // value of the FREQUENCY register (nRF52840 device; RADIO peripheral) - let frequency: u32 = 276; - defmt::println!("FREQUENCY: {0=0..7}, MAP: {0=8..9}", frequency); - - stm32u5_blinky::exit() -} diff --git a/stm32u5-blinky/src/bin/format.rs b/stm32u5-blinky/src/bin/format.rs deleted file mode 100644 index fc7748e..0000000 --- a/stm32u5-blinky/src/bin/format.rs +++ /dev/null @@ -1,29 +0,0 @@ -#![no_main] -#![no_std] - -use stm32u5_blinky as _; // global logger + panicking-behavior + memory layout -use defmt::Format; // <- derive attribute - -#[derive(Format)] -struct S1 { - x: u8, - y: T, -} - -#[derive(Format)] -struct S2 { - z: u8, -} - -#[cortex_m_rt::entry] -fn main() -> ! { - let s = S1 { - x: 42, - y: S2 { z: 43 }, - }; - defmt::println!("s={:?}", s); - let x = 42; - defmt::println!("x={=u8}", x); - - stm32u5_blinky::exit() -} diff --git a/stm32u5-blinky/src/bin/hello.rs b/stm32u5-blinky/src/bin/hello.rs deleted file mode 100644 index 918e123..0000000 --- a/stm32u5-blinky/src/bin/hello.rs +++ /dev/null @@ -1,11 +0,0 @@ -#![no_main] -#![no_std] - -use stm32u5_blinky as _; // global logger + panicking-behavior + memory layout - -#[cortex_m_rt::entry] -fn main() -> ! { - defmt::println!("Hello, world!"); - - stm32u5_blinky::exit() -} diff --git a/stm32u5-blinky/src/bin/levels.rs b/stm32u5-blinky/src/bin/levels.rs deleted file mode 100644 index 2955f63..0000000 --- a/stm32u5-blinky/src/bin/levels.rs +++ /dev/null @@ -1,17 +0,0 @@ -#![no_main] -#![no_std] - -use stm32u5_blinky as _; // global logger + panicking-behavior + memory layout - -#[cortex_m_rt::entry] -fn main() -> ! { - // try setting the DEFMT_LOG environment variable - // e.g. `export DEFMT_LOG=info` or `DEFMT_LOG=trace cargo rb levels` - defmt::info!("info"); - defmt::trace!("trace"); - defmt::warn!("warn"); - defmt::debug!("debug"); - defmt::error!("error"); - - stm32u5_blinky::exit() -} diff --git a/stm32u5-blinky/src/bin/overflow.rs b/stm32u5-blinky/src/bin/overflow.rs deleted file mode 100644 index a21f54c..0000000 --- a/stm32u5-blinky/src/bin/overflow.rs +++ /dev/null @@ -1,28 +0,0 @@ -#![no_main] -#![no_std] - -use stm32u5_blinky as _; // global logger + panicking-behavior + memory layout - -#[cortex_m_rt::entry] -fn main() -> ! { - ack(10, 10); - stm32u5_blinky::exit() -} - -fn ack(m: u32, n: u32) -> u32 { - // waste stack space to trigger a stack overflow - let mut buffer = [0u8; 16 * 1024]; - // estimate of the Stack Pointer register - let sp = buffer.as_mut_ptr(); - defmt::println!("ack(m={=u32}, n={=u32}, SP={:x})", m, n, sp); - - if m == 0 { - n + 1 - } else { - if n == 0 { - ack(m - 1, 1) - } else { - ack(m - 1, ack(m, n - 1)) - } - } -} diff --git a/stm32u5-blinky/src/bin/panic.rs b/stm32u5-blinky/src/bin/panic.rs deleted file mode 100644 index 71f39e9..0000000 --- a/stm32u5-blinky/src/bin/panic.rs +++ /dev/null @@ -1,11 +0,0 @@ -#![no_main] -#![no_std] - -use stm32u5_blinky as _; // global logger + panicking-behavior + memory layout - -#[cortex_m_rt::entry] -fn main() -> ! { - defmt::println!("main"); - - defmt::panic!() -} diff --git a/stm32u5-blinky/src/lib.rs b/stm32u5-blinky/src/lib.rs deleted file mode 100644 index deac2a0..0000000 --- a/stm32u5-blinky/src/lib.rs +++ /dev/null @@ -1,46 +0,0 @@ -#![no_main] -#![no_std] - -use defmt_rtt as _; // global logger - -// TODO(5) adjust HAL import -// use some_hal as _; // memory layout - -use panic_probe as _; - -// same panicking *behavior* as `panic-probe` but doesn't print a panic message -// this prevents the panic message being printed *twice* when `defmt::panic` is invoked -#[defmt::panic_handler] -fn panic() -> ! { - cortex_m::asm::udf() -} - -/// Terminates the application and makes a semihosting-capable debug tool exit -/// with status code 0. -pub fn exit() -> ! { - semihosting::process::exit(0); -} - -/// Hardfault handler. -/// -/// Terminates the application and makes a semihosting-capable debug tool exit -/// with an error. This seems better than the default, which is to spin in a -/// loop. -#[cortex_m_rt::exception] -unsafe fn HardFault(_frame: &cortex_m_rt::ExceptionFrame) -> ! { - semihosting::process::exit(1); -} - -// defmt-test 0.3.0 has the limitation that this `#[tests]` attribute can only be used -// once within a crate. the module can be in any file but there can only be at most -// one `#[tests]` module in this library crate -#[cfg(test)] -#[defmt_test::tests] -mod unit_tests { - use defmt::assert; - - #[test] - fn it_works() { - assert!(true) - } -} diff --git a/stm32u5-blinky/tests/integration.rs b/stm32u5-blinky/tests/integration.rs deleted file mode 100644 index 1f33de6..0000000 --- a/stm32u5-blinky/tests/integration.rs +++ /dev/null @@ -1,16 +0,0 @@ -#![no_std] -#![no_main] - -use stm32u5_blinky as _; // memory layout + panic handler - -// See https://crates.io/crates/defmt-test/0.3.0 for more documentation (e.g. about the 'state' -// feature) -#[defmt_test::tests] -mod tests { - use defmt::assert; - - #[test] - fn it_works() { - assert!(true) - } -} diff --git a/tim2/.cargo/config.toml b/tim2/.cargo/config.toml deleted file mode 100644 index 2f53554..0000000 --- a/tim2/.cargo/config.toml +++ /dev/null @@ -1,27 +0,0 @@ -[target.'cfg(all(target_arch = "arm", target_os = "none"))'] -# TODO(2) replace `$CHIP` with your chip's name (see `probe-rs chip list` output) -runner = ["probe-rs", "run", "--chip", "$CHIP", "--log-format=oneline"] -# If you have an nRF52, you might also want to add "--allow-erase-all" to the list - -rustflags = [ - "-C", "linker=flip-link", - "-C", "link-arg=-Tlink.x", - "-C", "link-arg=-Tdefmt.x", - # This is needed if your flash or ram addresses are not aligned to 0x10000 in memory.x - # See https://github.com/rust-embedded/cortex-m-quickstart/pull/95 - "-C", "link-arg=--nmagic", -] - -[build] -# TODO(3) Adjust the compilation target. -# Select the correct target for your processor: -# target = "thumbv6m-none-eabi" # Cortex-M0 and Cortex-M0+ -# target = "thumbv7m-none-eabi" # Cortex-M3 -# target = "thumbv7em-none-eabi" # Cortex-M4 and Cortex-M7 (no FPU) -target = "thumbv7em-none-eabihf" # Cortex-M4F and Cortex-M7F (with FPU) - -[alias] -# `cargo rb foo` will expand to `cargo run --bin foo` -rb = "run --bin" -# `cargo rrb foo` will expand to `cargo run --release --bin foo` -rrb = "run --release --bin" diff --git a/tim2/.gitignore b/tim2/.gitignore deleted file mode 100644 index 96ef6c0..0000000 --- a/tim2/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/target -Cargo.lock diff --git a/tim2/Cargo.toml b/tim2/Cargo.toml deleted file mode 100644 index fb82df7..0000000 --- a/tim2/Cargo.toml +++ /dev/null @@ -1,55 +0,0 @@ -[package] -# TODO(1) fix `authors` and `name` if you didn't use `cargo-generate` -authors = ["Priec "] -name = "stm32u5-tim2" -edition = "2024" -version = "0.1.0" - -[[bin]] -name = "main" -path = "src/bin/main.rs" -test = false - -[lib] -harness = false - -# needed for each integration test -[[test]] -name = "integration" -harness = false - -[dependencies] -cortex-m = { version = "0.7", features = ["critical-section-single-core"] } -cortex-m-rt = "0.7" -defmt = "1.0" -defmt-rtt = "1.0" -panic-halt = "1.0.0" -panic-probe = { version = "1.0", features = ["print-defmt"] } -semihosting = "0.1.20" -stm32u5 = { version = "0.16.0", features = ["rt", "stm32u575"] } -# TODO(4) enter your HAL here -# some-hal = "1.2.3" - -[dev-dependencies] -defmt-test = "0.3" - -# cargo build/run -[profile.dev] -# default is opt-level = '0', but that makes very -# verbose machine code -opt-level = 's' -# trade compile speed for slightly better optimisations -codegen-units = 1 - -# cargo build/run --release -[profile.release] -# default is opt-level = '3', but that makes quite -# verbose machine code -opt-level = 's' -# trade compile speed for slightly better optimisations -codegen-units = 1 -# Use Link Time Optimisations to further inline things across -# crates -lto = 'fat' -# Leave the debug symbols in (default is no debug info) -debug = 2 diff --git a/tim2/LICENSE-APACHE b/tim2/LICENSE-APACHE deleted file mode 100644 index 11069ed..0000000 --- a/tim2/LICENSE-APACHE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - -APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - -Copyright [yyyy] [name of copyright owner] - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff --git a/tim2/LICENSE-MIT b/tim2/LICENSE-MIT deleted file mode 100644 index 468cd79..0000000 --- a/tim2/LICENSE-MIT +++ /dev/null @@ -1,23 +0,0 @@ -Permission is hereby granted, free of charge, to any -person obtaining a copy of this software and associated -documentation files (the "Software"), to deal in the -Software without restriction, including without -limitation the rights to use, copy, modify, merge, -publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software -is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice -shall be included in all copies or substantial portions -of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF -ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/tim2/README.md b/tim2/README.md deleted file mode 100644 index 05d63c4..0000000 --- a/tim2/README.md +++ /dev/null @@ -1,232 +0,0 @@ -# `app-template` - -> Quickly set up a [`probe-rs`] + [`defmt`] + [`flip-link`] embedded project - -[`probe-rs`]: https://crates.io/crates/probe-rs -[`defmt`]: https://github.com/knurling-rs/defmt -[`flip-link`]: https://github.com/knurling-rs/flip-link - -## Dependencies - -### 1. `flip-link`: - -```bash -cargo install flip-link -``` - -### 2. `probe-rs`: - -Install probe-rs by following the instructions at . - -### 3. [`cargo-generate`]: - -```bash -cargo install cargo-generate -``` - -[`cargo-generate`]: https://crates.io/crates/cargo-generate - -> *Note:* You can also just clone this repository instead of using `cargo-generate`, but this involves additional manual adjustments. - -## Setup - -### 1. Initialize the project template - -```bash -cargo generate \ - --git https://github.com/knurling-rs/app-template \ - --branch main \ - --name my-app -``` - -If you look into your new `my-app` folder, you'll find that there are a few `TODO`s in the files marking the properties you need to set. - -Let's walk through them together now. - -### 2. Set `probe-rs` chip - -Pick a chip from ` probe-rs chip list` and enter it into `.cargo/config.toml`. - -If, for example, you have a nRF52840 Development Kit as used in one of [our exercises], replace `{{chip}}` with `nRF52840_xxAA`. - -[our workshops]: https://rust-exercises.ferrous-systems.com - -```diff - # .cargo/config.toml --runner = ["probe-rs", "run", "--chip", "$CHIP", "--log-format=oneline"] -+runner = ["probe-rs", "run", "--chip", "nRF52840_xxAA", "--log-format=oneline"] -``` - -### 3. Adjust the compilation target - -In `.cargo/config.toml`, pick the right compilation target for your board. - -```diff - # .cargo/config.toml - [build] --target = "thumbv6m-none-eabi" # Cortex-M0 and Cortex-M0+ --# target = "thumbv7m-none-eabi" # Cortex-M3 --# target = "thumbv7em-none-eabi" # Cortex-M4 and Cortex-M7 (no FPU) --# target = "thumbv7em-none-eabihf" # Cortex-M4F and Cortex-M7F (with FPU) -+target = "thumbv7em-none-eabihf" # Cortex-M4F (with FPU) -``` - -Add the target with `rustup`. - -```bash -rustup target add thumbv7em-none-eabihf -``` - -### 4. Add a HAL as a dependency - -In `Cargo.toml`, list the Hardware Abstraction Layer (HAL) for your board as a dependency. - -For the nRF52840 you'll want to use the [`nrf52840-hal`]. - -[`nrf52840-hal`]: https://crates.io/crates/nrf52840-hal - -```diff - # Cargo.toml - [dependencies] --# some-hal = "1.2.3" -+nrf52840-hal = "0.14.0" -``` - -⚠️ Note for RP2040 users ⚠️ - -You will need to not just specify the `rp-hal` HAL, but a BSP (board support crate) which includes a second stage bootloader. Please find a list of available BSPs [here](https://github.com/rp-rs/rp-hal-boards#packages). - -### 5. Import your HAL - -Now that you have selected a HAL, fix the HAL import in `src/lib.rs` - -```diff - // my-app/src/lib.rs --// use some_hal as _; // memory layout -+use nrf52840_hal as _; // memory layout -``` - -### (6. Get a linker script) - -Some HAL crates require that you manually copy over a file called `memory.x` from the HAL to the root of your project. For nrf52840-hal, this is done automatically so no action is needed. For other HAL crates, see their documentation on where to find an example file. - -The `memory.x` file should look something like: - -```text -MEMORY -{ - FLASH : ORIGIN = 0x00000000, LENGTH = 1024K - RAM : ORIGIN = 0x20000000, LENGTH = 256K -} -``` - -The `memory.x` file is included in the `cortex-m-rt` linker script `link.x`, and so `link.x` is the one you should tell `rustc` to use (see the `.cargo/config.toml` file where we do that). - -### 7. Run! - -You are now all set to `cargo-run` your first `defmt`-powered application! -There are some examples in the `src/bin` directory. - -Start by `cargo run`-ning `my-app/src/bin/hello.rs`: - -```console -$ # `rb` is an alias for `run --bin` -$ cargo rb hello - Finished `dev` profile [optimized + debuginfo] target(s) in 0.01s - Running `probe-rs run --chip nrf52840_xxaa --log-format=oneline target/thumbv6m-none-eabi/debug/hello` - Erasing ✔ 100% [####################] 8.00 KiB @ 15.79 KiB/s (took 1s) - Programming ✔ 100% [####################] 8.00 KiB @ 13.19 KiB/s (took 1s) Finished in 1.11s -Hello, world! - -$ echo $? -0 -``` - -If you're running out of memory (`flip-link` bails with an overflow error), you can decrease the size of the device memory buffer by setting the `DEFMT_RTT_BUFFER_SIZE` environment variable. The default value is 1024 bytes, and powers of two should be used for optimal performance: - -```console -$ DEFMT_RTT_BUFFER_SIZE=64 cargo rb hello -``` - -### (8. Set `rust-analyzer.linkedProjects`) - -If you are using [rust-analyzer] with VS Code for IDE-like features you can add following configuration to your `.vscode/settings.json` to make it work transparently across workspaces. Find the details of this option in the [RA docs]. - -```json -{ - "rust-analyzer.linkedProjects": [ - "Cargo.toml", - "firmware/Cargo.toml", - ] -} -``` - -[RA docs]: https://rust-analyzer.github.io/manual.html#configuration -[rust-analyzer]: https://rust-analyzer.github.io/ - -## Running tests - -The template comes configured for running unit tests and integration tests on the target. - -Unit tests reside in the library crate and can test private API; the initial set of unit tests are in `src/lib.rs`. -`cargo test --lib` will run those unit tests. - -```console -$ cargo test --lib - Compiling example v0.1.0 (./knurling-rs/example) - Finished `test` profile [optimized + debuginfo] target(s) in 0.15s - Running unittests src/lib.rs (target/thumbv6m-none-eabi/debug/deps/example-2b0d0e25d141bf57) - Erasing ✔ 100% [####################] 8.00 KiB @ 15.99 KiB/s (took 1s) - Programming ✔ 100% [####################] 8.00 KiB @ 13.33 KiB/s (took 1s) Finished in 1.10s -(1/1) running `it_works`... -all tests passed! -``` - -Integration tests reside in the `tests` directory; the initial set of integration tests are in `tests/integration.rs`. -`cargo test --test integration` will run those integration tests. -Note that the argument of the `--test` flag must match the name of the test file in the `tests` directory. - -```console -$ cargo test --test integration - Compiling example v0.1.0 (./knurling-rs/example) - Finished `test` profile [optimized + debuginfo] target(s) in 0.10s - Running tests/integration.rs (target/thumbv6m-none-eabi/debug/deps/integration-aaaff41151f6a722) - Erasing ✔ 100% [####################] 8.00 KiB @ 16.03 KiB/s (took 0s) - Programming ✔ 100% [####################] 8.00 KiB @ 13.19 KiB/s (took 1s) Finished in 1.11s -(1/1) running `it_works`... -all tests passed! -``` - -Note that to add a new test file to the `tests` directory you also need to add a new `[[test]]` section to `Cargo.toml`. - -To run all the tests via `cargo test` the tests need to be explicitly disabled for all the existing binary targets. -See `Cargo.toml` for details on how to do this. - -## Support - -`app-template` is part of the [Knurling] project, [Ferrous Systems]' effort at -improving tooling used to develop for embedded systems. - -If you think that our work is useful, consider sponsoring it via [GitHub -Sponsors]. - -## License - -Licensed under either of - -- Apache License, Version 2.0 ([LICENSE-APACHE](LICENSE-APACHE) or - http://www.apache.org/licenses/LICENSE-2.0) - -- MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT) - -at your option. - -### Contribution - -Unless you explicitly state otherwise, any contribution intentionally submitted -for inclusion in the work by you, as defined in the Apache-2.0 license, shall be -licensed as above, without any additional terms or conditions. - -[Knurling]: https://knurling.ferrous-systems.com -[Ferrous Systems]: https://ferrous-systems.com/ -[GitHub Sponsors]: https://github.com/sponsors/knurling-rs diff --git a/tim2/memory.x b/tim2/memory.x deleted file mode 100644 index 89f96e1..0000000 --- a/tim2/memory.x +++ /dev/null @@ -1,13 +0,0 @@ -/* memory.x - STM32U575ZITxQ memory layout */ - -/* Flash: 2 MB starting at 0x08000000 */ -/* SRAM1 + SRAM2 + SRAM3 total 786 KB starting at 0x20000000 */ - -MEMORY -{ - FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 2048K - RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 786K -} - -/* provide stack start symbol (end of RAM) */ -_stack_start = ORIGIN(RAM) + LENGTH(RAM); diff --git a/tim2/src/bin/main.rs b/tim2/src/bin/main.rs deleted file mode 100644 index bbd35c1..0000000 --- a/tim2/src/bin/main.rs +++ /dev/null @@ -1,70 +0,0 @@ -#![no_std] -#![no_main] - -use cortex_m_rt::entry; -use panic_halt as _; -use stm32u5::stm32u575 as pac; -use pac::interrupt; // Import the interrupt enum - -// Timer frequency constants -const PRESCALER: u16 = 0; -const PULSE1_VALUE: u32 = 50000; // For 800 Hz toggle - -#[entry] -fn main() -> ! { - let dp = pac::Peripherals::take().unwrap(); - dp.RCC.apb1enr1().modify(|_, w| w.tim2en().set_bit()); - - // Enable GPIOA clock for TIM2_CH4 (PA3) - dp.RCC.ahb2enr1().modify(|_, w| w.gpioaen().set_bit()); - - // Configure PA3 as AF1 (TIM2_CH4) - dp.GPIOA.moder().modify(|_, w| w.mode3().alternate()); - dp.GPIOA.afrl().modify(|_, w| w.afrel3().af1()); - - // Configure TIM2 - dp.TIM2.psc().write(|w| unsafe { w.bits(PRESCALER as u32) }); - dp.TIM2.arr().write(|w| unsafe { w.bits(0xFFFF_FFFF) }); // Max for 32-bit timer - - // Configure CH4 for output compare toggle mode - dp.TIM2.ccmr2_output().modify(|_, w| unsafe { - w.cc4s().bits(0b00) // CH4 as output - .oc4m().bits(0b011) // Toggle mode - }); - - // Set initial compare value - dp.TIM2.ccr4().write(|w| unsafe { w.bits(PULSE1_VALUE) }); - - // Enable CH4 output - dp.TIM2.ccer().modify(|_, w| w.cc4e().set_bit()); - - // Enable CH4 interrupt - dp.TIM2.dier().modify(|_, w| w.cc4ie().set_bit()); - - // Enable TIM2 interrupt in NVIC - unsafe { - cortex_m::peripheral::NVIC::unmask(pac::Interrupt::TIM2); - } - - // Start timer - dp.TIM2.cr1().modify(|_, w| w.cen().set_bit()); - - loop { - cortex_m::asm::wfi(); // Wait for interrupt - } -} - -#[interrupt] -fn TIM2() { - unsafe { - let tim2 = &(*pac::TIM2::ptr()); - if tim2.sr().read().cc4if().bit_is_set() { - tim2.sr().modify(|_, w| w.cc4if().clear_bit()); - - // Use wrapping arithmetic - let current = tim2.ccr4().read().bits(); - let next = current.wrapping_add(PULSE1_VALUE); - tim2.ccr4().write(|w| w.bits(next)); - } - } -} diff --git a/tim2/src/lib.rs b/tim2/src/lib.rs deleted file mode 100644 index deac2a0..0000000 --- a/tim2/src/lib.rs +++ /dev/null @@ -1,46 +0,0 @@ -#![no_main] -#![no_std] - -use defmt_rtt as _; // global logger - -// TODO(5) adjust HAL import -// use some_hal as _; // memory layout - -use panic_probe as _; - -// same panicking *behavior* as `panic-probe` but doesn't print a panic message -// this prevents the panic message being printed *twice* when `defmt::panic` is invoked -#[defmt::panic_handler] -fn panic() -> ! { - cortex_m::asm::udf() -} - -/// Terminates the application and makes a semihosting-capable debug tool exit -/// with status code 0. -pub fn exit() -> ! { - semihosting::process::exit(0); -} - -/// Hardfault handler. -/// -/// Terminates the application and makes a semihosting-capable debug tool exit -/// with an error. This seems better than the default, which is to spin in a -/// loop. -#[cortex_m_rt::exception] -unsafe fn HardFault(_frame: &cortex_m_rt::ExceptionFrame) -> ! { - semihosting::process::exit(1); -} - -// defmt-test 0.3.0 has the limitation that this `#[tests]` attribute can only be used -// once within a crate. the module can be in any file but there can only be at most -// one `#[tests]` module in this library crate -#[cfg(test)] -#[defmt_test::tests] -mod unit_tests { - use defmt::assert; - - #[test] - fn it_works() { - assert!(true) - } -} diff --git a/tim2/tests/integration.rs b/tim2/tests/integration.rs deleted file mode 100644 index 1f33de6..0000000 --- a/tim2/tests/integration.rs +++ /dev/null @@ -1,16 +0,0 @@ -#![no_std] -#![no_main] - -use stm32u5_blinky as _; // memory layout + panic handler - -// See https://crates.io/crates/defmt-test/0.3.0 for more documentation (e.g. about the 'state' -// feature) -#[defmt_test::tests] -mod tests { - use defmt::assert; - - #[test] - fn it_works() { - assert!(true) - } -}