mirror of
https://github.com/rtic-rs/rtic.git
synced 2025-12-16 21:05:35 +01:00
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:
parent
624f643a97
commit
5cafe9dd0b
6 changed files with 44 additions and 40 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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!");
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue