mirror of
https://github.com/RIOT-OS/RIOT.git
synced 2024-12-29 04:50:03 +01:00
cpu/sam0_common: timer: implement TIM_FLAG_SET_STOPPED flag
This commit is contained in:
parent
3d252bfba3
commit
79698d674b
@ -110,27 +110,21 @@ static uint8_t _get_prescaler(uint32_t freq_out, uint32_t freq_in)
|
|||||||
/* TOP value is CC0 */
|
/* TOP value is CC0 */
|
||||||
static inline void _set_mfrq(tim_t tim)
|
static inline void _set_mfrq(tim_t tim)
|
||||||
{
|
{
|
||||||
timer_stop(tim);
|
|
||||||
wait_synchronization(tim);
|
|
||||||
#ifdef TC_WAVE_WAVEGEN_MFRQ
|
#ifdef TC_WAVE_WAVEGEN_MFRQ
|
||||||
dev(tim)->WAVE.reg = TC_WAVE_WAVEGEN_MFRQ;
|
dev(tim)->WAVE.reg = TC_WAVE_WAVEGEN_MFRQ;
|
||||||
#else
|
#else
|
||||||
dev(tim)->CTRLA.bit.WAVEGEN = TC_CTRLA_WAVEGEN_MFRQ_Val;
|
dev(tim)->CTRLA.bit.WAVEGEN = TC_CTRLA_WAVEGEN_MFRQ_Val;
|
||||||
#endif
|
#endif
|
||||||
timer_start(tim);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TOP value is MAX timer value */
|
/* TOP value is MAX timer value */
|
||||||
static inline void _set_nfrq(tim_t tim)
|
static inline void _set_nfrq(tim_t tim)
|
||||||
{
|
{
|
||||||
timer_stop(tim);
|
|
||||||
wait_synchronization(tim);
|
|
||||||
#ifdef TC_WAVE_WAVEGEN_NFRQ
|
#ifdef TC_WAVE_WAVEGEN_NFRQ
|
||||||
dev(tim)->WAVE.reg = TC_WAVE_WAVEGEN_NFRQ;
|
dev(tim)->WAVE.reg = TC_WAVE_WAVEGEN_NFRQ;
|
||||||
#else
|
#else
|
||||||
dev(tim)->CTRLA.bit.WAVEGEN = TC_CTRLA_WAVEGEN_NFRQ_Val;
|
dev(tim)->CTRLA.bit.WAVEGEN = TC_CTRLA_WAVEGEN_NFRQ_Val;
|
||||||
#endif
|
#endif
|
||||||
timer_start(tim);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -242,9 +236,12 @@ int timer_set_periodic(tim_t tim, int channel, unsigned int value, uint8_t flags
|
|||||||
{
|
{
|
||||||
DEBUG("Setting timer %i channel %i to %i (repeating)\n", tim, channel, value);
|
DEBUG("Setting timer %i channel %i to %i (repeating)\n", tim, channel, value);
|
||||||
|
|
||||||
|
timer_stop(tim);
|
||||||
|
|
||||||
/* set timeout value */
|
/* set timeout value */
|
||||||
switch (channel) {
|
switch (channel) {
|
||||||
case 0:
|
case 0:
|
||||||
|
/* clear interrupt */
|
||||||
dev(tim)->INTFLAG.reg = TC_INTFLAG_MC0;
|
dev(tim)->INTFLAG.reg = TC_INTFLAG_MC0;
|
||||||
|
|
||||||
if (flags & TIM_FLAG_RESET_ON_MATCH) {
|
if (flags & TIM_FLAG_RESET_ON_MATCH) {
|
||||||
@ -276,6 +273,10 @@ int timer_set_periodic(tim_t tim, int channel, unsigned int value, uint8_t flags
|
|||||||
dev(tim)->COUNT.reg = 0;
|
dev(tim)->COUNT.reg = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!(flags & TIM_FLAG_SET_STOPPED)) {
|
||||||
|
timer_start(tim);
|
||||||
|
}
|
||||||
|
|
||||||
clear_oneshot(tim, channel);
|
clear_oneshot(tim, channel);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -328,10 +329,12 @@ unsigned int timer_read(tim_t tim)
|
|||||||
void timer_stop(tim_t tim)
|
void timer_stop(tim_t tim)
|
||||||
{
|
{
|
||||||
dev(tim)->CTRLA.bit.ENABLE = 0;
|
dev(tim)->CTRLA.bit.ENABLE = 0;
|
||||||
|
wait_synchronization(tim);
|
||||||
}
|
}
|
||||||
|
|
||||||
void timer_start(tim_t tim)
|
void timer_start(tim_t tim)
|
||||||
{
|
{
|
||||||
|
wait_synchronization(tim);
|
||||||
dev(tim)->CTRLA.bit.ENABLE = 1;
|
dev(tim)->CTRLA.bit.ENABLE = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user