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

@ -7,6 +7,10 @@ For each category, *Added*, *Changed*, *Fixed* add new entries at the top!
## Unreleased
### Fixed
- Fix `stm32` monotonic for timer peripherals with only two clock compare modules
## v2.0.1 - 2024-06-02
### 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
// 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 {
instant & MAX
} else {

View file

@ -240,8 +240,8 @@ macro_rules! make_timer {
$timer.dier().modify(|r| r.set_uie(true));
// Configure and enable half-period interrupt
$timer.ccr(2).write(|r| r.set_ccr(($bits::MAX - ($bits::MAX >> 1)).into()));
$timer.dier().modify(|r| r.set_ccie(2, true));
$timer.ccr(0).write(|r| r.set_ccr(($bits::MAX - ($bits::MAX >> 1)).into()));
$timer.dier().modify(|r| r.set_ccie(0, true));
// Trigger an update event to load the prescaler value to the clock.
$timer.egr().write(|r| r.set_ug(true));
@ -282,7 +282,7 @@ macro_rules! make_timer {
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.
// `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) {
instant as $bits
} else {
@ -317,8 +317,8 @@ macro_rules! make_timer {
assert!(prev % 2 == 1, "Monotonic must have missed an interrupt!");
}
// Half period
if $timer.sr().read().ccif(2) {
$timer.sr().modify(|r| r.set_ccif(2, false));
if $timer.sr().read().ccif(0) {
$timer.sr().modify(|r| r.set_ccif(0, false));
let prev = $overflow.fetch_add(1, Ordering::Relaxed);
assert!(prev % 2 == 0, "Monotonic must have missed an interrupt!");
}