cortex-m-rtic blinky

This commit is contained in:
Jörn-Michael Miehe 2024-03-08 16:59:02 +00:00
parent 858923be34
commit 6bc62383bc
3 changed files with 265 additions and 81 deletions

167
bluepill-rs/Cargo.lock generated
View file

@ -2,13 +2,28 @@
# It is not intended for manual editing. # It is not intended for manual editing.
version = 3 version = 3
[[package]]
name = "atomic-polyfill"
version = "1.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8cf2bce30dfe09ef0bfaef228b9d414faaf7e563035494d7fe092dba54b300f4"
dependencies = [
"critical-section",
]
[[package]]
name = "autocfg"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
[[package]] [[package]]
name = "bare-metal" name = "bare-metal"
version = "0.2.5" version = "0.2.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5deb64efa5bd81e31fcd1938615a6d98c82eafcbcd787162b6f63b91d6bac5b3" checksum = "5deb64efa5bd81e31fcd1938615a6d98c82eafcbcd787162b6f63b91d6bac5b3"
dependencies = [ dependencies = [
"rustc_version", "rustc_version 0.2.3",
] ]
[[package]] [[package]]
@ -35,14 +50,17 @@ version = "0.1.0"
dependencies = [ dependencies = [
"cortex-m", "cortex-m",
"cortex-m-rt", "cortex-m-rt",
"cortex-m-rtic",
"defmt", "defmt",
"defmt-ringbuf", "defmt-ringbuf",
"defmt-rtt", "defmt-rtt",
"embedded-hal 1.0.0", "embedded-hal 1.0.0",
"heapless", "heapless 0.8.0",
"nb 1.1.0", "nb 1.1.0",
"panic-halt", "panic-halt",
"stm32f1",
"stm32f1xx-hal", "stm32f1xx-hal",
"systick-monotonic",
] ]
[[package]] [[package]]
@ -96,6 +114,34 @@ dependencies = [
"syn 1.0.109", "syn 1.0.109",
] ]
[[package]]
name = "cortex-m-rtic"
version = "1.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d696ae7390bdb9f7978f71ca7144256a2c4616240a6df9002da3c451f9fc8f02"
dependencies = [
"bare-metal 1.0.0",
"cortex-m",
"cortex-m-rtic-macros",
"heapless 0.7.17",
"rtic-core",
"rtic-monotonic",
"version_check",
]
[[package]]
name = "cortex-m-rtic-macros"
version = "1.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "eefb40b1ca901c759d29526e5c8a0a1b246c20caaa5b4cc5d0f0b94debecd4c7"
dependencies = [
"proc-macro-error",
"proc-macro2",
"quote",
"rtic-syntax",
"syn 1.0.109",
]
[[package]] [[package]]
name = "critical-section" name = "critical-section"
version = "1.1.2" version = "1.1.2"
@ -203,6 +249,15 @@ version = "2.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1d758ba1b47b00caf47f24925c0074ecb20d6dfcffe7f6d53395c0465674841a" checksum = "1d758ba1b47b00caf47f24925c0074ecb20d6dfcffe7f6d53395c0465674841a"
[[package]]
name = "hash32"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b0c35f58762feb77d74ebe43bdbc3210f09be9fe6742234d573bacc26ed92b67"
dependencies = [
"byteorder",
]
[[package]] [[package]]
name = "hash32" name = "hash32"
version = "0.3.1" version = "0.3.1"
@ -212,16 +267,55 @@ dependencies = [
"byteorder", "byteorder",
] ]
[[package]]
name = "hashbrown"
version = "0.12.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
[[package]]
name = "heapless"
version = "0.7.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cdc6457c0eb62c71aac4bc17216026d8410337c4126773b9c5daba343f17964f"
dependencies = [
"atomic-polyfill",
"hash32 0.2.1",
"rustc_version 0.4.0",
"spin",
"stable_deref_trait",
]
[[package]] [[package]]
name = "heapless" name = "heapless"
version = "0.8.0" version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0bfb9eb618601c89945a70e254898da93b13be0388091d42117462b265bb3fad" checksum = "0bfb9eb618601c89945a70e254898da93b13be0388091d42117462b265bb3fad"
dependencies = [ dependencies = [
"hash32", "hash32 0.3.1",
"stable_deref_trait", "stable_deref_trait",
] ]
[[package]]
name = "indexmap"
version = "1.9.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99"
dependencies = [
"autocfg",
"hashbrown",
]
[[package]]
name = "lock_api"
version = "0.4.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45"
dependencies = [
"autocfg",
"scopeguard",
]
[[package]] [[package]]
name = "nb" name = "nb"
version = "0.1.3" version = "0.1.3"
@ -285,15 +379,54 @@ dependencies = [
"proc-macro2", "proc-macro2",
] ]
[[package]]
name = "rtic-core"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d9369355b04d06a3780ec0f51ea2d225624db777acbc60abd8ca4832da5c1a42"
[[package]]
name = "rtic-monotonic"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fb8b0b822d1a366470b9cea83a1d4e788392db763539dc4ba022bcc787fece82"
[[package]]
name = "rtic-syntax"
version = "1.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5f5e215601dc467752c2bddc6284a622c6f3d2bab569d992adcd5ab7e4cb9478"
dependencies = [
"indexmap",
"proc-macro2",
"quote",
"syn 1.0.109",
]
[[package]] [[package]]
name = "rustc_version" name = "rustc_version"
version = "0.2.3" version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a"
dependencies = [ dependencies = [
"semver", "semver 0.9.0",
] ]
[[package]]
name = "rustc_version"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366"
dependencies = [
"semver 1.0.22",
]
[[package]]
name = "scopeguard"
version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
[[package]] [[package]]
name = "semver" name = "semver"
version = "0.9.0" version = "0.9.0"
@ -303,12 +436,27 @@ dependencies = [
"semver-parser", "semver-parser",
] ]
[[package]]
name = "semver"
version = "1.0.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca"
[[package]] [[package]]
name = "semver-parser" name = "semver-parser"
version = "0.7.0" version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
[[package]]
name = "spin"
version = "0.9.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67"
dependencies = [
"lock_api",
]
[[package]] [[package]]
name = "stable_deref_trait" name = "stable_deref_trait"
version = "1.2.0" version = "1.2.0"
@ -380,6 +528,17 @@ dependencies = [
"unicode-ident", "unicode-ident",
] ]
[[package]]
name = "systick-monotonic"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "67fb822d5c615a0ae3a4795ee5b1d06381c7faf488d861c0a4fa8e6a88d5ff84"
dependencies = [
"cortex-m",
"fugit",
"rtic-monotonic",
]
[[package]] [[package]]
name = "thiserror" name = "thiserror"
version = "1.0.57" version = "1.0.57"

View file

@ -9,15 +9,17 @@ edition = "2021"
defmt-ringbuf = { path = "../defmt-ringbuf", optional = true } defmt-ringbuf = { path = "../defmt-ringbuf", optional = true }
embedded-hal = "1.0.0" embedded-hal = "1.0.0"
stm32f1 = { version = "0.15", features = ["stm32f103", "rt"] }
stm32f1xx-hal = { version = "0.10.0", features = ["rt", "stm32f103", "medium"] }
nb = "1" nb = "1"
cortex-m = { version = "0.7.6", features = ["critical-section-single-core"] } cortex-m = { version = "0.7.6", features = ["critical-section-single-core"] }
cortex-m-rt = { version = "0.7.1", features = ["device"] } cortex-m-rt = { version = "0.7.1", features = ["device"] }
cortex-m-rtic = "1.1.4"
systick-monotonic = "1.0.1"
defmt = { version = "0.3", features = ["encoding-rzcobs"] } defmt = { version = "0.3", features = ["encoding-rzcobs"] }
defmt-rtt = { version = "0.4", optional = true } defmt-rtt = { version = "0.4", optional = true }
heapless = "0.8.0" heapless = "0.8.0"
# Panic behaviour, see https://crates.io/keywords/panic-impl for alternatives # Panic behaviour, see https://crates.io/keywords/panic-impl for alternatives
panic-halt = "0.2.0" panic-halt = "0.2.0"
[dependencies.stm32f1xx-hal]
version = "0.10.0"
features = ["rt", "stm32f103", "medium"]

View file

@ -5,32 +5,44 @@
//! Note: Without additional hardware, PC13 should not be used to drive an LED, see page 5.1.2 of //! Note: Without additional hardware, PC13 should not be used to drive an LED, see page 5.1.2 of
//! the reference manual for an explanation. This is not an issue on the blue pill. //! the reference manual for an explanation. This is not an issue on the blue pill.
#![deny(unsafe_code)] // #![deny(unsafe_code)]
#![no_std] #![no_std]
#![no_main] #![no_main]
use cortex_m::singleton; // use cortex_m::singleton;
use panic_halt as _; use panic_halt as _;
use stm32f1xx_hal::{dma, gpio, pac, prelude::*, rcc, serial, timer};
use nb::block; use systick_monotonic::Systick;
use cortex_m_rt::entry;
use stm32f1xx_hal::{pac, prelude::*, rcc, serial, timer::Timer};
mod i2c_reg_slave; mod i2c_reg_slave;
mod i2c_slave; mod i2c_slave;
#[entry] // static mut BUFFER: Option<&mut [u8; 256]> = None;
fn main() -> ! {
// Get access to the core peripherals from the cortex-m crate
let cp = cortex_m::Peripherals::take().unwrap();
// Get access to the device specific peripherals from the peripheral access crate
let dp = pac::Peripherals::take().unwrap();
#[rtic::app(device = stm32f1::stm32f103, peripherals = true)]
mod app {
use super::*;
// A monotonic timer to enable scheduling in RTIC
#[monotonic(binds = SysTick, default = true)]
type MyMono = Systick<100>; // 100 Hz / 10 ms granularity
#[shared]
struct Shared {}
#[local]
struct Local {
tx: dma::TxDma<serial::Tx<pac::USART1>, dma::dma1::C4>,
delay: timer::Delay<pac::TIM1, 1_000_000>,
led: gpio::Pin<'C', 13, gpio::Output>,
}
#[init]
fn init(cx: init::Context) -> (Shared, Local, init::Monotonics) {
// Take ownership over the raw flash and rcc devices and convert them into the corresponding // Take ownership over the raw flash and rcc devices and convert them into the corresponding
// HAL structs // HAL structs
let mut flash = dp.FLASH.constrain(); let mut flash = cx.device.FLASH.constrain();
let rcc = dp.RCC.constrain(); let rcc = cx.device.RCC.constrain();
// Freeze the configuration of all the clocks in the system and store the frozen frequencies in // Freeze the configuration of all the clocks in the system and store the frozen frequencies in
// `clocks` // `clocks`
@ -49,19 +61,22 @@ fn main() -> ! {
&mut flash.acr, &mut flash.acr,
); );
// Acquire the peripherals // Initialize the monotonic
let mut gpioa = dp.GPIOA.split(); let mono = Systick::new(cx.core.SYST, clocks.sysclk().to_Hz());
let mut gpioc = dp.GPIOC.split();
let mut afio = dp.AFIO.constrain(); // Acquire the peripherals
let dma1 = dp.DMA1.split(); let mut gpioa = cx.device.GPIOA.split();
let mut gpioc = cx.device.GPIOC.split();
let mut afio = cx.device.AFIO.constrain();
let dma1 = cx.device.DMA1.split();
// USART1 // USART1
let tx = gpioa.pa9.into_alternate_push_pull(&mut gpioa.crh); let tx = gpioa.pa9.into_alternate_push_pull(&mut gpioa.crh);
let rx = gpioa.pa10; //.into_pull_up_input(&mut gpioa.crh); let rx = gpioa.pa10; //.into_pull_up_input(&mut gpioa.crh);
let serial = serial::Serial::new( let serial = serial::Serial::new(
dp.USART1, cx.device.USART1,
(tx, rx), (tx, rx),
&mut afio.mapr, &mut afio.mapr,
serial::Config { serial::Config {
@ -71,31 +86,39 @@ fn main() -> ! {
&clocks, &clocks,
); );
let mut tx = serial.tx.with_dma(dma1.4); // unsafe {
let mut buf = singleton!(: [u8; 255] = [0b01010101; 255]).unwrap(); // BUFFER = Some(singleton!(: [u8; 256] = [0b01010101; 256]).unwrap());
// }
(
Shared {},
Local {
tx: serial.tx.with_dma(dma1.4),
// Configure timer
delay: cx.device.TIM1.delay_us(&clocks),
// Configure gpio C pin 13 as a push-pull output. The `crh` register is passed to the function // Configure gpio C pin 13 as a push-pull output. The `crh` register is passed to the function
// in order to configure the port. For pins 0-7, crl should be passed instead. // in order to configure the port. For pins 0-7, crl should be passed instead.
let mut led = gpioc.pc13.into_push_pull_output(&mut gpioc.crh); led: gpioc.pc13.into_push_pull_output(&mut gpioc.crh),
},
// Configure the syst timer to trigger an update every second init::Monotonics(mono),
let mut timer = Timer::syst(cp.SYST, &clocks).counter_hz(); )
// at 72 MHz, timer of 1 Hz overflows, use 10 Hz instead (8 Hz experimental minimum) }
timer.start(10.Hz()).unwrap();
#[idle(local = [tx, delay, led])]
fn idle(cx: idle::Context) -> ! {
// Wait for the timer to trigger an update and change the state of the LED // Wait for the timer to trigger an update and change the state of the LED
loop { loop {
let xfer = tx.write(buf); // let xfer = cx.shared.tx.lock(|tx| tx.write(BUFFER.unwrap()));
for _ in 0..10 {
block!(timer.wait()).unwrap();
}
led.set_high();
for _ in 0..10 { cx.local.delay.delay(1u32.secs());
block!(timer.wait()).unwrap(); cx.local.led.set_high();
}
led.set_low();
(buf, tx) = xfer.wait(); cx.local.delay.delay(1u32.secs());
cx.local.led.set_low();
// xfer.wait();
}
} }
} }