should work now..
Some checks failed
Rust/va416xx-rs/pipeline/pr-main There was a failure building this commit
Some checks failed
Rust/va416xx-rs/pipeline/pr-main There was a failure building this commit
This commit is contained in:
parent
9b26f79bed
commit
adc0e68ebd
@ -3,6 +3,7 @@ use core::{
|
|||||||
cell::Cell,
|
cell::Cell,
|
||||||
mem, ptr,
|
mem, ptr,
|
||||||
sync::atomic::{AtomicU32, AtomicU8, Ordering},
|
sync::atomic::{AtomicU32, AtomicU8, Ordering},
|
||||||
|
time,
|
||||||
};
|
};
|
||||||
use critical_section::CriticalSection;
|
use critical_section::CriticalSection;
|
||||||
use embassy_sync::blocking_mutex::raw::CriticalSectionRawMutex;
|
use embassy_sync::blocking_mutex::raw::CriticalSectionRawMutex;
|
||||||
@ -14,7 +15,10 @@ use va416xx_hal::{
|
|||||||
enable_interrupt,
|
enable_interrupt,
|
||||||
irq_router::enable_and_init_irq_router,
|
irq_router::enable_and_init_irq_router,
|
||||||
pac::{self, interrupt},
|
pac::{self, interrupt},
|
||||||
pwm::{assert_tim_reset, deassert_tim_reset, enable_tim_clk, ValidTim},
|
pwm::{
|
||||||
|
assert_tim_reset, assert_tim_reset_for_two_cycles, deassert_tim_reset, enable_tim_clk,
|
||||||
|
ValidTim,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
pub type TimekeeperClk = pac::Tim15;
|
pub type TimekeeperClk = pac::Tim15;
|
||||||
@ -92,33 +96,25 @@ impl TimerDriverEmbassy {
|
|||||||
clocks: &Clocks,
|
clocks: &Clocks,
|
||||||
) {
|
) {
|
||||||
enable_tim_clk(syscfg, TimekeeperClk::TIM_ID);
|
enable_tim_clk(syscfg, TimekeeperClk::TIM_ID);
|
||||||
assert_tim_reset(syscfg, TimekeeperClk::TIM_ID);
|
assert_tim_reset_for_two_cycles(syscfg, TimekeeperClk::TIM_ID);
|
||||||
cortex_m::asm::nop();
|
|
||||||
cortex_m::asm::nop();
|
|
||||||
deassert_tim_reset(syscfg, TimekeeperClk::TIM_ID);
|
|
||||||
|
|
||||||
let rst_value = TimekeeperClk::clock(clocks).raw() / TICK_HZ as u32 - 1;
|
let rst_value = TimekeeperClk::clock(clocks).raw() / TICK_HZ as u32 - 1;
|
||||||
// Safety: We have a valid instance of the tim peripheral.
|
// Safety: We have a valid instance of the tim peripheral.
|
||||||
timekeeper
|
timekeeper
|
||||||
.rst_value()
|
.rst_value()
|
||||||
.write(|w| unsafe { w.bits(rst_value) });
|
.write(|w| unsafe { w.bits(rst_value) });
|
||||||
//timekeeper
|
timekeeper
|
||||||
//.cnt_value()
|
.cnt_value()
|
||||||
//.write(|w| unsafe { w.bits(rst_value) });
|
.write(|w| unsafe { w.bits(rst_value) });
|
||||||
// Switch on. Timekeeping should always be done.
|
// Switch on. Timekeeping should always be done.
|
||||||
timekeeper.ctrl().modify(|_, w| {
|
|
||||||
w.irq_enb().set_bit();
|
|
||||||
w.enable().set_bit()
|
|
||||||
});
|
|
||||||
unsafe {
|
unsafe {
|
||||||
enable_interrupt(TimekeeperClk::IRQ);
|
enable_interrupt(TimekeeperClk::IRQ);
|
||||||
}
|
}
|
||||||
|
timekeeper.ctrl().modify(|_, w| w.irq_enb().set_bit());
|
||||||
|
timekeeper.enable().write(|w| unsafe { w.bits(1) });
|
||||||
|
|
||||||
enable_tim_clk(syscfg, AlarmClk0::TIM_ID);
|
enable_tim_clk(syscfg, AlarmClk0::TIM_ID);
|
||||||
assert_tim_reset(syscfg, AlarmClk0::TIM_ID);
|
assert_tim_reset_for_two_cycles(syscfg, AlarmClk0::TIM_ID);
|
||||||
cortex_m::asm::nop();
|
|
||||||
cortex_m::asm::nop();
|
|
||||||
deassert_tim_reset(syscfg, AlarmClk0::TIM_ID);
|
|
||||||
|
|
||||||
// Explicitely disable alarm timer until needed.
|
// Explicitely disable alarm timer until needed.
|
||||||
alarm_tim.ctrl().modify(|_, w| {
|
alarm_tim.ctrl().modify(|_, w| {
|
||||||
@ -147,15 +143,12 @@ impl TimerDriverEmbassy {
|
|||||||
let at = alarm.timestamp.get();
|
let at = alarm.timestamp.get();
|
||||||
let t = (period as u64) << 32;
|
let t = (period as u64) << 32;
|
||||||
if at < t + TIMER_MARGIN {
|
if at < t + TIMER_MARGIN {
|
||||||
//let rst_val = alarm_tim(i).rst_value().read().bits();
|
let rst_val = alarm_tim(i).rst_value().read().bits();
|
||||||
// alarm_tim(i).cnt_value()
|
alarm_tim(i)
|
||||||
//alarm_tim(i)
|
.cnt_value()
|
||||||
//.cnt_value()
|
.write(|w| unsafe { w.bits(rst_val) });
|
||||||
//.write(|w| unsafe { w.bits(rst_val) });
|
alarm_tim(i).ctrl().modify(|_, w| w.irq_enb().set_bit());
|
||||||
alarm_tim(i).ctrl().modify(|_, w| {
|
alarm_tim(i).enable().write(|w| unsafe { w.bits(1) })
|
||||||
w.irq_enb().set_bit();
|
|
||||||
w.enable().set_bit()
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@ -271,10 +264,8 @@ impl Driver for TimerDriverEmbassy {
|
|||||||
|
|
||||||
let diff = timestamp - t;
|
let diff = timestamp - t;
|
||||||
if diff < TIMER_MARGIN {
|
if diff < TIMER_MARGIN {
|
||||||
alarm_tim.ctrl().modify(|_, w| {
|
alarm_tim.ctrl().modify(|_, w| w.irq_enb().set_bit());
|
||||||
w.irq_enb().set_bit();
|
alarm_tim.enable().write(|w| unsafe { w.bits(1) });
|
||||||
w.enable().set_bit()
|
|
||||||
});
|
|
||||||
} else {
|
} else {
|
||||||
// If it's too far in the future, don't enable timer yet.
|
// If it's too far in the future, don't enable timer yet.
|
||||||
// It will be enabled later by `next_period`.
|
// It will be enabled later by `next_period`.
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
//! - [Timer MS and Second Tick Example](https://github.com/us-irs/va416xx-rs/blob/main/examples/simple/examples/timer-ticks.rs)
|
//! - [Timer MS and Second Tick Example](https://github.com/us-irs/va416xx-rs/blob/main/examples/simple/examples/timer-ticks.rs)
|
||||||
use core::cell::Cell;
|
use core::cell::Cell;
|
||||||
|
|
||||||
|
use cortex_m::asm;
|
||||||
use critical_section::Mutex;
|
use critical_section::Mutex;
|
||||||
|
|
||||||
use crate::clock::Clocks;
|
use crate::clock::Clocks;
|
||||||
@ -349,6 +350,14 @@ pub fn deassert_tim_reset(syscfg: &mut pac::Sysconfig, tim_id: u8) {
|
|||||||
.modify(|r, w| unsafe { w.bits(r.bits() | (1 << tim_id as u32)) })
|
.modify(|r, w| unsafe { w.bits(r.bits() | (1 << tim_id as u32)) })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
pub fn assert_tim_reset_for_two_cycles(syscfg: &mut pac::Sysconfig, tim_id: u8) {
|
||||||
|
assert_tim_reset(syscfg, tim_id);
|
||||||
|
asm::nop();
|
||||||
|
asm::nop();
|
||||||
|
deassert_tim_reset(syscfg, tim_id);
|
||||||
|
}
|
||||||
|
|
||||||
pub type TimRegBlock = pac::tim0::RegisterBlock;
|
pub type TimRegBlock = pac::tim0::RegisterBlock;
|
||||||
|
|
||||||
/// Register interface.
|
/// Register interface.
|
||||||
|
Loading…
Reference in New Issue
Block a user