Initial commit.
This commit is contained in:
commit
5df444848c
|
@ -0,0 +1,22 @@
|
||||||
|
[package]
|
||||||
|
authors = ["imi415 <imi415@imi.moe>"]
|
||||||
|
edition = "2018"
|
||||||
|
readme = "README.md"
|
||||||
|
name = "lpc55s69-hello"
|
||||||
|
version = "0.1.0"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
cortex-m = "0.7.5"
|
||||||
|
cortex-m-rt = "0.7.1"
|
||||||
|
cortex-m-semihosting = "0.5.0"
|
||||||
|
panic-halt = "0.2.0"
|
||||||
|
|
||||||
|
[[bin]]
|
||||||
|
name = "lpc55s69-hello"
|
||||||
|
test = false
|
||||||
|
bench = false
|
||||||
|
|
||||||
|
[profile.release]
|
||||||
|
codegen-units = 1
|
||||||
|
debug = true
|
||||||
|
lto = true
|
|
@ -0,0 +1,135 @@
|
||||||
|
# `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
|
|
@ -0,0 +1,31 @@
|
||||||
|
//! This build script copies the `memory.x` file from the crate root into
|
||||||
|
//! a directory where the linker can always find it at build time.
|
||||||
|
//! For many projects this is optional, as the linker always searches the
|
||||||
|
//! project root directory -- wherever `Cargo.toml` is. However, if you
|
||||||
|
//! are using a workspace or have a more complicated build setup, this
|
||||||
|
//! build script becomes required. Additionally, by requesting that
|
||||||
|
//! Cargo re-run the build script whenever `memory.x` is changed,
|
||||||
|
//! updating `memory.x` ensures a rebuild of the application with the
|
||||||
|
//! new memory settings.
|
||||||
|
|
||||||
|
use std::env;
|
||||||
|
use std::fs::File;
|
||||||
|
use std::io::Write;
|
||||||
|
use std::path::PathBuf;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
// Put `memory.x` in our output directory and ensure it's
|
||||||
|
// on the linker search path.
|
||||||
|
let out = &PathBuf::from(env::var_os("OUT_DIR").unwrap());
|
||||||
|
File::create(out.join("memory.x"))
|
||||||
|
.unwrap()
|
||||||
|
.write_all(include_bytes!("memory.x"))
|
||||||
|
.unwrap();
|
||||||
|
println!("cargo:rustc-link-search={}", out.display());
|
||||||
|
|
||||||
|
// By default, Cargo will re-run a build script whenever
|
||||||
|
// any file in the project changes. By specifying `memory.x`
|
||||||
|
// here, we ensure the build script is only re-run when
|
||||||
|
// `memory.x` is changed.
|
||||||
|
println!("cargo:rerun-if-changed=memory.x");
|
||||||
|
}
|
|
@ -0,0 +1,9 @@
|
||||||
|
MEMORY
|
||||||
|
{
|
||||||
|
FLASH : ORIGIN = 0x00000000, LENGTH = 456K
|
||||||
|
RAM : ORIGIN = 0x20000000, LENGTH = 204K
|
||||||
|
}
|
||||||
|
|
||||||
|
_stack_start = ORIGIN(RAM) + LENGTH(RAM);
|
||||||
|
|
||||||
|
_stext = ORIGIN(FLASH) + 0x400;
|
|
@ -0,0 +1,16 @@
|
||||||
|
#![no_std]
|
||||||
|
#![no_main]
|
||||||
|
|
||||||
|
use panic_halt as _;
|
||||||
|
|
||||||
|
use cortex_m_rt::entry;
|
||||||
|
use cortex_m_semihosting::hprintln;
|
||||||
|
|
||||||
|
#[entry]
|
||||||
|
fn main() -> ! {
|
||||||
|
hprintln!("Hello, world!");
|
||||||
|
|
||||||
|
loop {
|
||||||
|
// your code goes here
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue