1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
`board` provides a thin board support package for `imxrt-rt`. The
package provides cross-board compatibility for all `imxrt-rt` hardware
examples. It supports `imxrt-rt` development and testing, and is not
intended as a general BSP.
`board` supports
- Teensy 4.0 and Teensy 4.1 boards with the `teensy4` feature.
- the IMXRT1010EVK board with the `imxrt1010evk` feature.
- the Cortex M7 on the IMXRT1170EVK with the `imxrt1170evk-cm7`
feature.
When using any NXP EVK, make sure that your boot device is FlexSPI.
Consult your board's hardware user guide for more information.
## Board configurations
The examples in this repository are very basic. They demonstrate a
working runtime by blinking an LED. They also configure timer interrupts
to show that the vector table is placed and registered correctly. They
only use `imxrt-ral` to access registers.
Boards simply specify an LED. See the relevant module in `board/src/`
for more information.
`build.rs` configures the runtime for each board. You can change this to
explore different runtime configurations.
## Building hardware examples
Hardware examples for `imxrt-rt` depend on `board` and a board
selection. This section describes how to build an example for your
board. It focuses on building examples for the Teensy 4, but the concept
generalizes for all supported boards.
To build the `blink-blocking` example for a Teensy 4, run the command
from the repo's root:
cargo build --example=blink-blocking --features=board/teensy4 --target=thumbv7em-none-eabihf
Generally, you select the example with `--example`, and specify the
board with `--features=board/[your-board]`. To build the same example
for the IMXRT1010EVK, change `--features=board/teensy4` to
`--features=board/imxrt1010evk`.
To build an RTIC-based example, enable the `rtic` feature of `board`.
Artifacts are available under
`target/thumbv7em-none-eabihf/[debug|release]/examples`. Keep this in
mind when flashing your board.
## Flashing hardware examples
The tools required to flash an example depend on the board you're using.
This section recommends tooling to flash hardware examples on your
board.
### NXP IMXRT EVKs
If you're using an NXP IMXRT EVK, you can use any of the following to
flash your board.
- [`pyOCD`] supports all i.MX RT 10xx and 11xx boards.
- [`probe-rs` tools] only support i.MX RT 10xx boards. These tools
include
- [`probe-run`]
- [`cargo-flash`]
- [`cargo-embed`]
See each tool's documentation to understand its usage. To make some
tooling integration easier, see the Tips and Tricks section near the end
of this document.
[`pyOCD`]: https://pyocd.io
[`probe-rs` tools]: https://probe.rs
[`probe-run`]: https://github.com/knurling-rs/probe-run
[`cargo-flash`]: https://github.com/probe-rs/cargo-flash
[`cargo-embed`]: https://github.com/probe-rs/cargo-embed
### Teensy 4
If you're using a Teensy 4 board, you'll need all of the following:
- An `objcopy` capable of transforming ELF files into Intel HEX.
Consider using `rust-objcopy` provided by [`cargo-binutils`]. The
rest of this documentation assumes you're using `cargo-binutils`.
- Either a build of [`teensy_loader_cli`], or the [Teensy Loader
Application]. The latter is available with the Teensyduino add-ons.
After building your example, use `rust-objcopy` to convert the program
into HEX. For the `blink-blocking` example above, that command resembles
rust-objcopy -O ihex target/thumbv7em-none-eabihf/debug/examples/blink-blocking blink-blocking.hex
Finally, load the HEX file onto your board using your preferred loader.
[`cargo-binutils`]: https://github.com/rust-embedded/cargo-binutils
[`teensy_loader_cli`]: https://github.com/PaulStoffregen/teensy_loader_cli
[Teensy Loader Application]: https://www.pjrc.com/teensy/loader.html
## Tips and tricks
If you're using `probe-run` or `pyOCD` to flash an EVK, use the tool as
a runner. See the [Cargo Configuration] documentation for more
information. Please do not check your runner setting into the
repository; consider using environment variables or hierarchical
configuration files to configure your runner and any other useful
command aliases.
[Cargo Configuration]: https://doc.rust-lang.org/cargo/reference/config.html
## Adding a new board
Define a new module in `board/src/` that describes your board's LED. Use
the existing examples as your guide.
Add a new feature to `board/Cargo.toml` for your board. Link any
additional dependencies for your board, like FCB crates and panic
handlers. If an FCB crate does not exist for your board, you can define
the FCB within your newly-added module.
Update `board/build.rs` to configure a runtime for your chip.
|