Compare commits
64 Commits
therealpro
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
18bb680710 | ||
|
|
eb68e8bba9 | ||
|
|
3cbcb9956a | ||
|
|
5c6a17c0a6 | ||
|
|
be44af69cc | ||
|
|
f18b5af0a2 | ||
|
|
e1e98857af | ||
|
|
8047986061 | ||
|
|
ae6ad14ad4 | ||
|
|
541c7df215 | ||
|
|
4e9999f06f | ||
|
|
33034ee397 | ||
|
|
b12af511b9 | ||
|
|
3571fc9a79 | ||
|
|
8e29b31da4 | ||
|
|
1a60c1d944 | ||
|
|
888ddb7e0d | ||
|
|
23a74e9add | ||
|
|
9977613eac | ||
|
|
6c26219611 | ||
|
|
cda24a671d | ||
|
|
ee3eca20d3 | ||
|
|
e7025922f8 | ||
|
|
55bc69690a | ||
|
|
b741ef37f5 | ||
|
|
a546d1b00c | ||
|
|
57de818726 | ||
|
|
3ca2bb9a46 | ||
|
|
ac5d1fcb10 | ||
|
|
f5a8721006 | ||
|
|
d018974c6f | ||
|
|
77e60809b5 | ||
|
|
97788b8215 | ||
|
|
08e6ba02f1 | ||
|
|
eae0512459 | ||
|
|
9610e04635 | ||
|
|
cc52aef020 | ||
|
|
6919488412 | ||
|
|
73bae533c4 | ||
|
|
ac344b967f | ||
|
|
c6599f3686 | ||
|
|
3aa5ea9fd3 | ||
|
|
26baac1bf3 | ||
|
|
2d7405fc04 | ||
|
|
e58549b2ec | ||
|
|
9ee8b84217 | ||
|
|
0e2aadf8f2 | ||
|
|
e7138e0e2a | ||
|
|
c142db6e23 | ||
|
|
207bca35f4 | ||
|
|
f9570c7c65 | ||
|
|
f47d1633af | ||
|
|
55e61c3291 | ||
|
|
e64e690512 | ||
|
|
f7a943f480 | ||
|
|
9c6b290e12 | ||
|
|
7e2bec66b7 | ||
|
|
4295bccf0e | ||
|
|
8f292e0f07 | ||
|
|
76d2e947a5 | ||
|
|
76cdd6a95b | ||
|
|
314e48537c | ||
|
|
d5abcf6d2a | ||
|
|
b02a67b5f9 |
@@ -10,6 +10,10 @@
|
||||
# runner = "gdb -q -x openocd.gdb"
|
||||
|
||||
rustflags = [
|
||||
# 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",
|
||||
|
||||
# LLD (shipped with the Rust toolchain) is used as the default linker
|
||||
"-C", "link-arg=-Tlink.x",
|
||||
|
||||
@@ -27,7 +31,10 @@ rustflags = [
|
||||
|
||||
[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)
|
||||
# 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 = "thumbv8m.base-none-eabi" # Cortex-M23
|
||||
# target = "thumbv8m.main-none-eabi" # Cortex-M33 (no FPU)
|
||||
# target = "thumbv8m.main-none-eabihf" # Cortex-M33 (with FPU)
|
||||
|
||||
8
.gitignore
vendored
8
.gitignore
vendored
@@ -3,3 +3,11 @@
|
||||
.gdb_history
|
||||
Cargo.lock
|
||||
target/
|
||||
|
||||
# editor files
|
||||
.vscode/*
|
||||
!.vscode/*.md
|
||||
!.vscode/*.svd
|
||||
!.vscode/launch.json
|
||||
!.vscode/tasks.json
|
||||
!.vscode/extensions.json
|
||||
109
.vscode/README.md
vendored
Normal file
109
.vscode/README.md
vendored
Normal file
@@ -0,0 +1,109 @@
|
||||
# VS Code Configuration
|
||||
|
||||
Example configurations for debugging programs in-editor with VS Code.
|
||||
This directory contains configurations for two platforms:
|
||||
|
||||
- `LM3S6965EVB` on QEMU
|
||||
- `STM32F303x` via OpenOCD
|
||||
|
||||
## Required Extensions
|
||||
|
||||
If you have the `code` command in your path, you can run the following commands to install the necessary extensions.
|
||||
|
||||
```sh
|
||||
code --install-extension rust-lang.rust
|
||||
code --install-extension marus25.cortex-debug
|
||||
```
|
||||
|
||||
Otherwise, you can use the Extensions view to search for and install them, or go directly to their marketplace pages and click the "Install" button.
|
||||
|
||||
- [Rust Language Server (RLS)](https://marketplace.visualstudio.com/items?itemName=rust-lang.rust)
|
||||
- [Cortex-Debug](https://marketplace.visualstudio.com/items?itemName=marus25.cortex-debug)
|
||||
|
||||
## Use
|
||||
|
||||
The quickstart comes with two debug configurations.
|
||||
Both are configured to build the project, using the default settings from `.cargo/config`, prior to starting a debug session.
|
||||
|
||||
1. QEMU: Starts a debug session using an emulation of the `LM3S6965EVB` mcu.
|
||||
- This works on a fresh `cargo generate` without modification of any of the settings described above.
|
||||
- Semihosting output will be written to the Output view `Adapter Output`.
|
||||
- `ITM` logging does not work with QEMU emulation.
|
||||
|
||||
2. OpenOCD: Starts a debug session for a `STM32F3DISCOVERY` board (or any `STM32F303x` running at 8MHz).
|
||||
- Follow the instructions above for configuring the build with `.cargo/config` and the `memory.x` linker script.
|
||||
- `ITM` output will be written to the Output view `SWO: ITM [port: 0, type: console]` output.
|
||||
|
||||
### Git
|
||||
|
||||
Files in the `.vscode/` directory are `.gitignore`d by default because many files that may end up in the `.vscode/` directory should not be committed and shared.
|
||||
If you would like to save this debug configuration to your repository and share it with your team, you'll need to explicitly `git add` the files to your repository.
|
||||
|
||||
```sh
|
||||
git add -f .vscode/launch.json
|
||||
git add -f .vscode/tasks.json
|
||||
git add -f .vscode/*.svd
|
||||
```
|
||||
|
||||
## Customizing for other targets
|
||||
|
||||
For full documentation, see the [Cortex-Debug][cortex-debug] repository.
|
||||
|
||||
### Device
|
||||
|
||||
Some configurations use this to automatically find the SVD file.
|
||||
Replace this with the part number for your device.
|
||||
|
||||
```json
|
||||
"device": "STM32F303VCT6",
|
||||
```
|
||||
|
||||
### OpenOCD Config Files
|
||||
|
||||
The `configFiles` property specifies a list of files to pass to OpenOCD.
|
||||
|
||||
```json
|
||||
"configFiles": [
|
||||
"interface/stlink-v2-1.cfg",
|
||||
"target/stm32f3x.cfg"
|
||||
],
|
||||
```
|
||||
|
||||
See the [OpenOCD config docs][openocd-config] for more information and the [OpenOCD repository for available configuration files][openocd-repo].
|
||||
|
||||
### SVD
|
||||
|
||||
The SVD file is a standard way of describing all registers and peripherals of an ARM Cortex-M mCU.
|
||||
Cortex-Debug needs this file to display the current register values for the peripherals on the device.
|
||||
|
||||
You can probably find the SVD for your device on the vendor's website.
|
||||
|
||||
|
||||
For example, the STM32F3DISCOVERY board uses an mcu from the `STM32F303x` line of processors.
|
||||
All the SVD files for the STM32F3 series are available on [ST's Website][stm32f3].
|
||||
Download the [stm32f3 SVD pack][stm32f3-svd], and copy the `STM32F303.svd` file into `.vscode/`.
|
||||
This line of the config tells the Cortex-Debug plug in where to find the file.
|
||||
|
||||
```json
|
||||
"svdFile": "${workspaceRoot}/.vscode/STM32F303.svd",
|
||||
```
|
||||
|
||||
For other processors, simply copy the correct `*.svd` file into the project and update the config accordingly.
|
||||
|
||||
### CPU Frequency
|
||||
|
||||
If your device is running at a frequency other than 8MHz, you'll need to modify this line of `launch.json` for the `ITM` output to work correctly.
|
||||
|
||||
```json
|
||||
"cpuFrequency": 8000000,
|
||||
```
|
||||
|
||||
### Other GDB Servers
|
||||
|
||||
For information on setting up GDB servers other than OpenOCD, see the [Cortex-Debug repository][cortex-debug].
|
||||
|
||||
[cortex-debug]: https://github.com/Marus/cortex-debug
|
||||
[stm32f3]: https://www.st.com/content/st_com/en/products/microcontrollers-microprocessors/stm32-32-bit-arm-cortex-mcus/stm32-mainstream-mcus/stm32f3-series.html#resource
|
||||
[stm32f3-svd]: https://www.st.com/resource/en/svd/stm32f3_svd.zip
|
||||
[openocd-config]: http://openocd.org/doc/html/Config-File-Guidelines.html
|
||||
[openocd-repo]: https://sourceforge.net/p/openocd/code/ci/master/tree/tcl/
|
||||
14
.vscode/extensions.json
vendored
Normal file
14
.vscode/extensions.json
vendored
Normal file
@@ -0,0 +1,14 @@
|
||||
{
|
||||
// See https://go.microsoft.com/fwlink/?LinkId=827846 to learn about workspace recommendations.
|
||||
// Extension identifier format: ${publisher}.${name}. Example: vscode.csharp
|
||||
|
||||
// List of extensions which should be recommended for users of this workspace.
|
||||
"recommendations": [
|
||||
"rust-lang.rust",
|
||||
"marus25.cortex-debug",
|
||||
],
|
||||
// List of extensions recommended by VS Code that should not be recommended for users of this workspace.
|
||||
"unwantedRecommendations": [
|
||||
|
||||
]
|
||||
}
|
||||
52
.vscode/launch.json
vendored
Normal file
52
.vscode/launch.json
vendored
Normal file
@@ -0,0 +1,52 @@
|
||||
{
|
||||
/*
|
||||
* Requires the Rust Language Server (RLS) and Cortex-Debug extensions
|
||||
* https://marketplace.visualstudio.com/items?itemName=rust-lang.rust
|
||||
* https://marketplace.visualstudio.com/items?itemName=marus25.cortex-debug
|
||||
*/
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"type": "cortex-debug",
|
||||
"request": "launch",
|
||||
"name": "Debug (QEMU)",
|
||||
"servertype": "qemu",
|
||||
"cwd": "${workspaceRoot}",
|
||||
"preLaunchTask": "Cargo Build (debug)",
|
||||
"runToMain": true,
|
||||
"executable": "./target/thumbv7m-none-eabi/debug/{{project-name}}",
|
||||
/* Run `cargo build --example hello` and uncomment this line to run semi-hosting example */
|
||||
//"executable": "./target/thumbv7m-none-eabi/debug/examples/hello",
|
||||
"cpu": "cortex-m3",
|
||||
"machine": "lm3s6965evb",
|
||||
},
|
||||
{
|
||||
/* Configuration for the STM32F303 Discovery board */
|
||||
"type": "cortex-debug",
|
||||
"request": "launch",
|
||||
"name": "Debug (OpenOCD)",
|
||||
"servertype": "openocd",
|
||||
"cwd": "${workspaceRoot}",
|
||||
"preLaunchTask": "Cargo Build (debug)",
|
||||
"runToMain": true,
|
||||
"executable": "./target/thumbv7em-none-eabihf/debug/{{project-name}}",
|
||||
/* Run `cargo build --example itm` and uncomment this line to run itm example */
|
||||
// "executable": "./target/thumbv7em-none-eabihf/debug/examples/itm",
|
||||
"device": "STM32F303VCT6",
|
||||
"configFiles": [
|
||||
"interface/stlink-v2-1.cfg",
|
||||
"target/stm32f3x.cfg"
|
||||
],
|
||||
"svdFile": "${workspaceRoot}/.vscode/STM32F303.svd",
|
||||
"swoConfig": {
|
||||
"enabled": true,
|
||||
"cpuFrequency": 8000000,
|
||||
"swoFrequency": 2000000,
|
||||
"source": "probe",
|
||||
"decoders": [
|
||||
{ "type": "console", "label": "ITM", "port": 0 }
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
63
.vscode/tasks.json
vendored
Normal file
63
.vscode/tasks.json
vendored
Normal file
@@ -0,0 +1,63 @@
|
||||
{
|
||||
// See https://go.microsoft.com/fwlink/?LinkId=733558
|
||||
// for the documentation about the tasks.json format
|
||||
"version": "2.0.0",
|
||||
"tasks": [
|
||||
{
|
||||
/*
|
||||
* This is the default cargo build task,
|
||||
* but we need to provide a label for it,
|
||||
* so we can invoke it from the debug launcher.
|
||||
*/
|
||||
"label": "Cargo Build (debug)",
|
||||
"type": "process",
|
||||
"command": "cargo",
|
||||
"args": ["build"],
|
||||
"problemMatcher": [
|
||||
"$rustc"
|
||||
],
|
||||
"group": {
|
||||
"kind": "build",
|
||||
"isDefault": true
|
||||
}
|
||||
},
|
||||
{
|
||||
"label": "Cargo Build (release)",
|
||||
"type": "process",
|
||||
"command": "cargo",
|
||||
"args": ["build", "--release"],
|
||||
"problemMatcher": [
|
||||
"$rustc"
|
||||
],
|
||||
"group": "build"
|
||||
},
|
||||
{
|
||||
"label": "Cargo Build Examples (debug)",
|
||||
"type": "process",
|
||||
"command": "cargo",
|
||||
"args": ["build","--examples"],
|
||||
"problemMatcher": [
|
||||
"$rustc"
|
||||
],
|
||||
"group": "build"
|
||||
},
|
||||
{
|
||||
"label": "Cargo Build Examples (release)",
|
||||
"type": "process",
|
||||
"command": "cargo",
|
||||
"args": ["build","--examples", "--release"],
|
||||
"problemMatcher": [
|
||||
"$rustc"
|
||||
],
|
||||
"group": "build"
|
||||
},
|
||||
{
|
||||
"label": "Cargo Clean",
|
||||
"type": "process",
|
||||
"command": "cargo",
|
||||
"args": ["clean"],
|
||||
"problemMatcher": [],
|
||||
"group": "build"
|
||||
},
|
||||
]
|
||||
}
|
||||
17
Cargo.toml
17
Cargo.toml
@@ -1,24 +1,27 @@
|
||||
[package]
|
||||
authors = ["{{authors}}"]
|
||||
edition = "2018"
|
||||
readme = "README.md"
|
||||
name = "{{project-name}}"
|
||||
version = "0.1.0"
|
||||
|
||||
[dependencies]
|
||||
cortex-m = "0.5.7"
|
||||
cortex-m-rt = "0.6.3"
|
||||
cortex-m-semihosting = "0.3.1"
|
||||
cortex-m = "0.6.0"
|
||||
cortex-m-rt = "0.6.10"
|
||||
cortex-m-semihosting = "0.3.3"
|
||||
panic-halt = "0.2.0"
|
||||
|
||||
# Uncomment for the panic example.
|
||||
# panic-itm = "0.4.0"
|
||||
# panic-itm = "0.4.1"
|
||||
|
||||
# Uncomment for the allocator example.
|
||||
# alloc-cortex-m = "0.3.5"
|
||||
# alloc-cortex-m = "0.4.0"
|
||||
|
||||
# Uncomment for the device example.
|
||||
# [dependencies.stm32f30x]
|
||||
# features = ["rt"]
|
||||
# Update `memory.x`, set target to `thumbv7em-none-eabihf` in `.cargo/config`,
|
||||
# and then use `cargo build --examples device` to build it.
|
||||
# [dependencies.stm32f3]
|
||||
# features = ["stm32f303", "rt"]
|
||||
# version = "0.7.1"
|
||||
|
||||
# this lets you use `cargo fix`!
|
||||
|
||||
13
README.md
13
README.md
@@ -8,12 +8,9 @@ This project is developed and maintained by the [Cortex-M team][team].
|
||||
|
||||
To build embedded programs using this template you'll need:
|
||||
|
||||
- Rust 1.30, 1.30-beta, nightly-2018-09-13 or a newer toolchain. e.g. `rustup
|
||||
- Rust 1.31, 1.30-beta, nightly-2018-09-13 or a newer toolchain. e.g. `rustup
|
||||
default beta`
|
||||
|
||||
> **NOTE**: 1.30-beta is not out yet so you'll have to use the nightly channel
|
||||
> in the meantime.
|
||||
|
||||
- The `cargo generate` subcommand. [Installation
|
||||
instructions](https://github.com/ashleygwilliams/cargo-generate#installation).
|
||||
|
||||
@@ -105,6 +102,12 @@ MEMORY
|
||||
$ 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
|
||||
@@ -128,5 +131,5 @@ 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]: CODE_OF_CONDUCT.md
|
||||
[CoC]: https://www.rust-lang.org/policies/code-of-conduct
|
||||
[team]: https://github.com/rust-embedded/wg#the-cortex-m-team
|
||||
|
||||
19
build.rs
19
build.rs
@@ -1,10 +1,21 @@
|
||||
//! 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 the linker script somewhere the linker can find it
|
||||
// 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()
|
||||
@@ -12,7 +23,9 @@ fn main() {
|
||||
.unwrap();
|
||||
println!("cargo:rustc-link-search={}", out.display());
|
||||
|
||||
// Only re-run the build script when memory.x is changed,
|
||||
// instead of when any part of the source code changes.
|
||||
// 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");
|
||||
}
|
||||
|
||||
@@ -9,21 +9,20 @@
|
||||
//!
|
||||
//! ---
|
||||
|
||||
#![feature(alloc)]
|
||||
#![feature(alloc_error_handler)]
|
||||
#![no_main]
|
||||
#![no_std]
|
||||
|
||||
extern crate panic_halt;
|
||||
extern crate alloc;
|
||||
use panic_halt as _;
|
||||
|
||||
use self::alloc::vec;
|
||||
use core::alloc::Layout;
|
||||
use core::fmt::Write;
|
||||
|
||||
use alloc::vec;
|
||||
use alloc_cortex_m::CortexMHeap;
|
||||
use cortex_m::asm;
|
||||
use cortex_m_rt::entry;
|
||||
use cortex_m_semihosting::hio;
|
||||
use cortex_m_semihosting::{hprintln, debug};
|
||||
|
||||
// this is the allocator the application will use
|
||||
#[global_allocator]
|
||||
@@ -39,8 +38,11 @@ fn main() -> ! {
|
||||
// Growable array allocated on the heap
|
||||
let xs = vec![0, 1, 2];
|
||||
|
||||
let mut stdout = hio::hstdout().unwrap();
|
||||
writeln!(stdout, "{:?}", xs).unwrap();
|
||||
hprintln!("{:?}", xs).unwrap();
|
||||
|
||||
// exit QEMU
|
||||
// NOTE do not run this on hardware; it can corrupt OpenOCD state
|
||||
debug::exit(debug::EXIT_SUCCESS);
|
||||
|
||||
loop {}
|
||||
}
|
||||
|
||||
@@ -79,7 +79,7 @@
|
||||
#![no_main]
|
||||
#![no_std]
|
||||
|
||||
extern crate panic_halt;
|
||||
use panic_halt as _;
|
||||
|
||||
use core::ptr;
|
||||
|
||||
|
||||
@@ -5,34 +5,33 @@
|
||||
//!
|
||||
//! [`svd2rust`]: https://crates.io/crates/svd2rust
|
||||
//!
|
||||
//! Device crates also provide an `interrupt!` macro (behind the "rt" feature) to register interrupt
|
||||
//! handlers.
|
||||
//! This example depends on the [`stm32f3`] crate so you'll have to
|
||||
//! uncomment it in your Cargo.toml.
|
||||
//!
|
||||
//! This example depends on the [`stm32f103xx`] crate so you'll have to add it to your Cargo.toml.
|
||||
//!
|
||||
//! [`stm32f103xx`]: https://crates.io/crates/stm32f103xx
|
||||
//! [`stm32f3`]: https://crates.io/crates/stm32f3
|
||||
//!
|
||||
//! ```
|
||||
//! $ edit Cargo.toml && tail $_
|
||||
//! [dependencies.stm32f103xx]
|
||||
//! features = ["rt"]
|
||||
//! version = "0.10.0"
|
||||
//! [dependencies.stm32f3]
|
||||
//! features = ["stm32f303", "rt"]
|
||||
//! version = "0.7.1"
|
||||
//! ```
|
||||
//!
|
||||
//! You also need to set the build target to thumbv7em-none-eabihf,
|
||||
//! typically by editing `.cargo/config` and uncommenting the relevant target line.
|
||||
//!
|
||||
//! ---
|
||||
|
||||
#![no_main]
|
||||
#![no_std]
|
||||
|
||||
#[allow(unused_extern_crates)]
|
||||
extern crate panic_halt;
|
||||
|
||||
use core::fmt::Write;
|
||||
use panic_halt as _;
|
||||
|
||||
use cortex_m::peripheral::syst::SystClkSource;
|
||||
use cortex_m_rt::entry;
|
||||
use cortex_m_semihosting::hio::{self, HStdout};
|
||||
use stm32f30x::{interrupt, Interrupt};
|
||||
use cortex_m_semihosting::hprint;
|
||||
use stm32f3::stm32f303::{interrupt, Interrupt, NVIC};
|
||||
|
||||
#[entry]
|
||||
fn main() -> ! {
|
||||
@@ -53,19 +52,11 @@ fn main() -> ! {
|
||||
while !syst.has_wrapped() {}
|
||||
|
||||
// trigger the `EXTI0` interrupt
|
||||
nvic.set_pending(Interrupt::EXTI0);
|
||||
NVIC::pend(Interrupt::EXTI0);
|
||||
}
|
||||
}
|
||||
|
||||
// try commenting out this line: you'll end in `default_handler` instead of in `exti0`
|
||||
interrupt!(EXTI0, exti0, state: Option<HStdout> = None);
|
||||
|
||||
fn exti0(state: &mut Option<HStdout>) {
|
||||
if state.is_none() {
|
||||
*state = Some(hio::hstdout().unwrap());
|
||||
}
|
||||
|
||||
if let Some(hstdout) = state.as_mut() {
|
||||
hstdout.write_str(".").unwrap();
|
||||
}
|
||||
#[interrupt]
|
||||
fn EXTI0() {
|
||||
hprint!(".").unwrap();
|
||||
}
|
||||
|
||||
@@ -10,14 +10,12 @@
|
||||
#![no_main]
|
||||
#![no_std]
|
||||
|
||||
extern crate panic_halt;
|
||||
|
||||
use core::fmt::Write;
|
||||
use panic_halt as _;
|
||||
|
||||
use cortex_m::peripheral::syst::SystClkSource;
|
||||
use cortex_m::Peripherals;
|
||||
use cortex_m_rt::{entry, exception};
|
||||
use cortex_m_semihosting::hio::{self, HStdout};
|
||||
use cortex_m_semihosting::hprint;
|
||||
|
||||
#[entry]
|
||||
fn main() -> ! {
|
||||
@@ -35,13 +33,5 @@ fn main() -> ! {
|
||||
|
||||
#[exception]
|
||||
fn SysTick() {
|
||||
static mut STDOUT: Option<HStdout> = None;
|
||||
|
||||
if STDOUT.is_none() {
|
||||
*STDOUT = Some(hio::hstdout().unwrap());
|
||||
}
|
||||
|
||||
if let Some(hstdout) = STDOUT.as_mut() {
|
||||
hstdout.write_str(".").unwrap();
|
||||
}
|
||||
hprint!(".").unwrap();
|
||||
}
|
||||
|
||||
@@ -3,19 +3,17 @@
|
||||
#![no_main]
|
||||
#![no_std]
|
||||
|
||||
extern crate panic_halt;
|
||||
|
||||
use core::fmt::Write;
|
||||
use panic_halt as _;
|
||||
|
||||
use cortex_m_rt::entry;
|
||||
use cortex_m_semihosting::{debug, hio};
|
||||
use cortex_m_semihosting::{debug, hprintln};
|
||||
|
||||
#[entry]
|
||||
fn main() -> ! {
|
||||
let mut stdout = hio::hstdout().unwrap();
|
||||
writeln!(stdout, "Hello, world!").unwrap();
|
||||
hprintln!("Hello, world!").unwrap();
|
||||
|
||||
// exit QEMU or the debugger section
|
||||
// exit QEMU
|
||||
// NOTE do not run this on hardware; it can corrupt OpenOCD state
|
||||
debug::exit(debug::EXIT_SUCCESS);
|
||||
|
||||
loop {}
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
#![no_main]
|
||||
#![no_std]
|
||||
|
||||
extern crate panic_halt;
|
||||
use panic_halt as _;
|
||||
|
||||
use cortex_m::{iprintln, Peripherals};
|
||||
use cortex_m_rt::entry;
|
||||
|
||||
@@ -10,15 +10,15 @@
|
||||
// Pick one of these panic handlers:
|
||||
|
||||
// `panic!` halts execution; the panic message is ignored
|
||||
extern crate panic_halt;
|
||||
use panic_halt as _;
|
||||
|
||||
// Reports panic messages to the host stderr using semihosting
|
||||
// NOTE to use this you need to uncomment the `panic-semihosting` dependency in Cargo.toml
|
||||
// extern crate panic_semihosting;
|
||||
// use panic_semihosting as _;
|
||||
|
||||
// Logs panic messages using the ITM (Instrumentation Trace Macrocell)
|
||||
// NOTE to use this you need to uncomment the `panic-itm` dependency in Cargo.toml
|
||||
// extern crate panic_itm;
|
||||
// use panic_itm as _;
|
||||
|
||||
use cortex_m_rt::entry;
|
||||
|
||||
|
||||
57
examples/test_on_host.rs
Normal file
57
examples/test_on_host.rs
Normal file
@@ -0,0 +1,57 @@
|
||||
//! Conditionally compiling tests with std and our executable with no_std.
|
||||
//!
|
||||
//! Rust's built in unit testing framework requires the standard library,
|
||||
//! but we need to build our final executable with no_std.
|
||||
//! The testing framework also generates a `main` method, so we need to only use the `#[entry]`
|
||||
//! annotation when building our final image.
|
||||
//! For more information on why this example works, see this excellent blog post.
|
||||
//! https://os.phil-opp.com/unit-testing/
|
||||
//!
|
||||
//! Running this example:
|
||||
//!
|
||||
//! Ensure there are no targets specified under `[build]` in `.cargo/config`
|
||||
//! In order to make this work, we lose the convenience of having a default target that isn't the
|
||||
//! host.
|
||||
//!
|
||||
//! cargo build --example test_on_host --target thumbv7m-none-eabi
|
||||
//! cargo test --example test_on_host
|
||||
|
||||
#![cfg_attr(test, allow(unused_imports))]
|
||||
|
||||
#![cfg_attr(not(test), no_std)]
|
||||
#![cfg_attr(not(test), no_main)]
|
||||
|
||||
// pick a panicking behavior
|
||||
#[cfg(not(test))]
|
||||
use panic_halt as _; // you can put a breakpoint on `rust_begin_unwind` to catch panics
|
||||
// use panic_abort as _; // requires nightly
|
||||
// use panic_itm as _; // logs messages over ITM; requires ITM support
|
||||
// use panic_semihosting as _; // logs messages to the host stderr; requires a debugger
|
||||
|
||||
use cortex_m::asm;
|
||||
use cortex_m_rt::entry;
|
||||
|
||||
#[cfg(not(test))]
|
||||
#[entry]
|
||||
fn main() -> ! {
|
||||
asm::nop(); // To not have main optimize to abort in release mode, remove when you add code
|
||||
|
||||
loop {
|
||||
// your code goes here
|
||||
}
|
||||
}
|
||||
|
||||
fn add(a: i32, b: i32) -> i32 {
|
||||
a + b
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod test {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn foo() {
|
||||
println!("tests work!");
|
||||
assert!(2 == add(1,1));
|
||||
}
|
||||
}
|
||||
13
memory.x
13
memory.x
@@ -19,3 +19,16 @@ MEMORY
|
||||
/* This is required only on microcontrollers that store some configuration right
|
||||
after the vector table */
|
||||
/* _stext = ORIGIN(FLASH) + 0x400; */
|
||||
|
||||
/* Example of putting non-initialized variables into custom RAM locations. */
|
||||
/* This assumes you have defined a region RAM2 above, and in the Rust
|
||||
sources added the attribute `#[link_section = ".ram2bss"]` to the data
|
||||
you want to place there. */
|
||||
/* Note that the section will not be zero-initialized by the runtime! */
|
||||
/* SECTIONS {
|
||||
.ram2bss (NOLOAD) : ALIGN(4) {
|
||||
*(.ram2bss);
|
||||
. = ALIGN(4);
|
||||
} > RAM2
|
||||
} INSERT AFTER .bss;
|
||||
*/
|
||||
|
||||
10
openocd.gdb
10
openocd.gdb
@@ -3,10 +3,18 @@ target extended-remote :3333
|
||||
# print demangled symbols
|
||||
set print asm-demangle on
|
||||
|
||||
# set backtrace limit to not have infinite backtrace loops
|
||||
set backtrace limit 32
|
||||
|
||||
# detect unhandled exceptions, hard faults and panics
|
||||
break DefaultHandler
|
||||
break UserHardFault
|
||||
break HardFault
|
||||
break rust_begin_unwind
|
||||
# # run the next few lines so the panic message is printed immediately
|
||||
# # the number needs to be adjusted for your panic handler
|
||||
# commands $bpnum
|
||||
# next 4
|
||||
# end
|
||||
|
||||
# *try* to stop at the user entry point (it might be gone due to inlining)
|
||||
break main
|
||||
|
||||
11
src/main.rs
11
src/main.rs
@@ -2,15 +2,18 @@
|
||||
#![no_main]
|
||||
|
||||
// pick a panicking behavior
|
||||
extern crate panic_halt; // you can put a breakpoint on `rust_begin_unwind` to catch panics
|
||||
// extern crate panic_abort; // requires nightly
|
||||
// extern crate panic_itm; // logs messages over ITM; requires ITM support
|
||||
// extern crate panic_semihosting; // logs messages to the host stderr; requires a debugger
|
||||
use panic_halt as _; // you can put a breakpoint on `rust_begin_unwind` to catch panics
|
||||
// use panic_abort as _; // requires nightly
|
||||
// use panic_itm as _; // logs messages over ITM; requires ITM support
|
||||
// use panic_semihosting as _; // logs messages to the host stderr; requires a debugger
|
||||
|
||||
use cortex_m::asm;
|
||||
use cortex_m_rt::entry;
|
||||
|
||||
#[entry]
|
||||
fn main() -> ! {
|
||||
asm::nop(); // To not have main optimize to abort in release mode, remove when you add code
|
||||
|
||||
loop {
|
||||
// your code goes here
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user