Skip to content

Commit 0d914a9

Browse files
ccli8adbridge
authored andcommitted
Add missing delay in lp_ticker
mbed-os-tests-mbed_drivers-lp_ticker/Test multi ticker test fails inconstantly. This commit is mainly to fix the issue.
1 parent f6ac93a commit 0d914a9

File tree

4 files changed

+45
-0
lines changed

4 files changed

+45
-0
lines changed

targets/TARGET_NUVOTON/TARGET_M451/lp_ticker.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,9 @@ static int ticker_inited = 0;
4747
#define TMR_CMP_MIN 2
4848
#define TMR_CMP_MAX 0xFFFFFFu
4949

50+
/* NOTE: When system clock is higher than timer clock, we need to add 3 engine clock
51+
* (recommended by designer) delay to wait for above timer control to take effect. */
52+
5053
void lp_ticker_init(void)
5154
{
5255
if (ticker_inited) {
@@ -75,20 +78,24 @@ void lp_ticker_init(void)
7578
// Continuous mode
7679
// NOTE: TIMER_CTL_CNTDATEN_Msk exists in NUC472, but not in M451. In M451, TIMER_CNT is updated continuously by default.
7780
timer_base->CTL = TIMER_CONTINUOUS_MODE | prescale_timer/* | TIMER_CTL_CNTDATEN_Msk*/;
81+
wait_us((NU_US_PER_SEC / NU_TMRCLK_PER_SEC) * 3);
7882

7983
timer_base->CMP = cmp_timer;
84+
wait_us((NU_US_PER_SEC / NU_TMRCLK_PER_SEC) * 3);
8085

8186
// Set vector
8287
NVIC_SetVector(TIMER_MODINIT.irq_n, (uint32_t) TIMER_MODINIT.var);
8388

8489
NVIC_EnableIRQ(TIMER_MODINIT.irq_n);
8590

8691
TIMER_EnableInt(timer_base);
92+
wait_us((NU_US_PER_SEC / NU_TMRCLK_PER_SEC) * 3);
8793

8894
TIMER_EnableWakeup(timer_base);
8995
wait_us((NU_US_PER_SEC / NU_TMRCLK_PER_SEC) * 3);
9096

9197
TIMER_Start(timer_base);
98+
wait_us((NU_US_PER_SEC / NU_TMRCLK_PER_SEC) * 3);
9299

93100
/* Wait for timer to start counting and raise active flag */
94101
while(! (timer_base->CTL & TIMER_CTL_ACTSTS_Msk));
@@ -129,11 +136,13 @@ void lp_ticker_set_interrupt(timestamp_t timestamp)
129136
void lp_ticker_disable_interrupt(void)
130137
{
131138
TIMER_DisableInt((TIMER_T *) NU_MODBASE(TIMER_MODINIT.modname));
139+
wait_us((NU_US_PER_SEC / NU_TMRCLK_PER_SEC) * 3);
132140
}
133141

134142
void lp_ticker_clear_interrupt(void)
135143
{
136144
TIMER_ClearIntFlag((TIMER_T *) NU_MODBASE(TIMER_MODINIT.modname));
145+
wait_us((NU_US_PER_SEC / NU_TMRCLK_PER_SEC) * 3);
137146
}
138147

139148
void lp_ticker_fire_interrupt(void)
@@ -155,8 +164,10 @@ const ticker_info_t* lp_ticker_get_info()
155164
static void tmr1_vec(void)
156165
{
157166
TIMER_ClearIntFlag((TIMER_T *) NU_MODBASE(TIMER_MODINIT.modname));
167+
wait_us((NU_US_PER_SEC / NU_TMRCLK_PER_SEC) * 3);
158168

159169
TIMER_ClearWakeupFlag((TIMER_T *) NU_MODBASE(TIMER_MODINIT.modname));
170+
wait_us((NU_US_PER_SEC / NU_TMRCLK_PER_SEC) * 3);
160171

161172
// NOTE: lp_ticker_set_interrupt() may get called in lp_ticker_irq_handler();
162173
lp_ticker_irq_handler();

targets/TARGET_NUVOTON/TARGET_M480/lp_ticker.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,9 @@ static int ticker_inited = 0;
4747
#define TMR_CMP_MIN 2
4848
#define TMR_CMP_MAX 0xFFFFFFu
4949

50+
/* NOTE: When system clock is higher than timer clock, we need to add 3 engine clock
51+
* (recommended by designer) delay to wait for above timer control to take effect. */
52+
5053
void lp_ticker_init(void)
5154
{
5255
if (ticker_inited) {
@@ -75,20 +78,24 @@ void lp_ticker_init(void)
7578
// Continuous mode
7679
// NOTE: TIMER_CTL_CNTDATEN_Msk exists in NUC472, but not in M451/M480. In M451/M480, TIMER_CNT is updated continuously by default.
7780
timer_base->CTL = TIMER_CONTINUOUS_MODE | prescale_timer/* | TIMER_CTL_CNTDATEN_Msk*/;
81+
wait_us((NU_US_PER_SEC / NU_TMRCLK_PER_SEC) * 3);
7882

7983
timer_base->CMP = cmp_timer;
84+
wait_us((NU_US_PER_SEC / NU_TMRCLK_PER_SEC) * 3);
8085

8186
// Set vector
8287
NVIC_SetVector(TIMER_MODINIT.irq_n, (uint32_t) TIMER_MODINIT.var);
8388

8489
NVIC_EnableIRQ(TIMER_MODINIT.irq_n);
8590

8691
TIMER_EnableInt(timer_base);
92+
wait_us((NU_US_PER_SEC / NU_TMRCLK_PER_SEC) * 3);
8793

8894
TIMER_EnableWakeup(timer_base);
8995
wait_us((NU_US_PER_SEC / NU_TMRCLK_PER_SEC) * 3);
9096

9197
TIMER_Start(timer_base);
98+
wait_us((NU_US_PER_SEC / NU_TMRCLK_PER_SEC) * 3);
9299

93100
/* Wait for timer to start counting and raise active flag */
94101
while(! (timer_base->CTL & TIMER_CTL_ACTSTS_Msk));
@@ -129,11 +136,13 @@ void lp_ticker_set_interrupt(timestamp_t timestamp)
129136
void lp_ticker_disable_interrupt(void)
130137
{
131138
TIMER_DisableInt((TIMER_T *) NU_MODBASE(TIMER_MODINIT.modname));
139+
wait_us((NU_US_PER_SEC / NU_TMRCLK_PER_SEC) * 3);
132140
}
133141

134142
void lp_ticker_clear_interrupt(void)
135143
{
136144
TIMER_ClearIntFlag((TIMER_T *) NU_MODBASE(TIMER_MODINIT.modname));
145+
wait_us((NU_US_PER_SEC / NU_TMRCLK_PER_SEC) * 3);
137146
}
138147

139148
void lp_ticker_fire_interrupt(void)
@@ -155,8 +164,10 @@ const ticker_info_t* lp_ticker_get_info()
155164
static void tmr1_vec(void)
156165
{
157166
TIMER_ClearIntFlag((TIMER_T *) NU_MODBASE(TIMER_MODINIT.modname));
167+
wait_us((NU_US_PER_SEC / NU_TMRCLK_PER_SEC) * 3);
158168

159169
TIMER_ClearWakeupFlag((TIMER_T *) NU_MODBASE(TIMER_MODINIT.modname));
170+
wait_us((NU_US_PER_SEC / NU_TMRCLK_PER_SEC) * 3);
160171

161172
// NOTE: lp_ticker_set_interrupt() may get called in lp_ticker_irq_handler();
162173
lp_ticker_irq_handler();

targets/TARGET_NUVOTON/TARGET_NANO100/lp_ticker.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,9 @@ static int ticker_inited = 0;
4949
#define TMR_CMP_MIN 2
5050
#define TMR_CMP_MAX 0xFFFFFFu
5151

52+
/* NOTE: When system clock is higher than timer clock, we need to add 3 engine clock
53+
* (recommended by designer) delay to wait for above timer control to take effect. */
54+
5255
void lp_ticker_init(void)
5356
{
5457
if (ticker_inited) {
@@ -76,22 +79,27 @@ void lp_ticker_init(void)
7679
MBED_ASSERT(cmp_timer >= TMR_CMP_MIN && cmp_timer <= TMR_CMP_MAX);
7780
// Continuous mode
7881
timer_base->CTL = TIMER_CONTINUOUS_MODE;
82+
wait_us((NU_US_PER_SEC / NU_TMRCLK_PER_SEC) * 3);
7983

8084
timer_base->PRECNT = prescale_timer;
85+
wait_us((NU_US_PER_SEC / NU_TMRCLK_PER_SEC) * 3);
8186

8287
timer_base->CMPR = cmp_timer;
88+
wait_us((NU_US_PER_SEC / NU_TMRCLK_PER_SEC) * 3);
8389

8490
// Set vector
8591
NVIC_SetVector(TIMER_MODINIT.irq_n, (uint32_t) TIMER_MODINIT.var);
8692

8793
NVIC_EnableIRQ(TIMER_MODINIT.irq_n);
8894

8995
TIMER_EnableInt(timer_base);
96+
wait_us((NU_US_PER_SEC / NU_TMRCLK_PER_SEC) * 3);
9097

9198
TIMER_EnableWakeup(timer_base);
9299
wait_us((NU_US_PER_SEC / NU_TMRCLK_PER_SEC) * 3);
93100

94101
TIMER_Start(timer_base);
102+
wait_us((NU_US_PER_SEC / NU_TMRCLK_PER_SEC) * 3);
95103

96104
/* Wait for timer to start counting and raise active flag */
97105
while(! (timer_base->CTL & TIMER_CTL_TMR_ACT_Msk));
@@ -132,11 +140,13 @@ void lp_ticker_set_interrupt(timestamp_t timestamp)
132140
void lp_ticker_disable_interrupt(void)
133141
{
134142
TIMER_DisableInt((TIMER_T *) NU_MODBASE(TIMER_MODINIT.modname));
143+
wait_us((NU_US_PER_SEC / NU_TMRCLK_PER_SEC) * 3);
135144
}
136145

137146
void lp_ticker_clear_interrupt(void)
138147
{
139148
TIMER_ClearIntFlag((TIMER_T *) NU_MODBASE(TIMER_MODINIT.modname));
149+
wait_us((NU_US_PER_SEC / NU_TMRCLK_PER_SEC) * 3);
140150
}
141151

142152
void lp_ticker_fire_interrupt(void)
@@ -158,8 +168,10 @@ const ticker_info_t* lp_ticker_get_info()
158168
void TMR1_IRQHandler(void)
159169
{
160170
TIMER_ClearIntFlag((TIMER_T *) NU_MODBASE(TIMER_MODINIT.modname));
171+
wait_us((NU_US_PER_SEC / NU_TMRCLK_PER_SEC) * 3);
161172

162173
TIMER_ClearWakeupFlag((TIMER_T *) NU_MODBASE(TIMER_MODINIT.modname));
174+
wait_us((NU_US_PER_SEC / NU_TMRCLK_PER_SEC) * 3);
163175

164176
// NOTE: lp_ticker_set_interrupt() may get called in lp_ticker_irq_handler();
165177
lp_ticker_irq_handler();

targets/TARGET_NUVOTON/TARGET_NUC472/lp_ticker.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,9 @@ static int ticker_inited = 0;
4747
#define TMR_CMP_MIN 2
4848
#define TMR_CMP_MAX 0xFFFFFFu
4949

50+
/* NOTE: When system clock is higher than timer clock, we need to add 3 engine clock
51+
* (recommended by designer) delay to wait for above timer control to take effect. */
52+
5053
void lp_ticker_init(void)
5154
{
5255
if (ticker_inited) {
@@ -74,20 +77,24 @@ void lp_ticker_init(void)
7477
MBED_ASSERT(cmp_timer >= TMR_CMP_MIN && cmp_timer <= TMR_CMP_MAX);
7578
// Continuous mode
7679
timer_base->CTL = TIMER_CONTINUOUS_MODE | prescale_timer | TIMER_CTL_CNTDATEN_Msk;
80+
wait_us((NU_US_PER_SEC / NU_TMRCLK_PER_SEC) * 3);
7781

7882
timer_base->CMP = cmp_timer;
83+
wait_us((NU_US_PER_SEC / NU_TMRCLK_PER_SEC) * 3);
7984

8085
// Set vector
8186
NVIC_SetVector(TIMER_MODINIT.irq_n, (uint32_t) TIMER_MODINIT.var);
8287

8388
NVIC_EnableIRQ(TIMER_MODINIT.irq_n);
8489

8590
TIMER_EnableInt(timer_base);
91+
wait_us((NU_US_PER_SEC / NU_TMRCLK_PER_SEC) * 3);
8692

8793
TIMER_EnableWakeup(timer_base);
8894
wait_us((NU_US_PER_SEC / NU_TMRCLK_PER_SEC) * 3);
8995

9096
TIMER_Start(timer_base);
97+
wait_us((NU_US_PER_SEC / NU_TMRCLK_PER_SEC) * 3);
9198

9299
/* Wait for timer to start counting and raise active flag */
93100
while(! (timer_base->CTL & TIMER_CTL_ACTSTS_Msk));
@@ -128,11 +135,13 @@ void lp_ticker_set_interrupt(timestamp_t timestamp)
128135
void lp_ticker_disable_interrupt(void)
129136
{
130137
TIMER_DisableInt((TIMER_T *) NU_MODBASE(TIMER_MODINIT.modname));
138+
wait_us((NU_US_PER_SEC / NU_TMRCLK_PER_SEC) * 3);
131139
}
132140

133141
void lp_ticker_clear_interrupt(void)
134142
{
135143
TIMER_ClearIntFlag((TIMER_T *) NU_MODBASE(TIMER_MODINIT.modname));
144+
wait_us((NU_US_PER_SEC / NU_TMRCLK_PER_SEC) * 3);
136145
}
137146

138147
void lp_ticker_fire_interrupt(void)
@@ -154,8 +163,10 @@ const ticker_info_t* lp_ticker_get_info()
154163
static void tmr1_vec(void)
155164
{
156165
TIMER_ClearIntFlag((TIMER_T *) NU_MODBASE(TIMER_MODINIT.modname));
166+
wait_us((NU_US_PER_SEC / NU_TMRCLK_PER_SEC) * 3);
157167

158168
TIMER_ClearWakeupFlag((TIMER_T *) NU_MODBASE(TIMER_MODINIT.modname));
169+
wait_us((NU_US_PER_SEC / NU_TMRCLK_PER_SEC) * 3);
159170

160171
// NOTE: lp_ticker_set_interrupt() may get called in lp_ticker_irq_handler();
161172
lp_ticker_irq_handler();

0 commit comments

Comments
 (0)