Fix STM32 Monotonic for peripherals with only two Clock Compare modules (#960)

* Update dependencies of stm32g0 timer example

* Replace obsolete probe-run with probe-rs run

* Modify stm32 monotonic to work with timers that have only 2 compare modules

* Add changelog

* Fix typo
This commit is contained in:
Finomnis 2024-07-05 18:19:51 +02:00 committed by GitHub
parent 624f643a97
commit 5cafe9dd0b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 44 additions and 40 deletions

View file

@ -1,6 +1,6 @@
[target.'cfg(all(target_arch = "arm", target_os = "none"))'] [target.'cfg(all(target_arch = "arm", target_os = "none"))']
# TODO(2) replace `$CHIP` with your chip's name (see `probe-run --list-chips` output) # TODO(2) replace `$CHIP` with your chip's name (see `probe-run --list-chips` output)
runner = "probe-run --chip STM32G030F6Px" runner = "probe-rs run --chip STM32G030F6Px"
rustflags = [ rustflags = [
"-C", "linker=flip-link", "-C", "linker=flip-link",
"-C", "link-arg=-Tlink.x", "-C", "link-arg=-Tlink.x",

View file

@ -76,9 +76,9 @@ checksum = "7059fff8937831a9ae6f0fe4d658ffabf58f2ca96aa9dec1c889f936f705f216"
[[package]] [[package]]
name = "defmt" name = "defmt"
version = "0.3.6" version = "0.3.8"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3939552907426de152b3c2c6f51ed53f98f448babd26f28694c95f5906194595" checksum = "a99dd22262668b887121d4672af5a64b238f026099f1a2a1b322066c9ecfe9e0"
dependencies = [ dependencies = [
"bitflags", "bitflags",
"defmt-macros", "defmt-macros",
@ -86,15 +86,15 @@ dependencies = [
[[package]] [[package]]
name = "defmt-macros" name = "defmt-macros"
version = "0.3.7" version = "0.3.9"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "18bdc7a7b92ac413e19e95240e75d3a73a8d8e78aa24a594c22cbb4d44b4bbda" checksum = "e3a9f309eff1f79b3ebdf252954d90ae440599c26c2c553fe87a2d17195f2dcb"
dependencies = [ dependencies = [
"defmt-parser", "defmt-parser",
"proc-macro-error", "proc-macro-error",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.51", "syn 2.0.68",
] ]
[[package]] [[package]]
@ -108,9 +108,9 @@ dependencies = [
[[package]] [[package]]
name = "defmt-rtt" name = "defmt-rtt"
version = "0.4.0" version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "609923761264dd99ed9c7d209718cda4631c5fe84668e0f0960124cbb844c49f" checksum = "bab697b3dbbc1750b7c8b821aa6f6e7f2480b47a99bc057a2ed7b170ebef0c51"
dependencies = [ dependencies = [
"critical-section", "critical-section",
"defmt", "defmt",
@ -188,15 +188,15 @@ checksum = "1d758ba1b47b00caf47f24925c0074ecb20d6dfcffe7f6d53395c0465674841a"
[[package]] [[package]]
name = "hashbrown" name = "hashbrown"
version = "0.14.3" version = "0.14.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
[[package]] [[package]]
name = "indexmap" name = "indexmap"
version = "2.2.3" version = "2.2.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "233cf39063f058ea2caae4091bf4a3ef70a653afbc026f5c4a4135d114e3c177" checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26"
dependencies = [ dependencies = [
"equivalent", "equivalent",
"hashbrown", "hashbrown",
@ -219,9 +219,9 @@ checksum = "8d5439c4ad607c3c23abf66de8c8bf57ba8adcd1f129e699851a6e43935d339d"
[[package]] [[package]]
name = "panic-probe" name = "panic-probe"
version = "0.3.1" version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "aa6fa5645ef5a760cd340eaa92af9c1ce131c8c09e7f8926d8a24b59d26652b9" checksum = "4047d9235d1423d66cc97da7d07eddb54d4f154d6c13805c6d0793956f4f25b0"
dependencies = [ dependencies = [
"cortex-m", "cortex-m",
"defmt", "defmt",
@ -229,9 +229,9 @@ dependencies = [
[[package]] [[package]]
name = "pin-project-lite" name = "pin-project-lite"
version = "0.2.13" version = "0.2.14"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02"
[[package]] [[package]]
name = "pin-utils" name = "pin-utils"
@ -271,18 +271,18 @@ dependencies = [
[[package]] [[package]]
name = "proc-macro2" name = "proc-macro2"
version = "1.0.78" version = "1.0.86"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77"
dependencies = [ dependencies = [
"unicode-ident", "unicode-ident",
] ]
[[package]] [[package]]
name = "quote" name = "quote"
version = "1.0.35" version = "1.0.36"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
] ]
@ -321,12 +321,12 @@ dependencies = [
"proc-macro-error", "proc-macro-error",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.51", "syn 2.0.68",
] ]
[[package]] [[package]]
name = "rtic-monotonics" name = "rtic-monotonics"
version = "2.0.0" version = "2.0.1"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"cortex-m", "cortex-m",
@ -439,9 +439,9 @@ dependencies = [
[[package]] [[package]]
name = "syn" name = "syn"
version = "2.0.51" version = "2.0.68"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6ab617d94515e94ae53b8406c628598680aa0c9587474ecbe58188f7b345d66c" checksum = "901fa70d88b9d6c98022e23b4136f9f3e54e4662c3bc1bd1d84a42a9a0f0c1e9"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@ -450,22 +450,22 @@ dependencies = [
[[package]] [[package]]
name = "thiserror" name = "thiserror"
version = "1.0.57" version = "1.0.61"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b" checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709"
dependencies = [ dependencies = [
"thiserror-impl", "thiserror-impl",
] ]
[[package]] [[package]]
name = "thiserror-impl" name = "thiserror-impl"
version = "1.0.57" version = "1.0.61"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81" checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.51", "syn 2.0.68",
] ]
[[package]] [[package]]

View file

@ -9,22 +9,22 @@ version = "0.1.0"
[dependencies.rtic] [dependencies.rtic]
path = "../../rtic" path = "../../rtic"
version = "2.0.1" version = "2.1.1"
features = ["thumbv6-backend"] features = ["thumbv6-backend"]
[dependencies.rtic-monotonics] [dependencies.rtic-monotonics]
path = "../../rtic-monotonics" path = "../../rtic-monotonics"
version = "2.0.0" version = "2.0.1"
features = ["stm32g030f6", "stm32_tim3"] features = ["stm32g030f6", "stm32_tim3"]
[dependencies] [dependencies]
cortex-m = { version = "0.7.7", features = ["critical-section-single-core"] } cortex-m = { version = "0.7.7", features = ["critical-section-single-core"] }
cortex-m-rt = "0.7.3" cortex-m-rt = "0.7.3"
defmt = "0.3.4" defmt = "0.3.8"
defmt-rtt = "0.4.0" defmt-rtt = "0.4.1"
fugit = "0.3.7" fugit = "0.3.7"
panic-probe = { version = "0.3.1", features = ["print-defmt"] } panic-probe = { version = "0.3.2", features = ["print-defmt"] }
portable-atomic = { version = "1", features = ["unsafe-assume-single-core"] } portable-atomic = { version = "1", features = ["unsafe-assume-single-core"] }
stm32g0xx-hal = { version = "0.2.0", features = ["rt", "stm32g030"] } stm32g0xx-hal = { version = "0.2.0", features = ["rt", "stm32g030"] }

View file

@ -7,6 +7,10 @@ For each category, *Added*, *Changed*, *Fixed* add new entries at the top!
## Unreleased ## Unreleased
### Fixed
- Fix `stm32` monotonic for timer peripherals with only two clock compare modules
## v2.0.1 - 2024-06-02 ## v2.0.1 - 2024-06-02
### Changed ### Changed

View file

@ -94,7 +94,7 @@ impl TimerQueueBackend for TimerBackend {
// Since the timer may or may not overflow based on the requested compare val, we check // Since the timer may or may not overflow based on the requested compare val, we check
// how many ticks are left. // how many ticks are left.
// `wrapping_sup` takes care of the u64 integer overflow special case. // `wrapping_sub` takes care of the u64 integer overflow special case.
let val = if instant.wrapping_sub(now) <= MAX { let val = if instant.wrapping_sub(now) <= MAX {
instant & MAX instant & MAX
} else { } else {

View file

@ -240,8 +240,8 @@ macro_rules! make_timer {
$timer.dier().modify(|r| r.set_uie(true)); $timer.dier().modify(|r| r.set_uie(true));
// Configure and enable half-period interrupt // Configure and enable half-period interrupt
$timer.ccr(2).write(|r| r.set_ccr(($bits::MAX - ($bits::MAX >> 1)).into())); $timer.ccr(0).write(|r| r.set_ccr(($bits::MAX - ($bits::MAX >> 1)).into()));
$timer.dier().modify(|r| r.set_ccie(2, true)); $timer.dier().modify(|r| r.set_ccie(0, true));
// Trigger an update event to load the prescaler value to the clock. // Trigger an update event to load the prescaler value to the clock.
$timer.egr().write(|r| r.set_ug(true)); $timer.egr().write(|r| r.set_ug(true));
@ -282,7 +282,7 @@ macro_rules! make_timer {
let now = Self::now(); let now = Self::now();
// Since the timer may or may not overflow based on the requested compare val, we check how many ticks are left. // Since the timer may or may not overflow based on the requested compare val, we check how many ticks are left.
// `wrapping_sup` takes care of the u64 integer overflow special case. // `wrapping_sub` takes care of the u64 integer overflow special case.
let val = if instant.wrapping_sub(now) <= ($bits::MAX as u64) { let val = if instant.wrapping_sub(now) <= ($bits::MAX as u64) {
instant as $bits instant as $bits
} else { } else {
@ -317,8 +317,8 @@ macro_rules! make_timer {
assert!(prev % 2 == 1, "Monotonic must have missed an interrupt!"); assert!(prev % 2 == 1, "Monotonic must have missed an interrupt!");
} }
// Half period // Half period
if $timer.sr().read().ccif(2) { if $timer.sr().read().ccif(0) {
$timer.sr().modify(|r| r.set_ccif(2, false)); $timer.sr().modify(|r| r.set_ccif(0, false));
let prev = $overflow.fetch_add(1, Ordering::Relaxed); let prev = $overflow.fetch_add(1, Ordering::Relaxed);
assert!(prev % 2 == 0, "Monotonic must have missed an interrupt!"); assert!(prev % 2 == 0, "Monotonic must have missed an interrupt!");
} }