mirror of
https://github.com/rtic-rs/rtic.git
synced 2024-11-23 20:22:51 +01:00
Split remove old examples
This commit is contained in:
parent
ef8046b060
commit
5a9135961f
13 changed files with 505 additions and 0 deletions
42
examples/README.md
Normal file
42
examples/README.md
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
# `RTIC examples`
|
||||||
|
|
||||||
|
> Here you can find examples on different aspects of the RTIC scheduler.
|
||||||
|
|
||||||
|
## Structure
|
||||||
|
|
||||||
|
This repo does have example applications based on RTIC framework for popular hardware platforms (for example nRF series and Bluepill).
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
|
||||||
|
To run these examples, you need to have working environment as described in [Installing the tools](https://rust-embedded.github.io/book/intro/install.html) chapter of **The Embedded Rust Book**.
|
||||||
|
|
||||||
|
Short list:
|
||||||
|
|
||||||
|
* Rust and cargo
|
||||||
|
* Toolchain for your microcontroller
|
||||||
|
* OpenOCD
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
New examples are always welcome!
|
||||||
|
|
||||||
|
## External examples
|
||||||
|
|
||||||
|
Some projects maintain RTIC examples in their own repository. Follow these links to find more RTIC examples.
|
||||||
|
|
||||||
|
- The [`teensy4-rs` project](https://github.com/mciantyre/teensy4-rs) maintains `RTIC v1.0` examples that run on the Teensy 4.0 and 4.1.
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
Licensed under either of
|
||||||
|
|
||||||
|
* Apache License, Version 2.0 ([LICENSE-APACHE](LICENSE-APACHE) or
|
||||||
|
[http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0))
|
||||||
|
* MIT license ([LICENSE-MIT](LICENSE-MIT) or [http://opensource.org/licenses/MIT](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.
|
45
examples/rp2040_local_i2c_init/.cargo/config.toml
Normal file
45
examples/rp2040_local_i2c_init/.cargo/config.toml
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
[target.thumbv6m-none-eabi]
|
||||||
|
# uncomment this to make `cargo run` execute programs on QEMU
|
||||||
|
# runner = "qemu-system-arm -cpu cortex-m3 -machine lm3s6965evb -nographic -semihosting-config enable=on,target=native -kernel"
|
||||||
|
|
||||||
|
[target.'cfg(all(target_arch = "arm", target_os = "none"))']
|
||||||
|
# uncomment ONE of these three option to make `cargo run` start a GDB session
|
||||||
|
# which option to pick depends on your system
|
||||||
|
# runner = "arm-none-eabi-gdb -q -x openocd.gdb"
|
||||||
|
# runner = "gdb-multiarch -q -x openocd.gdb"
|
||||||
|
# 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",
|
||||||
|
|
||||||
|
# if you run into problems with LLD switch to the GNU linker by commenting out
|
||||||
|
# this line
|
||||||
|
# "-C", "linker=arm-none-eabi-ld",
|
||||||
|
|
||||||
|
# if you need to link to pre-compiled C libraries provided by a C toolchain
|
||||||
|
# use GCC as the linker by commenting out both lines above and then
|
||||||
|
# uncommenting the three lines below
|
||||||
|
# "-C", "linker=arm-none-eabi-gcc",
|
||||||
|
# "-C", "link-arg=-Wl,-Tlink.x",
|
||||||
|
# "-C", "link-arg=-nostartfiles",
|
||||||
|
]
|
||||||
|
|
||||||
|
[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 = "thumbv8m.base-none-eabi" # Cortex-M23
|
||||||
|
# target = "thumbv8m.main-none-eabi" # Cortex-M33 (no FPU)
|
||||||
|
# target = "thumbv8m.main-none-eabihf" # Cortex-M33 (with FPU)
|
||||||
|
|
||||||
|
# thumbv7m-none-eabi is not coming with core and alloc, compile myself
|
||||||
|
[unstable]
|
||||||
|
mtime-on-use = true
|
||||||
|
build-std = ["core", "alloc"]
|
32
examples/rp2040_local_i2c_init/Cargo.toml
Normal file
32
examples/rp2040_local_i2c_init/Cargo.toml
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
[package]
|
||||||
|
name = "rp2040_local_i2c_init"
|
||||||
|
categories = ["embedded", "no-std"]
|
||||||
|
description = "Example task local initialized resources for Raspberry Pi Pico"
|
||||||
|
license = "MIT OR Apache-2.0"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
cortex-m = "0.7"
|
||||||
|
rtic = { git = "https://github.com/rtic-rs/rtic", features = [
|
||||||
|
"thumbv6-backend",
|
||||||
|
] }
|
||||||
|
rtic-monotonics = { git = "https://github.com/rtic-rs/rtic", features = [
|
||||||
|
"rp2040",
|
||||||
|
] }
|
||||||
|
embedded-hal = { version = "0.2.7", features = ["unproven"] }
|
||||||
|
fugit = "0.3"
|
||||||
|
rp-pico = "0.7.0"
|
||||||
|
panic-probe = "0.3"
|
||||||
|
|
||||||
|
[profile.dev]
|
||||||
|
opt-level = 1
|
||||||
|
codegen-units = 16
|
||||||
|
debug = true
|
||||||
|
lto = false
|
||||||
|
|
||||||
|
[profile.release]
|
||||||
|
opt-level = "s" # optimize for size
|
||||||
|
codegen-units = 1 # better optimizations
|
||||||
|
debug = true # symbols are nice and they don't increase the size on Flash
|
||||||
|
lto = true # better optimzations
|
39
examples/rp2040_local_i2c_init/Embed.toml
Normal file
39
examples/rp2040_local_i2c_init/Embed.toml
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
[default.probe]
|
||||||
|
protocol = "Swd"
|
||||||
|
speed = 20000
|
||||||
|
# If you only have one probe cargo embed will pick automatically
|
||||||
|
# Otherwise: add your probe's VID/PID/serial to filter
|
||||||
|
|
||||||
|
## rust-dap
|
||||||
|
# usb_vid = "6666"
|
||||||
|
# usb_pid = "4444"
|
||||||
|
# serial = "test"
|
||||||
|
|
||||||
|
|
||||||
|
[default.flashing]
|
||||||
|
enabled = true
|
||||||
|
|
||||||
|
[default.reset]
|
||||||
|
enabled = true
|
||||||
|
halt_afterwards = false
|
||||||
|
|
||||||
|
[default.general]
|
||||||
|
chip = "RP2040"
|
||||||
|
log_level = "WARN"
|
||||||
|
# RP2040 does not support connect_under_reset
|
||||||
|
connect_under_reset = false
|
||||||
|
|
||||||
|
[default.rtt]
|
||||||
|
enabled = true
|
||||||
|
up_mode = "NoBlockSkip"
|
||||||
|
channels = [
|
||||||
|
{ up = 0, down = 0, name = "name", up_mode = "NoBlockSkip", format = "Defmt" },
|
||||||
|
]
|
||||||
|
timeout = 3000
|
||||||
|
show_timestamps = true
|
||||||
|
log_enabled = false
|
||||||
|
log_path = "./logs"
|
||||||
|
|
||||||
|
[default.gdb]
|
||||||
|
enabled = true
|
||||||
|
gdb_connection_string = "127.0.0.1:2345"
|
31
examples/rp2040_local_i2c_init/build.rs
Normal file
31
examples/rp2040_local_i2c_init/build.rs
Normal file
|
@ -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");
|
||||||
|
}
|
15
examples/rp2040_local_i2c_init/memory.x
Normal file
15
examples/rp2040_local_i2c_init/memory.x
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
MEMORY {
|
||||||
|
BOOT2 : ORIGIN = 0x10000000, LENGTH = 0x100
|
||||||
|
FLASH : ORIGIN = 0x10000100, LENGTH = 2048K - 0x100
|
||||||
|
RAM : ORIGIN = 0x20000000, LENGTH = 256K
|
||||||
|
}
|
||||||
|
|
||||||
|
EXTERN(BOOT2_FIRMWARE)
|
||||||
|
|
||||||
|
SECTIONS {
|
||||||
|
/* ### Boot loader */
|
||||||
|
.boot2 ORIGIN(BOOT2) :
|
||||||
|
{
|
||||||
|
KEEP(*(.boot2));
|
||||||
|
} > BOOT2
|
||||||
|
} INSERT BEFORE .text;
|
114
examples/rp2040_local_i2c_init/src/main.rs
Normal file
114
examples/rp2040_local_i2c_init/src/main.rs
Normal file
|
@ -0,0 +1,114 @@
|
||||||
|
#![no_std]
|
||||||
|
#![no_main]
|
||||||
|
#![feature(type_alias_impl_trait)]
|
||||||
|
|
||||||
|
#[rtic::app(
|
||||||
|
device = rp_pico::hal::pac,
|
||||||
|
dispatchers = [TIMER_IRQ_1]
|
||||||
|
)]
|
||||||
|
mod app {
|
||||||
|
use rp_pico::hal::{
|
||||||
|
clocks, gpio,
|
||||||
|
gpio::pin::bank0::{Gpio2, Gpio25, Gpio3},
|
||||||
|
gpio::pin::PushPullOutput,
|
||||||
|
pac,
|
||||||
|
sio::Sio,
|
||||||
|
watchdog::Watchdog,
|
||||||
|
I2C,
|
||||||
|
};
|
||||||
|
use rp_pico::XOSC_CRYSTAL_FREQ;
|
||||||
|
|
||||||
|
use core::mem::MaybeUninit;
|
||||||
|
use embedded_hal::digital::v2::{OutputPin, ToggleableOutputPin};
|
||||||
|
use fugit::RateExtU32;
|
||||||
|
use rtic_monotonics::rp2040::*;
|
||||||
|
|
||||||
|
use panic_probe as _;
|
||||||
|
|
||||||
|
rtic_monotonics::make_rp2040_monotonic_handler!();
|
||||||
|
|
||||||
|
type I2CBus = I2C<
|
||||||
|
pac::I2C1,
|
||||||
|
(
|
||||||
|
gpio::Pin<Gpio2, gpio::FunctionI2C>,
|
||||||
|
gpio::Pin<Gpio3, gpio::FunctionI2C>,
|
||||||
|
),
|
||||||
|
>;
|
||||||
|
|
||||||
|
#[shared]
|
||||||
|
struct Shared {}
|
||||||
|
|
||||||
|
#[local]
|
||||||
|
struct Local {
|
||||||
|
led: gpio::Pin<Gpio25, PushPullOutput>,
|
||||||
|
i2c: &'static mut I2CBus,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[init(local=[
|
||||||
|
// Task local initialized resources are static
|
||||||
|
// Here we use MaybeUninit to allow for initialization in init()
|
||||||
|
// This enables its usage in driver initialization
|
||||||
|
i2c_ctx: MaybeUninit<I2CBus> = MaybeUninit::uninit()
|
||||||
|
])]
|
||||||
|
fn init(mut ctx: init::Context) -> (Shared, Local) {
|
||||||
|
// Configure the clocks, watchdog - The default is to generate a 125 MHz system clock
|
||||||
|
Timer::start(ctx.device.TIMER, &mut ctx.device.RESETS); // default rp2040 clock-rate is 125MHz
|
||||||
|
let mut watchdog = Watchdog::new(ctx.device.WATCHDOG);
|
||||||
|
let clocks = clocks::init_clocks_and_plls(
|
||||||
|
XOSC_CRYSTAL_FREQ,
|
||||||
|
ctx.device.XOSC,
|
||||||
|
ctx.device.CLOCKS,
|
||||||
|
ctx.device.PLL_SYS,
|
||||||
|
ctx.device.PLL_USB,
|
||||||
|
&mut ctx.device.RESETS,
|
||||||
|
&mut watchdog,
|
||||||
|
)
|
||||||
|
.ok()
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
// Init LED pin
|
||||||
|
let sio = Sio::new(ctx.device.SIO);
|
||||||
|
let gpioa = rp_pico::Pins::new(
|
||||||
|
ctx.device.IO_BANK0,
|
||||||
|
ctx.device.PADS_BANK0,
|
||||||
|
sio.gpio_bank0,
|
||||||
|
&mut ctx.device.RESETS,
|
||||||
|
);
|
||||||
|
let mut led = gpioa.led.into_push_pull_output();
|
||||||
|
led.set_low().unwrap();
|
||||||
|
|
||||||
|
// Init I2C pins
|
||||||
|
let sda_pin = gpioa.gpio2.into_mode::<gpio::FunctionI2C>();
|
||||||
|
let scl_pin = gpioa.gpio3.into_mode::<gpio::FunctionI2C>();
|
||||||
|
|
||||||
|
// Init I2C itself, using MaybeUninit to overwrite the previously
|
||||||
|
// uninitialized i2c_ctx variable without dropping its value
|
||||||
|
// (i2c_ctx definined in init local resources above)
|
||||||
|
let i2c_tmp: &'static mut _ = ctx.local.i2c_ctx.write(I2C::i2c1(
|
||||||
|
ctx.device.I2C1,
|
||||||
|
sda_pin,
|
||||||
|
scl_pin,
|
||||||
|
100.kHz(),
|
||||||
|
&mut ctx.device.RESETS,
|
||||||
|
&clocks.system_clock,
|
||||||
|
));
|
||||||
|
|
||||||
|
// Spawn heartbeat task
|
||||||
|
heartbeat::spawn().ok();
|
||||||
|
|
||||||
|
// Return resources and timer
|
||||||
|
(Shared {}, Local { led, i2c: i2c_tmp })
|
||||||
|
}
|
||||||
|
|
||||||
|
#[task(local = [i2c, led])]
|
||||||
|
async fn heartbeat(ctx: heartbeat::Context) {
|
||||||
|
// Flicker the built-in LED
|
||||||
|
_ = ctx.local.led.toggle();
|
||||||
|
|
||||||
|
// Congrats, you can use your i2c and have access to it here,
|
||||||
|
// now to do something with it!
|
||||||
|
|
||||||
|
// Re-spawn this task after 1 second
|
||||||
|
Timer::delay(1000.millis()).await;
|
||||||
|
}
|
||||||
|
}
|
45
examples/stm32f3_blinky/.cargo/config.toml
Normal file
45
examples/stm32f3_blinky/.cargo/config.toml
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
[target.thumbv7m-none-eabi]
|
||||||
|
# uncomment this to make `cargo run` execute programs on QEMU
|
||||||
|
# runner = "qemu-system-arm -cpu cortex-m3 -machine lm3s6965evb -nographic -semihosting-config enable=on,target=native -kernel"
|
||||||
|
|
||||||
|
[target.'cfg(all(target_arch = "arm", target_os = "none"))']
|
||||||
|
# uncomment ONE of these three option to make `cargo run` start a GDB session
|
||||||
|
# which option to pick depends on your system
|
||||||
|
# runner = "arm-none-eabi-gdb -q -x openocd.gdb"
|
||||||
|
# runner = "gdb-multiarch -q -x openocd.gdb"
|
||||||
|
# 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",
|
||||||
|
|
||||||
|
# if you run into problems with LLD switch to the GNU linker by commenting out
|
||||||
|
# this line
|
||||||
|
# "-C", "linker=arm-none-eabi-ld",
|
||||||
|
|
||||||
|
# if you need to link to pre-compiled C libraries provided by a C toolchain
|
||||||
|
# use GCC as the linker by commenting out both lines above and then
|
||||||
|
# uncommenting the three lines below
|
||||||
|
# "-C", "linker=arm-none-eabi-gcc",
|
||||||
|
# "-C", "link-arg=-Wl,-Tlink.x",
|
||||||
|
# "-C", "link-arg=-nostartfiles",
|
||||||
|
]
|
||||||
|
|
||||||
|
[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 = "thumbv8m.base-none-eabi" # Cortex-M23
|
||||||
|
# target = "thumbv8m.main-none-eabi" # Cortex-M33 (no FPU)
|
||||||
|
# target = "thumbv8m.main-none-eabihf" # Cortex-M33 (with FPU)
|
||||||
|
|
||||||
|
# thumbv7m-none-eabi is not coming with core and alloc, compile myself
|
||||||
|
[unstable]
|
||||||
|
mtime-on-use = true
|
||||||
|
build-std = ["core", "alloc"]
|
35
examples/stm32f3_blinky/Cargo.toml
Normal file
35
examples/stm32f3_blinky/Cargo.toml
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
[package]
|
||||||
|
authors = ["Simsys <winfried.simon@gmail.com>"]
|
||||||
|
edition = "2021"
|
||||||
|
readme = "README.md"
|
||||||
|
name = "stm32f3-blinky"
|
||||||
|
version = "0.1.0"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
embedded-hal = "0.2.7"
|
||||||
|
rtic = { git = "https://github.com/rtic-rs/rtic", features = ["thumbv7-backend"] }
|
||||||
|
rtic-monotonics = { git = "https://github.com/rtic-rs/rtic", features = ["cortex-m-systick"] }
|
||||||
|
panic-rtt-target = { version = "0.1.2", features = ["cortex-m"] }
|
||||||
|
rtt-target = { version = "0.3.1", features = ["cortex-m"] }
|
||||||
|
|
||||||
|
[dependencies.stm32f3xx-hal]
|
||||||
|
features = ["stm32f303xc", "rt"]
|
||||||
|
version = "0.9.2"
|
||||||
|
|
||||||
|
# this lets you use `cargo fix`!
|
||||||
|
[[bin]]
|
||||||
|
name = "stm32f3-blinky"
|
||||||
|
test = false
|
||||||
|
bench = false
|
||||||
|
|
||||||
|
[profile.dev]
|
||||||
|
opt-level = 1
|
||||||
|
codegen-units = 16
|
||||||
|
debug = true
|
||||||
|
lto = false
|
||||||
|
|
||||||
|
[profile.release]
|
||||||
|
opt-level = "s" # optimize for size
|
||||||
|
codegen-units = 1 # better optimizations
|
||||||
|
debug = true # symbols are nice and they don't increase the size on Flash
|
||||||
|
lto = true # better optimizations
|
9
examples/stm32f3_blinky/Embed.toml
Normal file
9
examples/stm32f3_blinky/Embed.toml
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
[default.general]
|
||||||
|
chip = "stm32f303re"
|
||||||
|
|
||||||
|
|
||||||
|
[default.rtt]
|
||||||
|
enabled = true
|
||||||
|
|
||||||
|
[default.gdb]
|
||||||
|
enabled = false
|
19
examples/stm32f3_blinky/README.md
Normal file
19
examples/stm32f3_blinky/README.md
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
# STM32F3 RTIC Blink example
|
||||||
|
|
||||||
|
Working example of simple LED blinking application for STM32 F303 Nucleo-64 board based on the STM32F303RE chip. Example uses schedule API and peripherials access. This example is based on blue-pill blinky example.
|
||||||
|
|
||||||
|
## How-to
|
||||||
|
|
||||||
|
### Build
|
||||||
|
|
||||||
|
Run `cargo +nightly build` to compile the code. If you run it for the first time, it will take some time to download and compile dependencies.
|
||||||
|
|
||||||
|
After that, you can use for example the cargo-embed tool to flash and run it
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ cargo +nightly embed
|
||||||
|
```
|
||||||
|
|
||||||
|
### Setup environment, flash and run program
|
||||||
|
|
||||||
|
In the [Discovery Book](https://rust-embedded.github.io/discovery) you find all needed informations to setup the environment, flash the controler and run the program.
|
5
examples/stm32f3_blinky/memory.x
Normal file
5
examples/stm32f3_blinky/memory.x
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
MEMORY
|
||||||
|
{
|
||||||
|
FLASH : ORIGIN = 0x08000000, LENGTH = 256K
|
||||||
|
RAM : ORIGIN = 0x20000000, LENGTH = 40K
|
||||||
|
}
|
74
examples/stm32f3_blinky/src/main.rs
Normal file
74
examples/stm32f3_blinky/src/main.rs
Normal file
|
@ -0,0 +1,74 @@
|
||||||
|
#![deny(unsafe_code)]
|
||||||
|
#![deny(warnings)]
|
||||||
|
#![no_main]
|
||||||
|
#![no_std]
|
||||||
|
#![feature(type_alias_impl_trait)]
|
||||||
|
|
||||||
|
use panic_rtt_target as _;
|
||||||
|
use rtic::app;
|
||||||
|
use rtic_monotonics::systick::*;
|
||||||
|
use rtt_target::{rprintln, rtt_init_print};
|
||||||
|
use stm32f3xx_hal::gpio::{Output, PushPull, PA5};
|
||||||
|
use stm32f3xx_hal::prelude::*;
|
||||||
|
|
||||||
|
#[app(device = stm32f3xx_hal::pac, peripherals = true, dispatchers = [SPI1])]
|
||||||
|
mod app {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
rtic_monotonics::make_systick_handler!();
|
||||||
|
|
||||||
|
#[shared]
|
||||||
|
struct Shared {}
|
||||||
|
|
||||||
|
#[local]
|
||||||
|
struct Local {
|
||||||
|
led: PA5<Output<PushPull>>,
|
||||||
|
state: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[init]
|
||||||
|
fn init(cx: init::Context) -> (Shared, Local) {
|
||||||
|
// Setup clocks
|
||||||
|
let mut flash = cx.device.FLASH.constrain();
|
||||||
|
let mut rcc = cx.device.RCC.constrain();
|
||||||
|
|
||||||
|
Systick::start(cx.core.SYST, 36_000_000); // default STM32F303 clock-rate is 36MHz
|
||||||
|
|
||||||
|
rtt_init_print!();
|
||||||
|
rprintln!("init");
|
||||||
|
|
||||||
|
let _clocks = rcc
|
||||||
|
.cfgr
|
||||||
|
.use_hse(8.MHz())
|
||||||
|
.sysclk(36.MHz())
|
||||||
|
.pclk1(36.MHz())
|
||||||
|
.freeze(&mut flash.acr);
|
||||||
|
|
||||||
|
// Setup LED
|
||||||
|
let mut gpioa = cx.device.GPIOA.split(&mut rcc.ahb);
|
||||||
|
let mut led = gpioa
|
||||||
|
.pa5
|
||||||
|
.into_push_pull_output(&mut gpioa.moder, &mut gpioa.otyper);
|
||||||
|
led.set_high().unwrap();
|
||||||
|
|
||||||
|
// Schedule the blinking task
|
||||||
|
blink::spawn().ok();
|
||||||
|
|
||||||
|
(Shared {}, Local { led, state: false })
|
||||||
|
}
|
||||||
|
|
||||||
|
#[task(local = [led, state])]
|
||||||
|
async fn blink(cx: blink::Context) {
|
||||||
|
loop {
|
||||||
|
rprintln!("blink");
|
||||||
|
if *cx.local.state {
|
||||||
|
cx.local.led.set_high().unwrap();
|
||||||
|
*cx.local.state = false;
|
||||||
|
} else {
|
||||||
|
cx.local.led.set_low().unwrap();
|
||||||
|
*cx.local.state = true;
|
||||||
|
}
|
||||||
|
Systick::delay(1000.millis()).await;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue