2020-01-25 20:49:11 +00:00
|
|
|
# `cortex-m-quickstart`
|
|
|
|
|
|
|
|
> A template for building applications for ARM Cortex-M microcontrollers
|
|
|
|
|
|
|
|
This project is developed and maintained by the [Cortex-M team][team].
|
|
|
|
|
|
|
|
## Dependencies
|
|
|
|
|
|
|
|
To build embedded programs using this template you'll need:
|
|
|
|
|
|
|
|
- Rust 1.31, 1.30-beta, nightly-2018-09-13 or a newer toolchain. e.g. `rustup
|
|
|
|
default beta`
|
|
|
|
|
|
|
|
- The `cargo generate` subcommand. [Installation
|
|
|
|
instructions](https://github.com/ashleygwilliams/cargo-generate#installation).
|
|
|
|
|
|
|
|
- `rust-std` components (pre-compiled `core` crate) for the ARM Cortex-M
|
|
|
|
targets. Run:
|
|
|
|
|
|
|
|
``` console
|
|
|
|
$ rustup target add thumbv6m-none-eabi thumbv7m-none-eabi thumbv7em-none-eabi thumbv7em-none-eabihf
|
|
|
|
```
|
|
|
|
|
|
|
|
## Using this template
|
|
|
|
|
|
|
|
**NOTE**: This is the very short version that only covers building programs. For
|
|
|
|
the long version, which additionally covers flashing, running and debugging
|
|
|
|
programs, check [the embedded Rust book][book].
|
|
|
|
|
|
|
|
[book]: https://rust-embedded.github.io/book
|
|
|
|
|
|
|
|
0. Before we begin you need to identify some characteristics of the target
|
|
|
|
device as these will be used to configure the project:
|
|
|
|
|
|
|
|
- The ARM core. e.g. Cortex-M3.
|
|
|
|
|
|
|
|
- Does the ARM core include an FPU? Cortex-M4**F** and Cortex-M7**F** cores do.
|
|
|
|
|
|
|
|
- How much Flash memory and RAM does the target device has? e.g. 256 KiB of
|
|
|
|
Flash and 32 KiB of RAM.
|
|
|
|
|
|
|
|
- Where are Flash memory and RAM mapped in the address space? e.g. RAM is
|
|
|
|
commonly located at address `0x2000_0000`.
|
|
|
|
|
|
|
|
You can find this information in the data sheet or the reference manual of your
|
|
|
|
device.
|
|
|
|
|
|
|
|
In this example we'll be using the STM32F3DISCOVERY. This board contains an
|
|
|
|
STM32F303VCT6 microcontroller. This microcontroller has:
|
|
|
|
|
|
|
|
- A Cortex-M4F core that includes a single precision FPU
|
|
|
|
|
|
|
|
- 256 KiB of Flash located at address 0x0800_0000.
|
|
|
|
|
|
|
|
- 40 KiB of RAM located at address 0x2000_0000. (There's another RAM region but
|
|
|
|
for simplicity we'll ignore it).
|
|
|
|
|
|
|
|
1. Instantiate the template.
|
|
|
|
|
|
|
|
``` console
|
|
|
|
$ cargo generate --git https://github.com/rust-embedded/cortex-m-quickstart
|
|
|
|
Project Name: app
|
|
|
|
Creating project called `app`...
|
|
|
|
Done! New project created /tmp/app
|
|
|
|
|
|
|
|
$ cd app
|
|
|
|
```
|
|
|
|
|
|
|
|
2. Set a default compilation target. There are four options as mentioned at the
|
|
|
|
bottom of `.cargo/config`. For the STM32F303VCT6, which has a Cortex-M4F
|
|
|
|
core, we'll pick the `thumbv7em-none-eabihf` target.
|
|
|
|
|
|
|
|
``` console
|
|
|
|
$ tail -n6 .cargo/config
|
|
|
|
```
|
|
|
|
|
|
|
|
``` toml
|
|
|
|
[build]
|
|
|
|
# Pick ONE of these compilation targets
|
|
|
|
# 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)
|
|
|
|
```
|
|
|
|
|
|
|
|
3. Enter the memory region information into the `memory.x` file.
|
|
|
|
|
|
|
|
``` console
|
|
|
|
$ cat memory.x
|
|
|
|
/* Linker script for the STM32F303VCT6 */
|
|
|
|
MEMORY
|
|
|
|
{
|
|
|
|
/* NOTE 1 K = 1 KiBi = 1024 bytes */
|
|
|
|
FLASH : ORIGIN = 0x08000000, LENGTH = 256K
|
|
|
|
RAM : ORIGIN = 0x20000000, LENGTH = 40K
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
4. Build the template application or one of the examples.
|
|
|
|
|
|
|
|
``` console
|
|
|
|
$ cargo build
|
|
|
|
```
|
|
|
|
|
|
|
|
## VS Code
|
|
|
|
|
|
|
|
This template includes launch configurations for debugging CortexM programs with Visual Studio Code located in the `.vscode/` directory.
|
|
|
|
See [.vscode/README.md](./.vscode/README.md) for more information.
|
|
|
|
If you're not using VS Code, you can safely delete the directory from the generated project.
|
|
|
|
|
|
|
|
# License
|
|
|
|
|
|
|
|
This template is 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
|
|
|
|
dual licensed as above, without any additional terms or conditions.
|
|
|
|
|
|
|
|
## Code of Conduct
|
|
|
|
|
|
|
|
Contribution to this crate is organized under the terms of the [Rust Code of
|
|
|
|
Conduct][CoC], the maintainer of this crate, the [Cortex-M team][team], promises
|
|
|
|
to intervene to uphold that code of conduct.
|
|
|
|
|
|
|
|
[CoC]: https://www.rust-lang.org/policies/code-of-conduct
|
|
|
|
[team]: https://github.com/rust-embedded/wg#the-cortex-m-team
|